kinematics_interface_test.cpp
Go to the documentation of this file.
1 
2 #include <gtest/gtest.h>
3 #include <random>
4 #include <ros/ros.h>
5 #include <time.h>
6 #include <rdl_msgs/ChangeWrenchArrayFrameRequest.h>
7 
11 #include "rdl_dynamics/Model.h"
12 #include "rdl_dynamics/rdl_utils.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"
29 
30 struct KinematicsInterfaceTest : public testing::Test
31 {
33  {
34  srand(time(NULL));
35  nh = ros::NodeHandle("kinematics_interface");
36  p_nh = ros::NodeHandle("~");
37  model.reset(new RobotDynamics::Model());
38  }
39 
41  {
42  }
43 
44  void SetUp()
45  {
46  }
47 
48  void TearDown()
49  {
50  }
51 
54  rdl_msgs::RobotState robot_state_msg;
55  std::map<std::string, std::string> joint_to_body_name_map;
59 
61  {
62  for (int i = 0; i < q.size(); i++)
63  {
64  q[i] = 0.4 * M_PI * static_cast<double>(rand()) / static_cast<double>(RAND_MAX);
65  }
66 
68  orient = model->GetQuaternion(2, q);
69  orient.normalize();
70  model->SetQuaternion(2, orient, q);
71 
72  for (int i = 0; i < qdot.size(); i++)
73  {
74  qdot[i] = 0.5 * M_PI * static_cast<double>(rand()) / static_cast<double>(RAND_MAX);
75  }
76 
77  for (int i = 0; i < q.size(); i++)
78  {
79  robot_state_msg.position.push_back(q[i]);
80  }
81 
82  for (int i = 0; i < qdot.size(); i++)
83  {
84  robot_state_msg.velocity.push_back(qdot[i]);
85  }
86  }
87 
88  void publishRobotState(unsigned int n_pubs = 10)
89  {
90  for (unsigned int i = 0; i < n_pubs; i++)
91  {
92  robot_state_publisher.publish(robot_state_msg);
93  usleep(100);
94  }
95  }
96 
97  bool waitForSubscriber(unsigned int usec_timeout)
98  {
99  unsigned int total_usec = 0;
100  while (robot_state_publisher.getNumSubscribers() == 0 && total_usec < usec_timeout)
101  {
102  total_usec += 100;
103  usleep(100);
104  }
105  }
106 };
107 
108 TEST_F(KinematicsInterfaceTest, change_pose_frame)
109 {
110  std::string robot_description;
111 
112  ASSERT_TRUE(p_nh.getParam("robot_description", robot_description));
113 
114  ASSERT_TRUE(RobotDynamics::Urdf::urdfReadFromString(robot_description, model));
116 
117  q = RobotDynamics::Math::VectorNd::Zero(model->q_size);
118  qdot = RobotDynamics::Math::VectorNd::Zero(model->qdot_size);
119 
120  robot_state_publisher = nh.advertise<rdl_msgs::RobotState>("robot_state", 0);
121  waitForSubscriber(3.e6);
122 
123  randomizeStates();
124 
126 
128 
129  RobotDynamics::Math::Quaternion quat(1., 2., 3., 4.);
130  quat.normalize();
131  RobotDynamics::Math::FrameOrientation o(model->referenceFrameMap["test_link2"], quat);
132  RobotDynamics::Math::FramePoint p(model->referenceFrameMap["test_link2"], 0.1, 0.2, 0.3);
133 
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();
145 
146  ros::ServiceClient pose_client = nh.serviceClient<rdl_msgs::ChangePoseFrame>("change_frame_pose");
147  EXPECT_TRUE(pose_client.call(pose_msg_req, pose_msg_resp));
148 
149  EXPECT_TRUE(pose_msg_resp.success);
150  if (!pose_msg_resp.success)
151  {
152  ROS_ERROR_STREAM("" << pose_msg_resp.report);
153  }
154 
155  o.changeFrame(model->worldFrame);
156  p.changeFrame(model->worldFrame);
157 
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");
166 }
167 
168 TEST_F(KinematicsInterfaceTest, change_point_frame)
169 {
170  std::string robot_description;
171 
172  ASSERT_TRUE(p_nh.getParam("robot_description", robot_description));
173 
174  ASSERT_TRUE(RobotDynamics::Urdf::urdfReadFromString(robot_description, model));
176 
177  q = RobotDynamics::Math::VectorNd::Zero(model->q_size);
178  qdot = RobotDynamics::Math::VectorNd::Zero(model->qdot_size);
179 
180  robot_state_publisher = nh.advertise<rdl_msgs::RobotState>("robot_state", 0);
181  waitForSubscriber(3.e6);
182 
183  randomizeStates();
184 
186 
188 
189  RobotDynamics::Math::FramePoint p(model->referenceFrameMap["test_link2"], 1., 2., 3.);
190 
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();
198 
199  ros::ServiceClient p_client = nh.serviceClient<rdl_msgs::ChangePointFrame>("change_frame_point");
200  EXPECT_TRUE(p_client.call(p_msg_req, p_msg_resp));
201 
202  EXPECT_TRUE(p_msg_resp.success);
203  if (!p_msg_resp.success)
204  {
205  ROS_ERROR_STREAM("" << p_msg_resp.report);
206  }
207 
208  p.changeFrame(model->worldFrame);
209 
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);
213  EXPECT_STREQ(p.getReferenceFrame()->getName().c_str(), "world");
214 }
215 
216 TEST_F(KinematicsInterfaceTest, change_orientation_frame)
217 {
218  std::string robot_description;
219 
220  ASSERT_TRUE(p_nh.getParam("robot_description", robot_description));
221 
222  ASSERT_TRUE(RobotDynamics::Urdf::urdfReadFromString(robot_description, model));
224 
225  q = RobotDynamics::Math::VectorNd::Zero(model->q_size);
226  qdot = RobotDynamics::Math::VectorNd::Zero(model->qdot_size);
227 
228  robot_state_publisher = nh.advertise<rdl_msgs::RobotState>("robot_state", 0);
229  waitForSubscriber(3.e6);
230 
231  randomizeStates();
232 
234 
236 
237  RobotDynamics::Math::Quaternion quat(1., 2., 3., 4.);
238  quat.normalize();
239  RobotDynamics::Math::FrameOrientation o(model->referenceFrameMap["test_link2"], quat);
240 
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();
249 
250  ros::ServiceClient o_client = nh.serviceClient<rdl_msgs::ChangeOrientationFrame>("change_frame_orientation");
251  EXPECT_TRUE(o_client.call(o_msg_req, o_msg_resp));
252 
253  EXPECT_TRUE(o_msg_resp.success);
254  if (!o_msg_resp.success)
255  {
256  ROS_ERROR_STREAM("" << o_msg_resp.report);
257  }
258 
259  o.changeFrame(model->worldFrame);
260 
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);
265  EXPECT_STREQ(o.getReferenceFrame()->getName().c_str(), "world");
266 }
267 
268 TEST_F(KinematicsInterfaceTest, change_point_array_frame)
269 {
270  std::string robot_description;
271 
272  ASSERT_TRUE(p_nh.getParam("robot_description", robot_description));
273 
274  ASSERT_TRUE(RobotDynamics::Urdf::urdfReadFromString(robot_description, model));
276 
277  q = RobotDynamics::Math::VectorNd::Zero(model->q_size);
278  qdot = RobotDynamics::Math::VectorNd::Zero(model->qdot_size);
279 
280  robot_state_publisher = nh.advertise<rdl_msgs::RobotState>("robot_state", 0);
281  waitForSubscriber(3.e6);
282 
283  randomizeStates();
284 
286 
288 
289  RobotDynamics::Math::FramePoint p(model->referenceFrameMap["test_link2"], 1., 2., 3.);
290  RobotDynamics::Math::FramePoint p2(model->referenceFrameMap["test_link1"], 1., 2., 3.);
291 
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;
296  point.header.frame_id = p.getReferenceFrame()->getName();
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);
301 
302  p_msg_req.new_reference_frame.push_back("test_link2");
303  point.header.frame_id = p2.getReferenceFrame()->getName();
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);
308 
309  ros::ServiceClient p_client = nh.serviceClient<rdl_msgs::ChangePointArrayFrame>("change_frame_point_array");
310  EXPECT_TRUE(p_client.call(p_msg_req, p_msg_resp));
311 
312  EXPECT_TRUE(p_msg_resp.success);
313  if (!p_msg_resp.success)
314  {
315  ROS_ERROR_STREAM("" << p_msg_resp.report);
316  }
317 
318  p.changeFrame(model->worldFrame);
319  p2.changeFrame(model->referenceFrameMap["test_link2"]);
320 
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());
325 
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());
330 }
331 
332 TEST_F(KinematicsInterfaceTest, change_3d_vector_frame)
333 {
334  std::string robot_description;
335 
336  ASSERT_TRUE(p_nh.getParam("robot_description", robot_description));
337 
338  ASSERT_TRUE(RobotDynamics::Urdf::urdfReadFromString(robot_description, model));
340 
341  q = RobotDynamics::Math::VectorNd::Zero(model->q_size);
342  qdot = RobotDynamics::Math::VectorNd::Zero(model->qdot_size);
343 
344  robot_state_publisher = nh.advertise<rdl_msgs::RobotState>("robot_state", 0);
345  waitForSubscriber(3.e6);
346 
347  randomizeStates();
348 
350 
352 
353  ros::ServiceClient v_client = nh.serviceClient<rdl_msgs::Change3DVectorFrame>("change_frame_3dvector");
354  RobotDynamics::Math::FrameVector v(model->referenceFrameMap["test_link2"], 0.1, 0.2, 0.3);
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();
362 
363  v.changeFrame(model->referenceFrameMap["test_link1"]);
364 
365  v_client.call(v_req, v_resp);
366 
367  EXPECT_TRUE(v_resp.success);
368  if (!v_resp.success)
369  {
370  ROS_ERROR_STREAM("" << v_resp.report);
371  }
372 
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);
377 }
378 
379 TEST_F(KinematicsInterfaceTest, change_3dvector_array_frame)
380 {
381  std::string robot_description;
382 
383  ASSERT_TRUE(p_nh.getParam("robot_description", robot_description));
384 
385  ASSERT_TRUE(RobotDynamics::Urdf::urdfReadFromString(robot_description, model));
387 
388  q = RobotDynamics::Math::VectorNd::Zero(model->q_size);
389  qdot = RobotDynamics::Math::VectorNd::Zero(model->qdot_size);
390 
391  robot_state_publisher = nh.advertise<rdl_msgs::RobotState>("robot_state", 0);
392  waitForSubscriber(3.e6);
393 
394  randomizeStates();
395 
397 
399 
400  RobotDynamics::Math::FrameVector v(model->referenceFrameMap["test_link2"], 1., 2., 3.);
401  RobotDynamics::Math::FrameVector v2(model->referenceFrameMap["test_link1"], 1., 2., 3.);
402 
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;
407  vector.header.frame_id = v.getReferenceFrame()->getName();
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);
412 
413  v_msg_req.new_reference_frame.push_back("test_link2");
414  vector.header.frame_id = v2.getReferenceFrame()->getName();
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);
419 
420  ros::ServiceClient v_client = nh.serviceClient<rdl_msgs::Change3DVectorArrayFrame>("change_frame_3dvector_array");
421  EXPECT_TRUE(v_client.call(v_msg_req, v_msg_resp));
422 
423  EXPECT_TRUE(v_msg_resp.success);
424  if (!v_msg_resp.success)
425  {
426  ROS_ERROR_STREAM("" << v_msg_resp.report);
427  }
428 
429  v.changeFrame(model->worldFrame);
430  v2.changeFrame(model->referenceFrameMap["test_link2"]);
431 
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());
436 
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());
441 }
442 
443 TEST_F(KinematicsInterfaceTest, change_twist_frame)
444 {
445  std::string robot_description;
446 
447  ASSERT_TRUE(p_nh.getParam("robot_description", robot_description));
448 
449  ASSERT_TRUE(RobotDynamics::Urdf::urdfReadFromString(robot_description, model));
451 
452  q = RobotDynamics::Math::VectorNd::Zero(model->q_size);
453  qdot = RobotDynamics::Math::VectorNd::Zero(model->qdot_size);
454 
455  robot_state_publisher = nh.advertise<rdl_msgs::RobotState>("robot_state", 0);
456  waitForSubscriber(3.e6);
457 
458  randomizeStates();
459 
461 
463 
464  ros::ServiceClient v_client = nh.serviceClient<rdl_msgs::ChangeTwistFrame>("change_frame_twist");
465  RobotDynamics::Math::SpatialMotion v(model->referenceFrameMap["world"], model->referenceFrameMap["test_link2"], model->referenceFrameMap["test_link1"], 0.1, 0.2, 0.3,
466  0.4, 0.5, 0.6);
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();
477 
478  v.changeFrame(model->referenceFrameMap["test_link2"]);
479 
480  v_client.call(v_req, v_resp);
481 
482  EXPECT_TRUE(v_resp.success);
483  if (!v_resp.success)
484  {
485  ROS_ERROR_STREAM("" << v_resp.report);
486  }
487 
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);
495 }
496 
497 TEST_F(KinematicsInterfaceTest, change_twist_array_frame)
498 {
499  std::string robot_description;
500 
501  ASSERT_TRUE(p_nh.getParam("robot_description", robot_description));
502 
503  ASSERT_TRUE(RobotDynamics::Urdf::urdfReadFromString(robot_description, model));
505 
506  q = RobotDynamics::Math::VectorNd::Zero(model->q_size);
507  qdot = RobotDynamics::Math::VectorNd::Zero(model->qdot_size);
508 
509  robot_state_publisher = nh.advertise<rdl_msgs::RobotState>("robot_state", 0);
510  waitForSubscriber(3.e6);
511 
512  randomizeStates();
513 
515 
517 
518  ros::ServiceClient v_client = nh.serviceClient<rdl_msgs::ChangeTwistArrayFrame>("change_frame_twist_array");
519  RobotDynamics::Math::SpatialMotion v(model->worldFrame, model->referenceFrameMap["test_link2"], model->referenceFrameMap["test_link1"], 0.1, 0.2, 0.3, 0.4, 0.5, 0.6);
520  RobotDynamics::Math::SpatialMotion v2(model->referenceFrameMap["test_link2"], model->referenceFrameMap["test_link1"], model->referenceFrameMap["test_link1"], 0.1,
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();
533 
534  v_req.twist_array_in.push_back(twist);
535 
536  v_req.new_reference_frame.push_back("world");
537  twist.header.frame_id = v2.getReferenceFrame()->getName();
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();
544 
545  v_req.twist_array_in.push_back(twist);
546 
547  v.changeFrame(model->referenceFrameMap["test_link2"]);
548  v2.changeFrame(model->worldFrame);
549 
550  v_client.call(v_req, v_resp);
551 
552  EXPECT_TRUE(v_resp.success);
553  if (!v_resp.success)
554  {
555  ROS_ERROR_STREAM("" << v_resp.report);
556  }
557 
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);
565 
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);
573 }
574 
575 TEST_F(KinematicsInterfaceTest, change_wrench_frame)
576 {
577  std::string robot_description;
578 
579  ASSERT_TRUE(p_nh.getParam("robot_description", robot_description));
580 
581  ASSERT_TRUE(RobotDynamics::Urdf::urdfReadFromString(robot_description, model));
583 
584  q = RobotDynamics::Math::VectorNd::Zero(model->q_size);
585  qdot = RobotDynamics::Math::VectorNd::Zero(model->qdot_size);
586 
587  robot_state_publisher = nh.advertise<rdl_msgs::RobotState>("robot_state", 0);
588  waitForSubscriber(3.e6);
589 
590  randomizeStates();
591 
593 
595 
596  ros::ServiceClient v_client = nh.serviceClient<rdl_msgs::ChangeWrenchFrame>("change_frame_wrench");
597  RobotDynamics::Math::SpatialForce v(model->referenceFrameMap["test_link1"], 0.1, 0.2, 0.3, 0.4, 0.5, 0.6);
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();
608 
609  v.changeFrame(model->referenceFrameMap["test_link2"]);
610 
611  v_client.call(v_req, v_resp);
612 
613  EXPECT_TRUE(v_resp.success);
614  if (!v_resp.success)
615  {
616  ROS_ERROR_STREAM("" << v_resp.report);
617  }
618 
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);
626 }
627 
628 TEST_F(KinematicsInterfaceTest, change_wrench_array_frame)
629 {
630  std::string robot_description;
631 
632  ASSERT_TRUE(p_nh.getParam("robot_description", robot_description));
633 
634  ASSERT_TRUE(RobotDynamics::Urdf::urdfReadFromString(robot_description, model));
636 
637  q = RobotDynamics::Math::VectorNd::Zero(model->q_size);
638  qdot = RobotDynamics::Math::VectorNd::Zero(model->qdot_size);
639 
640  robot_state_publisher = nh.advertise<rdl_msgs::RobotState>("robot_state", 0);
641  waitForSubscriber(3.e6);
642 
643  randomizeStates();
644 
646 
648 
649  ros::ServiceClient v_client = nh.serviceClient<rdl_msgs::ChangeWrenchArrayFrame>("change_frame_wrench_array");
650  RobotDynamics::Math::SpatialForce v(model->referenceFrameMap["test_link1"], 0.1, 0.2, 0.3, 0.4, 0.5, 0.6);
651  RobotDynamics::Math::SpatialForce v2(model->worldFrame, 0.2, 0.4, -0.1, 0.6, -1., 0.6);
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);
664 
665  v_req.new_reference_frame.push_back("test_link1");
666  wrench.header.frame_id = v2.getReferenceFrame()->getName();
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);
674 
675  v.changeFrame(model->referenceFrameMap["test_link2"]);
676  v2.changeFrame(model->referenceFrameMap["test_link1"]);
677 
678  v_client.call(v_req, v_resp);
679 
680  EXPECT_TRUE(v_resp.success);
681  if (!v_resp.success)
682  {
683  ROS_ERROR_STREAM("" << v_resp.report);
684  }
685 
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);
693 
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);
701 }
702 
704 {
705  std::string robot_description;
706 
707  ASSERT_TRUE(p_nh.getParam("robot_description", robot_description));
708 
709  ASSERT_TRUE(RobotDynamics::Urdf::urdfReadFromString(robot_description, model));
711 
712  q = RobotDynamics::Math::VectorNd::Zero(model->q_size);
713  qdot = RobotDynamics::Math::VectorNd::Zero(model->qdot_size);
714 
715  robot_state_publisher = nh.advertise<rdl_msgs::RobotState>("robot_state", 0);
716  waitForSubscriber(3.e6);
717 
718  randomizeStates();
719 
721 
723 
724  ros::ServiceClient v_client = nh.serviceClient<rdl_msgs::GetTwist>("get_twist");
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";
731 
732  ASSERT_TRUE(v_client.call(v_req, v_resp));
733 
734  v = RobotDynamics::calcSpatialVelocity(*model, q, qdot, model->bodyCenteredFrames[model->GetBodyId("test_link1")], model->referenceFrameMap["test_link2"],
735  model->worldFrame, false);
736 
737  EXPECT_TRUE(v_resp.success);
738  if (!v_resp.success)
739  {
740  ROS_ERROR_STREAM("" << v_resp.report);
741  }
742 
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);
750 }
751 
753 {
754  std::string robot_description;
755 
756  ASSERT_TRUE(p_nh.getParam("robot_description", robot_description));
757 
758  ASSERT_TRUE(RobotDynamics::Urdf::urdfReadFromString(robot_description, model));
760 
761  q = RobotDynamics::Math::VectorNd::Zero(model->q_size);
762  qdot = RobotDynamics::Math::VectorNd::Zero(model->qdot_size);
763 
764  robot_state_publisher = nh.advertise<rdl_msgs::RobotState>("robot_state", 0);
765  waitForSubscriber(3.e6);
766 
767  randomizeStates();
768 
770 
772 
773  ros::ServiceClient v_client = nh.serviceClient<rdl_msgs::GetTransform>("get_transform");
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";
778 
779  ASSERT_TRUE(v_client.call(v_req, v_resp));
780 
781  RobotDynamics::ReferenceFramePtr from_frame = model->referenceFrameMap["test_link2"];
782  RobotDynamics::ReferenceFramePtr to_frame = model->bodyCenteredFrames[model->GetBodyId("test_link1")];
783  RobotDynamics::Math::SpatialTransform X = from_frame->getTransformToDesiredFrame(to_frame);
784 
785  EXPECT_TRUE(v_resp.success);
786  if (!v_resp.success)
787  {
788  ROS_ERROR_STREAM("" << v_resp.report);
789  }
790 
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);
796 
798 
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);
803 }
804 
805 TEST_F(KinematicsInterfaceTest, get_body_grav_wrench)
806 {
807  std::string robot_description;
808 
809  ASSERT_TRUE(p_nh.getParam("robot_description", robot_description));
810 
811  ASSERT_TRUE(RobotDynamics::Urdf::urdfReadFromString(robot_description, model));
813 
814  q = RobotDynamics::Math::VectorNd::Zero(model->q_size);
815  qdot = RobotDynamics::Math::VectorNd::Zero(model->qdot_size);
816 
817  robot_state_publisher = nh.advertise<rdl_msgs::RobotState>("robot_state", 0);
818  waitForSubscriber(3.e6);
819 
820  randomizeStates();
821 
823 
825 
826  ros::ServiceClient v_client = nh.serviceClient<rdl_msgs::GetBodyGravityWrench>("get_body_grav_wrench");
828  rdl_msgs::GetBodyGravityWrenchRequest v_req;
829  rdl_msgs::GetBodyGravityWrenchResponse v_resp;
830  v_req.body = "test_link2";
831 
832  v_client.call(v_req, v_resp);
833 
834  RobotDynamics::calcBodyGravityWrench(*model, model->GetBodyId("test_link2"), v);
835 
836  EXPECT_TRUE(v_resp.success);
837  if (!v_resp.success)
838  {
839  ROS_ERROR_STREAM("" << v_resp.report);
840  }
841 
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);
849 }
850 
852 {
853  std::string robot_description;
854 
855  ASSERT_TRUE(p_nh.getParam("robot_description", robot_description));
856 
857  ASSERT_TRUE(RobotDynamics::Urdf::urdfReadFromString(robot_description, model));
859 
860  q = RobotDynamics::Math::VectorNd::Zero(model->q_size);
861  qdot = RobotDynamics::Math::VectorNd::Zero(model->qdot_size);
862 
863  robot_state_publisher = nh.advertise<rdl_msgs::RobotState>("robot_state", 0);
864  waitForSubscriber(3.e6);
865 
866  randomizeStates();
867 
869 
871  ros::ServiceClient v_client = nh.serviceClient<rdl_msgs::GetRobotCenterOfMass>("get_robot_com");
872  rdl_msgs::GetRobotCenterOfMassResponse v_resp;
873  rdl_msgs::GetRobotCenterOfMassRequest v_req;
874  v_req;
875 
876  v_client.call(v_req, v_resp);
877 
880  RobotDynamics::Utils::calcCenterOfMass(*model, q, qdot, p_com, &v_com, false);
881 
882  EXPECT_TRUE(v_resp.success);
883  if (!v_resp.success)
884  {
885  ROS_ERROR_STREAM("" << v_resp.report);
886  }
887 
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);
892 
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);
896 }
897 
898 int main(int argc, char** argv)
899 {
900  testing::InitGoogleTest(&argc, argv);
901  ros::init(argc, argv, "kinematics_interface_test");
902 
903  ros::AsyncSpinner spinner(1);
904  spinner.start();
905  int ret = RUN_ALL_TESTS();
906  spinner.stop();
907  ros::shutdown();
908  return ret;
909 }
EIGEN_STRONG_INLINE double & x()
ServiceClient serviceClient(const std::string &service_name, bool persistent=false, const M_string &header_values=M_string())
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::VectorXd VectorNd
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()
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()
ROSCPP_DECL void shutdown()
EIGEN_STRONG_INLINE double & z()
#define ROS_ERROR_STREAM(args)
EIGEN_STRONG_INLINE double & z()
bool urdfReadFromString(const char *model_xml_string, ModelPtr model, bool floating_base, bool verbose=false)


rdl_ros_tools
Author(s):
autogenerated on Tue Apr 20 2021 02:25:40