2 #include <gtest/gtest.h> 6 #include <rdl_msgs/ChangeWrenchArrayFrameRequest.h> 13 #include "rdl_msgs/ChangePoseFrame.h" 14 #include "rdl_msgs/ChangePointFrame.h" 15 #include "rdl_msgs/ChangeOrientationFrame.h" 16 #include "rdl_msgs/ChangePointArrayFrame.h" 17 #include "rdl_msgs/Change3DVectorFrame.h" 18 #include "rdl_msgs/Change3DVectorArrayFrame.h" 19 #include "rdl_msgs/ChangeTwistFrame.h" 20 #include "rdl_msgs/ChangeTwistArrayFrame.h" 21 #include "rdl_msgs/ChangeWrenchArrayFrame.h" 22 #include "rdl_msgs/ChangeWrenchFrame.h" 23 #include "rdl_msgs/GetTransform.h" 24 #include "rdl_msgs/GetTwist.h" 25 #include "rdl_msgs/GetBodyGravityWrench.h" 26 #include "rdl_msgs/GetRobotCenterOfMass.h" 27 #include "rdl_msgs/RobotState.h" 62 for (
int i = 0; i < q.size(); i++)
64 q[i] = 0.4 * M_PI *
static_cast<double>(rand()) / static_cast<double>(RAND_MAX);
68 orient = model->GetQuaternion(2, q);
70 model->SetQuaternion(2, orient, q);
72 for (
int i = 0; i < qdot.size(); i++)
74 qdot[i] = 0.5 * M_PI *
static_cast<double>(rand()) / static_cast<double>(RAND_MAX);
77 for (
int i = 0; i < q.size(); i++)
79 robot_state_msg.position.push_back(q[i]);
82 for (
int i = 0; i < qdot.size(); i++)
84 robot_state_msg.velocity.push_back(qdot[i]);
90 for (
unsigned int i = 0; i < n_pubs; i++)
92 robot_state_publisher.
publish(robot_state_msg);
99 unsigned int total_usec = 0;
100 while (robot_state_publisher.
getNumSubscribers() == 0 && total_usec < usec_timeout)
110 std::string robot_description;
112 ASSERT_TRUE(
p_nh.
getParam(
"robot_description", robot_description));
117 q = RobotDynamics::Math::VectorNd::Zero(
model->q_size);
118 qdot = RobotDynamics::Math::VectorNd::Zero(
model->qdot_size);
134 rdl_msgs::ChangePoseFrameRequest pose_msg_req;
135 rdl_msgs::ChangePoseFrameResponse pose_msg_resp;
136 pose_msg_req.new_reference_frame =
"world";
137 pose_msg_req.pose_in.header.frame_id =
"test_link2";
138 pose_msg_req.pose_in.pose.orientation.x = o.
x();
139 pose_msg_req.pose_in.pose.orientation.y = o.
y();
140 pose_msg_req.pose_in.pose.orientation.z = o.
z();
141 pose_msg_req.pose_in.pose.orientation.w = o.
w();
142 pose_msg_req.pose_in.pose.position.x = p.
x();
143 pose_msg_req.pose_in.pose.position.y = p.
y();
144 pose_msg_req.pose_in.pose.position.z = p.
z();
147 EXPECT_TRUE(pose_client.
call(pose_msg_req, pose_msg_resp));
149 EXPECT_TRUE(pose_msg_resp.success);
150 if (!pose_msg_resp.success)
158 EXPECT_NEAR(o.
x(), pose_msg_resp.pose_out.pose.orientation.x, 1.e-10);
159 EXPECT_NEAR(o.
y(), pose_msg_resp.pose_out.pose.orientation.y, 1.e-10);
160 EXPECT_NEAR(o.
z(), pose_msg_resp.pose_out.pose.orientation.z, 1.e-10);
161 EXPECT_NEAR(o.
w(), pose_msg_resp.pose_out.pose.orientation.w, 1.e-10);
162 EXPECT_NEAR(p.
x(), pose_msg_resp.pose_out.pose.position.x, 1.e-10);
163 EXPECT_NEAR(p.
y(), pose_msg_resp.pose_out.pose.position.y, 1.e-10);
164 EXPECT_NEAR(p.
z(), pose_msg_resp.pose_out.pose.position.z, 1.e-10);
165 EXPECT_STREQ(pose_msg_resp.pose_out.header.frame_id.c_str(),
"world");
170 std::string robot_description;
172 ASSERT_TRUE(
p_nh.
getParam(
"robot_description", robot_description));
177 q = RobotDynamics::Math::VectorNd::Zero(
model->q_size);
178 qdot = RobotDynamics::Math::VectorNd::Zero(
model->qdot_size);
191 rdl_msgs::ChangePointFrameRequest p_msg_req;
192 rdl_msgs::ChangePointFrameResponse p_msg_resp;
193 p_msg_req.new_reference_frame =
"world";
194 p_msg_req.point_in.header.frame_id =
"test_link2";
195 p_msg_req.point_in.point.x = p.
x();
196 p_msg_req.point_in.point.y = p.
y();
197 p_msg_req.point_in.point.z = p.
z();
200 EXPECT_TRUE(p_client.
call(p_msg_req, p_msg_resp));
202 EXPECT_TRUE(p_msg_resp.success);
203 if (!p_msg_resp.success)
210 EXPECT_NEAR(p.
x(), p_msg_resp.point_out.point.x, 1.e-10);
211 EXPECT_NEAR(p.
y(), p_msg_resp.point_out.point.y, 1.e-10);
212 EXPECT_NEAR(p.
z(), p_msg_resp.point_out.point.z, 1.e-10);
218 std::string robot_description;
220 ASSERT_TRUE(
p_nh.
getParam(
"robot_description", robot_description));
225 q = RobotDynamics::Math::VectorNd::Zero(
model->q_size);
226 qdot = RobotDynamics::Math::VectorNd::Zero(
model->qdot_size);
241 rdl_msgs::ChangeOrientationFrameRequest o_msg_req;
242 rdl_msgs::ChangeOrientationFrameResponse o_msg_resp;
243 o_msg_req.new_reference_frame =
"world";
244 o_msg_req.orientation_in.header.frame_id =
"test_link2";
245 o_msg_req.orientation_in.quaternion.x = o.
x();
246 o_msg_req.orientation_in.quaternion.y = o.
y();
247 o_msg_req.orientation_in.quaternion.z = o.
z();
248 o_msg_req.orientation_in.quaternion.w = o.
w();
251 EXPECT_TRUE(o_client.
call(o_msg_req, o_msg_resp));
253 EXPECT_TRUE(o_msg_resp.success);
254 if (!o_msg_resp.success)
261 EXPECT_NEAR(o.
x(), o_msg_resp.orientation_out.quaternion.x, 1.e-10);
262 EXPECT_NEAR(o.
y(), o_msg_resp.orientation_out.quaternion.y, 1.e-10);
263 EXPECT_NEAR(o.
z(), o_msg_resp.orientation_out.quaternion.z, 1.e-10);
264 EXPECT_NEAR(o.
w(), o_msg_resp.orientation_out.quaternion.w, 1.e-10);
270 std::string robot_description;
272 ASSERT_TRUE(
p_nh.
getParam(
"robot_description", robot_description));
277 q = RobotDynamics::Math::VectorNd::Zero(
model->q_size);
278 qdot = RobotDynamics::Math::VectorNd::Zero(
model->qdot_size);
292 rdl_msgs::ChangePointArrayFrameRequest p_msg_req;
293 rdl_msgs::ChangePointArrayFrameResponse p_msg_resp;
294 p_msg_req.new_reference_frame.push_back(
"world");
295 geometry_msgs::PointStamped point;
297 point.point.x = p.
x();
298 point.point.y = p.
y();
299 point.point.z = p.
z();
300 p_msg_req.point_array_in.push_back(point);
302 p_msg_req.new_reference_frame.push_back(
"test_link2");
304 point.point.x = p2.
x();
305 point.point.y = p2.
y();
306 point.point.z = p2.
z();
307 p_msg_req.point_array_in.push_back(point);
310 EXPECT_TRUE(p_client.
call(p_msg_req, p_msg_resp));
312 EXPECT_TRUE(p_msg_resp.success);
313 if (!p_msg_resp.success)
321 EXPECT_NEAR(p.
x(), p_msg_resp.point_array_out[0].point.x, 1.e-10);
322 EXPECT_NEAR(p.
y(), p_msg_resp.point_array_out[0].point.y, 1.e-10);
323 EXPECT_NEAR(p.
z(), p_msg_resp.point_array_out[0].point.z, 1.e-10);
324 EXPECT_STREQ(p.
getReferenceFrame()->getName().c_str(), p_msg_resp.point_array_out[0].header.frame_id.c_str());
326 EXPECT_NEAR(p2.
x(), p_msg_resp.point_array_out[1].point.x, 1.e-10);
327 EXPECT_NEAR(p2.
y(), p_msg_resp.point_array_out[1].point.y, 1.e-10);
328 EXPECT_NEAR(p2.
z(), p_msg_resp.point_array_out[1].point.z, 1.e-10);
329 EXPECT_STREQ(p2.
getReferenceFrame()->getName().c_str(), p_msg_resp.point_array_out[1].header.frame_id.c_str());
334 std::string robot_description;
336 ASSERT_TRUE(
p_nh.
getParam(
"robot_description", robot_description));
341 q = RobotDynamics::Math::VectorNd::Zero(
model->q_size);
342 qdot = RobotDynamics::Math::VectorNd::Zero(
model->qdot_size);
355 rdl_msgs::Change3DVectorFrameRequest v_req;
356 rdl_msgs::Change3DVectorFrameResponse v_resp;
357 v_req.new_reference_frame =
"test_link1";
358 v_req.vector_in.header.frame_id = v.getReferenceFrame()->getName();
359 v_req.vector_in.vector.x = v.x();
360 v_req.vector_in.vector.y = v.y();
361 v_req.vector_in.vector.z = v.z();
363 v.changeFrame(
model->referenceFrameMap[
"test_link1"]);
365 v_client.
call(v_req, v_resp);
367 EXPECT_TRUE(v_resp.success);
373 EXPECT_STREQ(v_resp.vector_out.header.frame_id.c_str(),
"test_link1");
374 EXPECT_NEAR(v_resp.vector_out.vector.x, v.x(), 1.e-10);
375 EXPECT_NEAR(v_resp.vector_out.vector.y, v.y(), 1.e-10);
376 EXPECT_NEAR(v_resp.vector_out.vector.z, v.z(), 1.e-10);
381 std::string robot_description;
383 ASSERT_TRUE(
p_nh.
getParam(
"robot_description", robot_description));
388 q = RobotDynamics::Math::VectorNd::Zero(
model->q_size);
389 qdot = RobotDynamics::Math::VectorNd::Zero(
model->qdot_size);
403 rdl_msgs::Change3DVectorArrayFrameRequest v_msg_req;
404 rdl_msgs::Change3DVectorArrayFrameResponse v_msg_resp;
405 v_msg_req.new_reference_frame.push_back(
"world");
406 geometry_msgs::Vector3Stamped vector;
408 vector.vector.x = v.x();
409 vector.vector.y = v.y();
410 vector.vector.z = v.z();
411 v_msg_req.vector_array_in.push_back(vector);
413 v_msg_req.new_reference_frame.push_back(
"test_link2");
415 vector.vector.x = v2.x();
416 vector.vector.y = v2.y();
417 vector.vector.z = v2.z();
418 v_msg_req.vector_array_in.push_back(vector);
421 EXPECT_TRUE(v_client.
call(v_msg_req, v_msg_resp));
423 EXPECT_TRUE(v_msg_resp.success);
424 if (!v_msg_resp.success)
432 EXPECT_NEAR(v.x(), v_msg_resp.vector_array_out[0].vector.x, 1.e-10);
433 EXPECT_NEAR(v.y(), v_msg_resp.vector_array_out[0].vector.y, 1.e-10);
434 EXPECT_NEAR(v.z(), v_msg_resp.vector_array_out[0].vector.z, 1.e-10);
435 EXPECT_STREQ(v.
getReferenceFrame()->getName().c_str(), v_msg_resp.vector_array_out[0].header.frame_id.c_str());
437 EXPECT_NEAR(v2.x(), v_msg_resp.vector_array_out[1].vector.x, 1.e-10);
438 EXPECT_NEAR(v2.y(), v_msg_resp.vector_array_out[1].vector.y, 1.e-10);
439 EXPECT_NEAR(v2.z(), v_msg_resp.vector_array_out[1].vector.z, 1.e-10);
440 EXPECT_STREQ(v2.
getReferenceFrame()->getName().c_str(), v_msg_resp.vector_array_out[1].header.frame_id.c_str());
445 std::string robot_description;
447 ASSERT_TRUE(
p_nh.
getParam(
"robot_description", robot_description));
452 q = RobotDynamics::Math::VectorNd::Zero(
model->q_size);
453 qdot = RobotDynamics::Math::VectorNd::Zero(
model->qdot_size);
467 rdl_msgs::ChangeTwistFrameRequest v_req;
468 rdl_msgs::ChangeTwistFrameResponse v_resp;
469 v_req.new_reference_frame =
"test_link2";
470 v_req.twist_in.header.frame_id = v.getReferenceFrame()->getName();
471 v_req.twist_in.twist.linear.x = v.vx();
472 v_req.twist_in.twist.linear.y = v.vy();
473 v_req.twist_in.twist.linear.z = v.vz();
474 v_req.twist_in.twist.angular.x = v.wx();
475 v_req.twist_in.twist.angular.y = v.wy();
476 v_req.twist_in.twist.angular.z = v.wz();
478 v.changeFrame(
model->referenceFrameMap[
"test_link2"]);
480 v_client.
call(v_req, v_resp);
482 EXPECT_TRUE(v_resp.success);
488 EXPECT_STREQ(v_resp.twist_out.header.frame_id.c_str(),
"test_link2");
489 EXPECT_NEAR(v_resp.twist_out.twist.linear.x, v.vx(), 1.e-10);
490 EXPECT_NEAR(v_resp.twist_out.twist.linear.y, v.vy(), 1.e-10);
491 EXPECT_NEAR(v_resp.twist_out.twist.linear.z, v.vz(), 1.e-10);
492 EXPECT_NEAR(v_resp.twist_out.twist.angular.x, v.wx(), 1.e-10);
493 EXPECT_NEAR(v_resp.twist_out.twist.angular.y, v.wy(), 1.e-10);
494 EXPECT_NEAR(v_resp.twist_out.twist.angular.z, v.wz(), 1.e-10);
499 std::string robot_description;
501 ASSERT_TRUE(
p_nh.
getParam(
"robot_description", robot_description));
506 q = RobotDynamics::Math::VectorNd::Zero(
model->q_size);
507 qdot = RobotDynamics::Math::VectorNd::Zero(
model->qdot_size);
521 0.2, 0.3, 0.4, 0.5, 0.6);
522 rdl_msgs::ChangeTwistArrayFrameRequest v_req;
523 rdl_msgs::ChangeTwistArrayFrameResponse v_resp;
524 geometry_msgs::TwistStamped twist;
525 v_req.new_reference_frame.push_back(
"test_link2");
526 twist.header.frame_id = v.getReferenceFrame()->getName();
527 twist.twist.linear.x = v.vx();
528 twist.twist.linear.y = v.vy();
529 twist.twist.linear.z = v.vz();
530 twist.twist.angular.x = v.wx();
531 twist.twist.angular.y = v.wy();
532 twist.twist.angular.z = v.wz();
534 v_req.twist_array_in.push_back(twist);
536 v_req.new_reference_frame.push_back(
"world");
538 twist.twist.linear.x = v2.
vx();
539 twist.twist.linear.y = v2.
vy();
540 twist.twist.linear.z = v2.
vz();
541 twist.twist.angular.x = v2.
wx();
542 twist.twist.angular.y = v2.
wy();
543 twist.twist.angular.z = v2.
wz();
545 v_req.twist_array_in.push_back(twist);
547 v.changeFrame(
model->referenceFrameMap[
"test_link2"]);
550 v_client.
call(v_req, v_resp);
552 EXPECT_TRUE(v_resp.success);
558 EXPECT_STREQ(v_resp.twist_array_out[0].header.frame_id.c_str(),
"test_link2");
559 EXPECT_NEAR(v_resp.twist_array_out[0].twist.linear.x, v.vx(), 1.e-10);
560 EXPECT_NEAR(v_resp.twist_array_out[0].twist.linear.y, v.vy(), 1.e-10);
561 EXPECT_NEAR(v_resp.twist_array_out[0].twist.linear.z, v.vz(), 1.e-10);
562 EXPECT_NEAR(v_resp.twist_array_out[0].twist.angular.x, v.wx(), 1.e-10);
563 EXPECT_NEAR(v_resp.twist_array_out[0].twist.angular.y, v.wy(), 1.e-10);
564 EXPECT_NEAR(v_resp.twist_array_out[0].twist.angular.z, v.wz(), 1.e-10);
566 EXPECT_STREQ(v_resp.twist_array_out[1].header.frame_id.c_str(),
"world");
567 EXPECT_NEAR(v_resp.twist_array_out[1].twist.linear.x, v2.
vx(), 1.e-10);
568 EXPECT_NEAR(v_resp.twist_array_out[1].twist.linear.y, v2.
vy(), 1.e-10);
569 EXPECT_NEAR(v_resp.twist_array_out[1].twist.linear.z, v2.
vz(), 1.e-10);
570 EXPECT_NEAR(v_resp.twist_array_out[1].twist.angular.x, v2.
wx(), 1.e-10);
571 EXPECT_NEAR(v_resp.twist_array_out[1].twist.angular.y, v2.
wy(), 1.e-10);
572 EXPECT_NEAR(v_resp.twist_array_out[1].twist.angular.z, v2.
wz(), 1.e-10);
577 std::string robot_description;
579 ASSERT_TRUE(
p_nh.
getParam(
"robot_description", robot_description));
584 q = RobotDynamics::Math::VectorNd::Zero(
model->q_size);
585 qdot = RobotDynamics::Math::VectorNd::Zero(
model->qdot_size);
598 rdl_msgs::ChangeWrenchFrameRequest v_req;
599 rdl_msgs::ChangeWrenchFrameResponse v_resp;
600 v_req.new_reference_frame =
"test_link2";
601 v_req.wrench_in.header.frame_id = v.getReferenceFrame()->getName();
602 v_req.wrench_in.wrench.force.x = v.fx();
603 v_req.wrench_in.wrench.force.y = v.fy();
604 v_req.wrench_in.wrench.force.z = v.fz();
605 v_req.wrench_in.wrench.torque.x = v.mx();
606 v_req.wrench_in.wrench.torque.y = v.my();
607 v_req.wrench_in.wrench.torque.z = v.mz();
609 v.changeFrame(
model->referenceFrameMap[
"test_link2"]);
611 v_client.
call(v_req, v_resp);
613 EXPECT_TRUE(v_resp.success);
619 EXPECT_STREQ(v_resp.wrench_out.header.frame_id.c_str(),
"test_link2");
620 EXPECT_NEAR(v_resp.wrench_out.wrench.force.x, v.fx(), 1.e-10);
621 EXPECT_NEAR(v_resp.wrench_out.wrench.force.y, v.fy(), 1.e-10);
622 EXPECT_NEAR(v_resp.wrench_out.wrench.force.z, v.fz(), 1.e-10);
623 EXPECT_NEAR(v_resp.wrench_out.wrench.torque.x, v.mx(), 1.e-10);
624 EXPECT_NEAR(v_resp.wrench_out.wrench.torque.y, v.my(), 1.e-10);
625 EXPECT_NEAR(v_resp.wrench_out.wrench.torque.z, v.mz(), 1.e-10);
630 std::string robot_description;
632 ASSERT_TRUE(
p_nh.
getParam(
"robot_description", robot_description));
637 q = RobotDynamics::Math::VectorNd::Zero(
model->q_size);
638 qdot = RobotDynamics::Math::VectorNd::Zero(
model->qdot_size);
652 rdl_msgs::ChangeWrenchArrayFrameRequest v_req;
653 rdl_msgs::ChangeWrenchArrayFrameResponse v_resp;
654 v_req.new_reference_frame.push_back(
"test_link2");
655 geometry_msgs::WrenchStamped wrench;
656 wrench.header.frame_id = v.getReferenceFrame()->getName();
657 wrench.wrench.force.x = v.fx();
658 wrench.wrench.force.y = v.fy();
659 wrench.wrench.force.z = v.fz();
660 wrench.wrench.torque.x = v.mx();
661 wrench.wrench.torque.y = v.my();
662 wrench.wrench.torque.z = v.mz();
663 v_req.wrench_array_in.push_back(wrench);
665 v_req.new_reference_frame.push_back(
"test_link1");
667 wrench.wrench.force.x = v2.
fx();
668 wrench.wrench.force.y = v2.
fy();
669 wrench.wrench.force.z = v2.
fz();
670 wrench.wrench.torque.x = v2.
mx();
671 wrench.wrench.torque.y = v2.
my();
672 wrench.wrench.torque.z = v2.
mz();
673 v_req.wrench_array_in.push_back(wrench);
675 v.changeFrame(
model->referenceFrameMap[
"test_link2"]);
678 v_client.
call(v_req, v_resp);
680 EXPECT_TRUE(v_resp.success);
686 EXPECT_STREQ(v_resp.wrench_array_out[0].header.frame_id.c_str(),
"test_link2");
687 EXPECT_NEAR(v_resp.wrench_array_out[0].wrench.force.x, v.fx(), 1.e-10);
688 EXPECT_NEAR(v_resp.wrench_array_out[0].wrench.force.y, v.fy(), 1.e-10);
689 EXPECT_NEAR(v_resp.wrench_array_out[0].wrench.force.z, v.fz(), 1.e-10);
690 EXPECT_NEAR(v_resp.wrench_array_out[0].wrench.torque.x, v.mx(), 1.e-10);
691 EXPECT_NEAR(v_resp.wrench_array_out[0].wrench.torque.y, v.my(), 1.e-10);
692 EXPECT_NEAR(v_resp.wrench_array_out[0].wrench.torque.z, v.mz(), 1.e-10);
694 EXPECT_STREQ(v_resp.wrench_array_out[1].header.frame_id.c_str(),
"test_link1");
695 EXPECT_NEAR(v_resp.wrench_array_out[1].wrench.force.x, v2.
fx(), 1.e-10);
696 EXPECT_NEAR(v_resp.wrench_array_out[1].wrench.force.y, v2.
fy(), 1.e-10);
697 EXPECT_NEAR(v_resp.wrench_array_out[1].wrench.force.z, v2.
fz(), 1.e-10);
698 EXPECT_NEAR(v_resp.wrench_array_out[1].wrench.torque.x, v2.
mx(), 1.e-10);
699 EXPECT_NEAR(v_resp.wrench_array_out[1].wrench.torque.y, v2.
my(), 1.e-10);
700 EXPECT_NEAR(v_resp.wrench_array_out[1].wrench.torque.z, v2.
mz(), 1.e-10);
705 std::string robot_description;
707 ASSERT_TRUE(
p_nh.
getParam(
"robot_description", robot_description));
712 q = RobotDynamics::Math::VectorNd::Zero(
model->q_size);
713 qdot = RobotDynamics::Math::VectorNd::Zero(
model->qdot_size);
726 rdl_msgs::GetTwistRequest v_req;
727 rdl_msgs::GetTwistResponse v_resp;
728 v_req.base_frame =
"test_link2";
729 v_req.body_frame =
"test_link1_com";
730 v_req.expressed_in_frame =
"world";
732 ASSERT_TRUE(v_client.
call(v_req, v_resp));
735 model->worldFrame,
false);
737 EXPECT_TRUE(v_resp.success);
743 EXPECT_STREQ(v_resp.twist_out.header.frame_id.c_str(),
"world");
744 EXPECT_NEAR(v_resp.twist_out.twist.linear.x, v.vx(), 1.e-10);
745 EXPECT_NEAR(v_resp.twist_out.twist.linear.y, v.vy(), 1.e-10);
746 EXPECT_NEAR(v_resp.twist_out.twist.linear.z, v.vz(), 1.e-10);
747 EXPECT_NEAR(v_resp.twist_out.twist.angular.x, v.wx(), 1.e-10);
748 EXPECT_NEAR(v_resp.twist_out.twist.angular.y, v.wy(), 1.e-10);
749 EXPECT_NEAR(v_resp.twist_out.twist.angular.z, v.wz(), 1.e-10);
754 std::string robot_description;
756 ASSERT_TRUE(
p_nh.
getParam(
"robot_description", robot_description));
761 q = RobotDynamics::Math::VectorNd::Zero(
model->q_size);
762 qdot = RobotDynamics::Math::VectorNd::Zero(
model->qdot_size);
774 rdl_msgs::GetTransformRequest v_req;
775 rdl_msgs::GetTransformResponse v_resp;
776 v_req.from_reference_frame =
"test_link2";
777 v_req.to_reference_frame =
"test_link1_com";
779 ASSERT_TRUE(v_client.
call(v_req, v_resp));
785 EXPECT_TRUE(v_resp.success);
791 v_resp.transform.header.frame_id =
"test_link2";
792 v_resp.transform.child_frame_id =
"test_link1_com";
793 EXPECT_NEAR(v_resp.transform.transform.translation.x, X.
r.x(), 1.e-10);
794 EXPECT_NEAR(v_resp.transform.transform.translation.y, X.
r.y(), 1.e-10);
795 EXPECT_NEAR(v_resp.transform.transform.translation.z, X.
r.z(), 1.e-10);
799 EXPECT_NEAR(orientation.x(), v_resp.transform.transform.rotation.x, 1.e-10);
800 EXPECT_NEAR(orientation.y(), v_resp.transform.transform.rotation.y, 1.e-10);
801 EXPECT_NEAR(orientation.z(), v_resp.transform.transform.rotation.z, 1.e-10);
802 EXPECT_NEAR(orientation.w(), v_resp.transform.transform.rotation.w, 1.e-10);
807 std::string robot_description;
809 ASSERT_TRUE(
p_nh.
getParam(
"robot_description", robot_description));
814 q = RobotDynamics::Math::VectorNd::Zero(
model->q_size);
815 qdot = RobotDynamics::Math::VectorNd::Zero(
model->qdot_size);
828 rdl_msgs::GetBodyGravityWrenchRequest v_req;
829 rdl_msgs::GetBodyGravityWrenchResponse v_resp;
830 v_req.body =
"test_link2";
832 v_client.
call(v_req, v_resp);
836 EXPECT_TRUE(v_resp.success);
842 EXPECT_STREQ(v_resp.wrench.header.frame_id.c_str(),
"test_link2");
843 EXPECT_NEAR(v_resp.wrench.wrench.force.x, v.fx(), 1.e-10);
844 EXPECT_NEAR(v_resp.wrench.wrench.force.y, v.fy(), 1.e-10);
845 EXPECT_NEAR(v_resp.wrench.wrench.force.z, v.fz(), 1.e-10);
846 EXPECT_NEAR(v_resp.wrench.wrench.torque.x, v.mx(), 1.e-10);
847 EXPECT_NEAR(v_resp.wrench.wrench.torque.y, v.my(), 1.e-10);
848 EXPECT_NEAR(v_resp.wrench.wrench.torque.z, v.mz(), 1.e-10);
853 std::string robot_description;
855 ASSERT_TRUE(
p_nh.
getParam(
"robot_description", robot_description));
860 q = RobotDynamics::Math::VectorNd::Zero(
model->q_size);
861 qdot = RobotDynamics::Math::VectorNd::Zero(
model->qdot_size);
872 rdl_msgs::GetRobotCenterOfMassResponse v_resp;
873 rdl_msgs::GetRobotCenterOfMassRequest v_req;
876 v_client.
call(v_req, v_resp);
882 EXPECT_TRUE(v_resp.success);
888 EXPECT_STREQ(v_resp.com.header.frame_id.c_str(), p_com.
getReferenceFrame()->getName().c_str());
889 EXPECT_NEAR(v_resp.com.point.x, p_com.
x(), 1.e-10);
890 EXPECT_NEAR(v_resp.com.point.y, p_com.
y(), 1.e-10);
891 EXPECT_NEAR(v_resp.com.point.z, p_com.
z(), 1.e-10);
893 EXPECT_NEAR(v_resp.com_vel.vector.x, v_com.x(), 1.e-10);
894 EXPECT_NEAR(v_resp.com_vel.vector.y, v_com.y(), 1.e-10);
895 EXPECT_NEAR(v_resp.com_vel.vector.z, v_com.z(), 1.e-10);
898 int main(
int argc,
char** argv)
900 testing::InitGoogleTest(&argc, argv);
901 ros::init(argc, argv,
"kinematics_interface_test");
905 int ret = RUN_ALL_TESTS();
EIGEN_STRONG_INLINE double & x()
ServiceClient serviceClient(const std::string &service_name, bool persistent=false, const M_string &header_values=M_string())
RobotDynamics::ModelPtr model
EIGEN_STRONG_INLINE double & w()
ReferenceFramePtr getReferenceFrame() const
bool waitForSubscriber(unsigned int usec_timeout)
void publish(const boost::shared_ptr< M > &message) const
std::shared_ptr< Model > ModelPtr
Math::SpatialMotion calcSpatialVelocity(Model &model, const Math::VectorNd &Q, const Math::VectorNd &QDot, ReferenceFramePtr body_frame, ReferenceFramePtr relative_body_frame, ReferenceFramePtr expressedInFrame=nullptr, const bool update_kinematics=true)
TEST_F(KinematicsInterfaceTest, change_pose_frame)
EIGEN_STRONG_INLINE double & vz()
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
bool call(MReq &req, MRes &res)
EIGEN_STRONG_INLINE double & fy()
static Quaternion toQuaternion(const Vector3d &axis, double angle_rad)
EIGEN_STRONG_INLINE double & wx()
EIGEN_STRONG_INLINE double & wy()
void publishRobotState(unsigned int n_pubs=10)
RobotDynamics::Math::VectorNd qdot
std::map< std::string, std::string > joint_to_body_name_map
EIGEN_STRONG_INLINE double & fx()
EIGEN_STRONG_INLINE double & vx()
EIGEN_STRONG_INLINE double & fz()
RobotDynamics::Math::VectorNd q
std::shared_ptr< ReferenceFrame > ReferenceFramePtr
EIGEN_STRONG_INLINE double & my()
virtual void changeFrame(ReferenceFramePtr desiredFrame)
EIGEN_STRONG_INLINE double & y()
void calcBodyGravityWrench(Model &model, unsigned int body_id, RobotDynamics::Math::SpatialForce &gravity_wrench)
EIGEN_STRONG_INLINE double & mz()
EIGEN_STRONG_INLINE double & wz()
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
bool parseJointBodyNameMapFromString(const char *model_xml_string, std::map< std::string, std::string > &jointBodyMap)
EIGEN_STRONG_INLINE double & vy()
~KinematicsInterfaceTest()
void updateKinematicsCustom(Model &model, const Math::VectorNd *Q, const Math::VectorNd *QDot=nullptr, const Math::VectorNd *QDDot=nullptr)
EIGEN_STRONG_INLINE double & x()
void calcCenterOfMass(Model &model, const Math::VectorNd &q, Math::Vector3d &com, bool update_kinematics=true)
EIGEN_STRONG_INLINE double & y()
rdl_msgs::RobotState robot_state_msg
uint32_t getNumSubscribers() const
int main(int argc, char **argv)
bool getParam(const std::string &key, std::string &s) const
EIGEN_STRONG_INLINE double & mx()
ros::Publisher robot_state_publisher
ROSCPP_DECL void shutdown()
EIGEN_STRONG_INLINE double & z()
#define ROS_ERROR_STREAM(args)
KinematicsInterfaceTest()
EIGEN_STRONG_INLINE double & z()
bool urdfReadFromString(const char *model_xml_string, ModelPtr model, bool floating_base, bool verbose=false)