27static constexpr double kHomePose[7] = { 0.0, 0.2618, 3.1416, -2.2689, 0.0, 0.9599, 1.5708 };
30static constexpr double kKp[7] = { 100, 200, 100, 200, 100, 200, 100 };
31static constexpr double kKd[7] = { 10, 20, 10, 20, 10, 20, 10 };
37int main(
int argc,
char *argv[])
39 bool headless =
false;
40 for (
int i = 1; i < argc; ++i)
41 if (std::string(argv[i]) ==
"--headless") headless =
true;
43 const fs::path root = repo_root();
44 if (!fs::exists(root /
"third_party/menagerie")) {
45 std::cerr <<
"third_party/menagerie/ not found - run: "
46 "git submodule update --init third_party/menagerie\n";
50 const std::string arm_mjcf = (root /
"third_party/menagerie/kinova_gen3/gen3.xml").
string();
51 const std::string grp_mjcf = (root /
"third_party/menagerie/robotiq_2f85/2f85.xml").
string();
57 gs.
pos[2] = -0.061525;
61 rs.
path = arm_mjcf.c_str();
67 mjModel *model =
nullptr;
68 mjData *data =
nullptr;
70 std::cerr <<
"build_scene() failed\n";
76 &robot, model, data,
"base_link",
"bracelet_link",
"",
"g_base"
78 std::cerr <<
"init_robot_from_mjcf() failed\n";
83 unsigned n = robot.
chain.getNrOfJoints();
84 int fingers_act = mj_name2id(model, mjOBJ_ACTUATOR,
"g_fingers_actuator");
85 int key_id = mj_name2id(model, mjOBJ_KEY,
"home");
87 KDL::ChainDynParam dyn(robot.
chain, KDL::Vector(0.0, 0.0, -9.81));
88 KDL::JntArray q_home(n), q(n), g(n);
89 for (
unsigned i = 0; i < n; ++i) q_home(i) = kHomePose[i];
93 auto seed_reset_state = [&](mjData *d) {
94 for (
unsigned i = 0; i < n; ++i) {
100 if (fingers_act >= 0) d->ctrl[fingers_act] = 255.0;
103 auto reset_to_home = [&](mjData *d) {
105 mj_resetDataKeyframe(model, d, key_id);
107 mj_resetData(model, d);
110 mj_forward(model, d);
116 double prev_sim_time = data->time;
126 auto step_impedance = [&]() {
131 if (data->time < prev_sim_time - 1e-6) {
134 prev_sim_time = data->time;
137 prev_sim_time = data->time;
139 for (
unsigned i = 0; i < n; ++i) q(i) = robot.
jnt_pos_msr[i];
140 dyn.JntToGravity(q, g);
141 for (
unsigned i = 0; i < n; ++i) {
145 data->ctrl[fingers_act] = (std::fmod(data->time, 6.0) < 3.0) ? 255.0 : 0.0;
149 KDL::ChainFkSolverPos_recursive fk(robot.
chain);
151 for (
unsigned i = 0; i < n; ++i) q0(i) = robot.
jnt_pos_cmd[i];
153 fk.JntToCart(q0, ee_start);
155 for (
int step = 0; step < 200; ++step) {
160 KDL::JntArray q_end(n);
161 for (
unsigned i = 0; i < n; ++i) q_end(i) = robot.
jnt_pos_msr[i];
163 fk.JntToCart(q_end, ee_end);
164 double drift = (ee_start.p - ee_end.p).Norm();
165 std::cout <<
"EE drift after 200 steps: " << std::fixed << std::setprecision(3)
166 << drift * 1000.0 <<
" mm\n";
170 std::cerr <<
"init_window_sim() failed\n";
bool init_robot_from_mjcf(Robot *r, mjModel *model, mjData *data, const char *base_body, const char *tip_body, const char *prefix="", const char *tool_body=nullptr)