Mujoco KDL Wrapper  0.5.1
MuJoCo + KDL bridge for robot kinematics and dynamics
Loading...
Searching...
No Matches
ex_gravity_comp.cpp
Go to the documentation of this file.
1/* ex_gravity_comp.cpp
2 * KDL gravity compensation on the Kinova GEN3: each step commands
3 * KDL::ChainDynParam::JntToGravity in TORQUE mode, keeping the arm at its home pose.
4 *
5 * Usage:
6 * ex_gravity_comp [--headless]
7 *
8 * Runs 15 s (7500 steps) and prints the EE drift; --headless skips the viewer and exits 1 if
9 * the drift exceeds kMaxDrift. */
10
11#include "common.hpp"
12#include "example_paths.hpp"
13
14#include <iomanip>
15#include <iostream>
16#include <string>
17
18namespace ex = mj_kdl_examples;
19
20static constexpr int kSteps = 7500; // 15 s
21static constexpr double kMaxDrift = 0.0001; // [m]
22
23int main(int argc, char *argv[])
24{
25 const bool headless = ex::parse_args(argc, argv).headless;
26
29 r.path = ex::asset("kinova_gen3/gen3.xml");
30 sc.robots.push_back(r);
31
32 mj_kdl::Env env;
33 mj_kdl::Robot robot;
34 if (!mj_kdl::init_env(&env, &sc)) return 1;
35 if (!mj_kdl::init_robot_from_mjcf(&robot, &env, "base_link", "bracelet_link")) return 1;
37
38 const unsigned n = robot.chain.getNrOfJoints();
40 KDL::ChainDynParam dyn(robot.chain, KDL::Vector(0.0, 0.0, sc.gravity_z));
41 const KDL::JntArray q_home = ex::home_q(n);
42
43 env.on_reset = [&](mj_kdl::ResetContext *) {
44 mj_kdl::set_joint_pos(&robot, q_home);
45 ex::prime_gravity(robot, dyn, q_home);
46 };
47 mj_kdl::reset(&env);
48 if (!headless && !mj_kdl::open_viewer(&env)) return 1;
49
50 KDL::Frame ee_start;
51 fk.JntToCart(q_home, ee_start);
52 for (int step = 0; step < kSteps; ++step) {
53 mj_kdl::update(&env);
54 ex::pd_gravity(robot, dyn, q_home);
55 if (!mj_kdl::step(&env)) break;
57 }
58 mj_kdl::update(&env);
59
60 const double drift = (ex::tcp_frame(fk, robot).p - ee_start.p).Norm();
61 std::cout << "EE drift after " << kSteps << " steps: " << std::fixed << std::setprecision(4)
62 << drift * 1000.0 << " mm (limit " << kMaxDrift * 1000.0 << " mm)\n";
63 mj_kdl::cleanup(&env);
64 return headless ? ex::verdict(drift <= kMaxDrift, "the arm holds its pose") : 0;
65}
virtual int JntToCart(const JntArray &q_in, Frame &p_out, int segmentNr=-1)
unsigned int getNrOfJoints() const
int main(int argc, char *argv[])
ResetInfo reset(Env *env, const ResetOptions *options=nullptr)
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)
void cleanup(Robot *r)
Status open_viewer(Env *env, const char *title="MuJoCo")
void pace_realtime(Env *env)
std::string asset(const fs::path &relative)
int verdict(bool ok, const std::string &goal)
Definition common.hpp:58
mj_kdl::SceneSpec scene_spec()
Definition common.hpp:138
KDL::Frame tcp_frame(KDL::ChainFkSolverPos_recursive &fk, const mj_kdl::Robot &robot)
Definition common.hpp:102
KDL::JntArray home_q(unsigned n)
Definition common.hpp:68
void pd_gravity(mj_kdl::Robot &robot, KDL::ChainDynParam &dyn, const KDL::JntArray &q_des, const double *kp=nullptr, const double *kd=nullptr)
Definition common.hpp:112
void prime_gravity(mj_kdl::Robot &robot, KDL::ChainDynParam &dyn, const KDL::JntArray &q)
Definition common.hpp:131
Args parse_args(int argc, char **argv, const std::string &default_record_path="")
Definition common.hpp:41
ResetHook on_reset
std::vector< RobotSpec > robots