27static constexpr double kHomePose[7] = { 0.0, 0.2618, 3.1416, -2.2689, 0.0, 0.9599, 1.5708 };
119 mj_forward(model, data);
121 KDL::JntArray g1(n), g2(n);
122 dyn1->JntToGravity(q_home, g1);
123 dyn2->JntToGravity(q_home, g2);
125 double err1 = 0.0, err2 = 0.0;
126 for (
int j = 0; j < n; ++j) {
127 err1 = std::max(err1, std::abs(g1(j) - data->qfrc_bias[arm1.kdl_to_mj_dof[j]]));
128 err2 = std::max(err2, std::abs(g2(j) - data->qfrc_bias[arm2.kdl_to_mj_dof[j]]));
130 TEST_INFO(
"arm1 max |KDL - qfrc_bias| = " << err1 <<
" Nm");
131 TEST_INFO(
"arm2 max |KDL - qfrc_bias| = " << err2 <<
" Nm");
139 mj_forward(model, data);
143 KDL::Frame ee1_init, ee2_init;
144 fk1->JntToCart(q_home, ee1_init);
145 fk2->JntToCart(q_home, ee2_init);
148 "Arm 1 initial EE: [" << std::fixed << std::setprecision(4) << ee1_init.p.x() <<
", "
149 << ee1_init.p.y() <<
", " << ee1_init.p.z() <<
"]"
152 "Arm 2 initial EE: [" << ee2_init.p.x() <<
", " << ee2_init.p.y() <<
", " << ee2_init.p.z()
160 KDL::JntArray g1(n), g2(n);
161 dyn1->JntToGravity(q_home, g1);
162 dyn2->JntToGravity(q_home, g2);
163 for (
int j = 0; j < n; ++j) arm1.jnt_trq_cmd[j] = g1(j);
164 for (
int j = 0; j < n; ++j) arm2.jnt_trq_cmd[j] = g2(j);
169 for (
int i = 0; i < 500; ++i) {
170 apply_grav_comp(&arm1, *dyn1);
171 apply_grav_comp(&arm2, *dyn2);
175 KDL::JntArray q1_end(n), q2_end(n);
176 for (
int j = 0; j < n; ++j) {
177 q1_end(j) = arm1.jnt_pos_msr[j];
178 q2_end(j) = arm2.jnt_pos_msr[j];
180 KDL::Frame ee1_end, ee2_end;
181 fk1->JntToCart(q1_end, ee1_end);
182 fk2->JntToCart(q2_end, ee2_end);
184 double drift1 = (ee1_init.p - ee1_end.p).Norm();
185 double drift2 = (ee2_init.p - ee2_end.p).Norm();
188 "EE drift after 500 steps: arm1=" << std::setprecision(3) << drift1 * 1000.0
189 <<
" mm arm2=" << drift2 * 1000.0 <<
" mm"
192 ASSERT_LE(drift1, 0.001) <<
"arm1 drift " << drift1 * 1000.0 <<
" mm exceeds 1 mm threshold";
193 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 char *tool_body=nullptr)