Mujoco KDL Wrapper  0.5.1
MuJoCo + KDL bridge for robot kinematics and dynamics
Loading...
Searching...
No Matches
test_mjcf_vel_ctrl.cpp
Go to the documentation of this file.
1/* test_mjcf_vel_ctrl.cpp
2 * VELOCITY mode on the Kinova GEN3: the <joint>_velocity actuators added through
3 * RobotSpec::modes drive the arm from home to a target under a clamped proportional velocity
4 * command, as ex_joint_ctrl's second motion does. */
5
7#include "common.hpp"
8#include "example_paths.hpp"
9
10#include <gtest/gtest.h>
11
12#include <algorithm>
13#include <cmath>
14#include <filesystem>
15#include <string>
16
17namespace ex = mj_kdl_examples;
18namespace fs = std::filesystem;
19
20static constexpr double kTargetPose[7] = { 0.3, 0.5, 2.9, -2.0, 0.3, 1.2, 1.3 };
21static constexpr double kVelGain = 500.0; // velocity actuator kv [Nm s/rad]
22static constexpr double kKv = 2.0; // [rad/s per rad]
23static constexpr double kMaxVel = 0.6; // [rad/s]
24static constexpr double kTol = 0.01; // [rad]
25static constexpr double kTimeout = 5.0; // [s]
26
27TEST(MjcfVelCtrlTest, ConvergesInVelocityMode)
28{
29 const std::string arm = ex::find_asset("kinova_gen3/gen3.xml");
30 if (!fs::exists(arm)) GTEST_SKIP() << arm << " not found";
31
33 rs.path = arm;
34 rs.modes = { { .mode = mj_kdl::CtrlMode::VELOCITY, .joints = {}, .kv = kVelGain } };
36 sc.timestep = 0.002;
37 sc.add_floor = true;
38 sc.add_skybox = false;
39 sc.robots.push_back(rs);
40
41 mj_kdl::Env env;
42 mj_kdl::Robot robot;
43 ASSERT_TRUE(mj_kdl::init_env(&env, &sc));
44 ASSERT_TRUE(mj_kdl::init_robot_from_mjcf(&robot, &env, "base_link", "bracelet_link"));
47
48 double max_err = 0.0;
49 while (env.data->time < kTimeout) {
50 mj_kdl::update(&env);
51 max_err = 0.0;
52 for (int i = 0; i < 7; ++i) {
53 const double err = kTargetPose[i] - robot.jnt_pos_msr[i];
54 max_err = std::max(max_err, std::abs(err));
55 robot.jnt_vel_cmd[i] = ex::clamp_abs(kKv * err, kMaxVel);
56 }
57 if (max_err < kTol) break;
58 mj_kdl::step(&env);
59 }
60 EXPECT_LT(max_err, kTol);
61 EXPECT_LT(env.data->time, 2.5) << "measured 1.93 s";
62}
63
64int main(int argc, char *argv[])
65{
66 testing::InitGoogleTest(&argc, argv);
67 return RUN_ALL_TESTS();
68}
Status init_env(Env *env, const SceneSpec *spec)
void update(Env *env)
bool step(Env *env)
Status set_control_mode(Robot *r, CtrlMode mode)
Status init_robot_from_mjcf(Robot *r, Env *env, const char *base_body, const char *tip_body, const char *prefix="", const ToolFrameSpec *tool=nullptr)
void set_joint_pos(Robot *r, const KDL::JntArray &q)
double clamp_abs(double v, double limit)
Definition common.hpp:66
std::string find_asset(const fs::path &relative)
KDL::JntArray home_q(unsigned n)
Definition common.hpp:68
std::vector< double > jnt_vel_cmd
std::vector< double > jnt_pos_msr
std::vector< CtrlModeSpec > modes
std::vector< RobotSpec > robots
int main(int argc, char *argv[])
TEST(MjcfVelCtrlTest, ConvergesInVelocityMode)