24static constexpr double kHomePose[7] = { 0.0, 0.2618, 3.1416, -2.2689, 0.0, 0.9599, 1.5708 };
107 mj_forward(model, data);
109 KDL::JntArray g1(n), g2(n);
110 dyn1->JntToGravity(q_home, g1);
111 dyn2->JntToGravity(q_home, g2);
113 double err1 = 0.0, err2 = 0.0;
114 for (
int j = 0; j < n; ++j) {
115 err1 = std::max(err1, std::abs(g1(j) - data->qfrc_bias[arm1.kdl_to_mj_dof[j]]));
116 err2 = std::max(err2, std::abs(g2(j) - data->qfrc_bias[arm2.kdl_to_mj_dof[j]]));
118 (void)err1; (void)err2;
126 mj_forward(model, data);
130 KDL::Frame ee1_init, ee2_init;
131 fk1->JntToCart(q_home, ee1_init);
132 fk2->JntToCart(q_home, ee2_init);
138 KDL::JntArray g1(n), g2(n);
139 dyn1->JntToGravity(q_home, g1);
140 dyn2->JntToGravity(q_home, g2);
141 for (
int j = 0; j < n; ++j) arm1.jnt_trq_cmd[j] = g1(j);
142 for (
int j = 0; j < n; ++j) arm2.jnt_trq_cmd[j] = g2(j);
147 for (
int i = 0; i < 500; ++i) {
148 apply_grav_comp(&arm1, *dyn1);
149 apply_grav_comp(&arm2, *dyn2);
153 KDL::JntArray q1_end(n), q2_end(n);
154 for (
int j = 0; j < n; ++j) {
155 q1_end(j) = arm1.jnt_pos_msr[j];
156 q2_end(j) = arm2.jnt_pos_msr[j];
158 KDL::Frame ee1_end, ee2_end;
159 fk1->JntToCart(q1_end, ee1_end);
160 fk2->JntToCart(q2_end, ee2_end);
162 double drift1 = (ee1_init.p - ee1_end.p).Norm();
163 double drift2 = (ee2_init.p - ee2_end.p).Norm();
165 ASSERT_LE(drift1, 0.001) <<
"arm1 drift " << drift1 * 1000.0 <<
" mm exceeds 1 mm threshold";
166 ASSERT_LE(drift2, 0.001) <<
"arm2 drift " << drift2 * 1000.0 <<
" mm exceeds 1 mm threshold";
bool init_robot_from_mjcf(Robot *r, mjModel *model, mjData *data, const char *base_body, const char *tip_body, const char *prefix="", const ToolFrameSpec *tool=nullptr)