kinematics_test_utils.h
Go to the documentation of this file.
1 
26 #ifndef TESSERACT_KINEMATICS_KIN_TEST_SUITE_H
27 #define TESSERACT_KINEMATICS_KIN_TEST_SUITE_H
28 
31 #include <gtest/gtest.h>
32 #include <fstream>
33 #include <yaml-cpp/yaml.h>
35 
43 
48 
49 #include <tesseract_urdf/urdf_parser.h>
50 #include <tesseract_common/utils.h>
52 
54 {
56 {
57  std::string path = locator.locateResource("package://tesseract_support/urdf/lbr_iiwa_14_r820.urdf")->getFilePath();
58  return tesseract_urdf::parseURDFFile(path, locator);
59 }
60 
63 {
64  std::string path =
65  locator.locateResource("package://tesseract_support/urdf/abb_irb2400_external_positioner.urdf")->getFilePath();
66  return tesseract_urdf::parseURDFFile(path, locator);
67 }
68 
71 {
72  std::string path =
73  locator.locateResource("package://tesseract_support/urdf/abb_irb2400_on_positioner.urdf")->getFilePath();
74  return tesseract_urdf::parseURDFFile(path, locator);
75 }
76 
78 {
79  std::string path = locator.locateResource("package://tesseract_support/urdf/abb_irb2400.urdf")->getFilePath();
80  return tesseract_urdf::parseURDFFile(path, locator);
81 }
82 
84 {
85  std::string path = locator.locateResource("package://tesseract_support/urdf/iiwa7.urdf")->getFilePath();
86  return tesseract_urdf::parseURDFFile(path, locator);
87 }
88 
90  double shoulder_offset,
91  double elbow_offset)
92 {
93  using namespace tesseract_scene_graph;
94 
95  auto sg = std::make_unique<SceneGraph>("universal_robot");
96  sg->addLink(Link("base_link"));
97  sg->addLink(Link("shoulder_link"));
98  sg->addLink(Link("upper_arm_link"));
99  sg->addLink(Link("forearm_link"));
100  sg->addLink(Link("wrist_1_link"));
101  sg->addLink(Link("wrist_2_link"));
102  sg->addLink(Link("wrist_3_link"));
103  sg->addLink(Link("ee_link"));
104  sg->addLink(Link("tool0"));
105 
106  {
107  Joint j("shoulder_pan_joint");
108  j.type = JointType::REVOLUTE;
109  j.parent_link_name = "base_link";
110  j.child_link_name = "shoulder_link";
111  j.axis = Eigen::Vector3d::UnitZ();
112  j.parent_to_joint_origin_transform.translation() = Eigen::Vector3d(0, 0, params.d1);
113  j.limits = std::make_shared<JointLimits>();
114  j.limits->lower = -2.0 * M_PI;
115  j.limits->upper = 2.0 * M_PI;
116  j.limits->velocity = 2.16;
117  j.limits->acceleration = 0.5 * j.limits->velocity;
118  sg->addJoint(j);
119  }
120 
121  {
122  Joint j("shoulder_lift_joint");
123  j.type = JointType::REVOLUTE;
124  j.parent_link_name = "shoulder_link";
125  j.child_link_name = "upper_arm_link";
126  j.axis = Eigen::Vector3d::UnitY();
127  j.parent_to_joint_origin_transform.translation() = Eigen::Vector3d(0, shoulder_offset, 0);
129  j.parent_to_joint_origin_transform * Eigen::AngleAxisd(M_PI_2, Eigen::Vector3d::UnitY());
130  j.limits = std::make_shared<JointLimits>();
131  j.limits->lower = -2.0 * M_PI;
132  j.limits->upper = 2.0 * M_PI;
133  j.limits->velocity = 2.16;
134  j.limits->acceleration = 0.5 * j.limits->velocity;
135  sg->addJoint(j);
136  }
137 
138  {
139  Joint j("elbow_joint");
140  j.type = JointType::REVOLUTE;
141  j.parent_link_name = "upper_arm_link";
142  j.child_link_name = "forearm_link";
143  j.axis = Eigen::Vector3d::UnitY();
144  j.parent_to_joint_origin_transform.translation() = Eigen::Vector3d(0, elbow_offset, -params.a2);
145  j.limits = std::make_shared<JointLimits>();
146  j.limits->lower = -2.0 * M_PI;
147  j.limits->upper = 2.0 * M_PI;
148  j.limits->velocity = 2.16;
149  j.limits->acceleration = 0.5 * j.limits->velocity;
150  sg->addJoint(j);
151  }
152 
153  {
154  Joint j("wrist_1_joint");
155  j.type = JointType::REVOLUTE;
156  j.parent_link_name = "forearm_link";
157  j.child_link_name = "wrist_1_link";
158  j.axis = Eigen::Vector3d::UnitY();
159  j.parent_to_joint_origin_transform.translation() = Eigen::Vector3d(0, 0, -params.a3);
161  j.parent_to_joint_origin_transform * Eigen::AngleAxisd(M_PI_2, Eigen::Vector3d::UnitY());
162  j.limits = std::make_shared<JointLimits>();
163  j.limits->lower = -2.0 * M_PI;
164  j.limits->upper = 2.0 * M_PI;
165  j.limits->velocity = 2.16;
166  j.limits->acceleration = 0.5 * j.limits->velocity;
167  sg->addJoint(j);
168  }
169 
170  {
171  Joint j("wrist_2_joint");
172  j.type = JointType::REVOLUTE;
173  j.parent_link_name = "wrist_1_link";
174  j.child_link_name = "wrist_2_link";
175  j.axis = Eigen::Vector3d::UnitZ();
176  j.parent_to_joint_origin_transform.translation() =
177  Eigen::Vector3d(0, params.d4 - elbow_offset - shoulder_offset, 0);
178  j.limits = std::make_shared<JointLimits>();
179  j.limits->lower = -2.0 * M_PI;
180  j.limits->upper = 2.0 * M_PI;
181  j.limits->velocity = 2.16;
182  j.limits->acceleration = 0.5 * j.limits->velocity;
183  sg->addJoint(j);
184  }
185 
186  {
187  Joint j("wrist_3_joint");
188  j.type = JointType::REVOLUTE;
189  j.parent_link_name = "wrist_2_link";
190  j.child_link_name = "wrist_3_link";
191  j.axis = Eigen::Vector3d::UnitY();
192  j.parent_to_joint_origin_transform.translation() = Eigen::Vector3d(0, 0, params.d5);
193  j.limits = std::make_shared<JointLimits>();
194  j.limits->lower = -2.0 * M_PI;
195  j.limits->upper = 2.0 * M_PI;
196  j.limits->velocity = 2.16;
197  j.limits->acceleration = 0.5 * j.limits->velocity;
198  sg->addJoint(j);
199  }
200 
201  {
202  Joint j("ee_fixed_joint");
203  j.type = JointType::FIXED;
204  j.parent_link_name = "wrist_3_link";
205  j.child_link_name = "ee_link";
206  j.parent_to_joint_origin_transform.translation() = Eigen::Vector3d(0, params.d6, 0);
208  j.parent_to_joint_origin_transform * Eigen::AngleAxisd(M_PI_2, Eigen::Vector3d::UnitZ());
209  sg->addJoint(j);
210  }
211 
212  {
213  Joint j("wrist_3_link-tool0_fixed_joint");
214  j.type = JointType::FIXED;
215  j.parent_link_name = "wrist_3_link";
216  j.child_link_name = "tool0";
217  j.parent_to_joint_origin_transform.translation() = Eigen::Vector3d(0, params.d6, 0);
219  j.parent_to_joint_origin_transform * Eigen::AngleAxisd(-M_PI_2, Eigen::Vector3d::UnitX());
220  sg->addJoint(j);
221  }
222 
223  return sg;
224 }
225 
227  const std::vector<std::string>& joint_names)
228 {
229  auto s = static_cast<Eigen::Index>(joint_names.size());
230 
232  limits.resize(s);
233 
234  for (Eigen::Index i = 0; i < s; ++i)
235  {
236  auto joint = scene_graph.getJoint(joint_names[static_cast<std::size_t>(i)]);
237  limits.joint_limits(i, 0) = joint->limits->lower;
238  limits.joint_limits(i, 1) = joint->limits->upper;
239  limits.velocity_limits(i, 0) = -joint->limits->velocity;
240  limits.velocity_limits(i, 1) = joint->limits->velocity;
241  limits.acceleration_limits(i, 0) = -joint->limits->acceleration;
242  limits.acceleration_limits(i, 1) = joint->limits->acceleration;
243  limits.jerk_limits(i, 0) = -joint->limits->jerk;
244  limits.jerk_limits(i, 1) = joint->limits->jerk;
245  }
246 
247  return limits;
248 }
249 
261  const Eigen::VectorXd& jvals,
262  const std::string& link_name,
263  const Eigen::Vector3d& link_point,
264  const Eigen::Isometry3d& change_base)
265 {
266  Eigen::MatrixXd jacobian, numerical_jacobian;
268 
269  jacobian.resize(6, kin.numJoints());
270 
271  poses = kin.calcFwdKin(jvals);
272  jacobian = kin.calcJacobian(jvals, link_name);
273  tesseract_common::jacobianChangeBase(jacobian, change_base);
274  tesseract_common::jacobianChangeRefPoint(jacobian, (change_base * poses[link_name]).linear() * link_point);
275 
276  numerical_jacobian.resize(6, kin.numJoints());
277  tesseract_kinematics::numericalJacobian(numerical_jacobian, change_base, kin, jvals, link_name, link_point);
278 
279  for (int i = 0; i < 6; ++i)
280  for (int j = 0; j < static_cast<int>(kin.numJoints()); ++j)
281  EXPECT_NEAR(numerical_jacobian(i, j), jacobian(i, j), 1e-3);
282 }
283 
294  const Eigen::VectorXd& jvals,
295  const std::string& link_name,
296  const Eigen::Vector3d& link_point)
297 {
298  Eigen::MatrixXd jacobian, numerical_jacobian;
299  jacobian.resize(6, kin_group.numJoints());
300 
301  { // Test with all information
302  jacobian = kin_group.calcJacobian(jvals, link_name, link_point);
303 
304  numerical_jacobian.resize(6, kin_group.numJoints());
306  numerical_jacobian, Eigen::Isometry3d::Identity(), kin_group, jvals, link_name, link_point);
307 
308  for (int i = 0; i < 6; ++i)
309  for (int j = 0; j < static_cast<int>(kin_group.numJoints()); ++j)
310  EXPECT_NEAR(numerical_jacobian(i, j), jacobian(i, j), 1e-3);
311  }
312 
313  { // Test don't use link_point
314  jacobian = kin_group.calcJacobian(jvals, link_name);
315 
316  numerical_jacobian.resize(6, kin_group.numJoints());
318  numerical_jacobian, Eigen::Isometry3d::Identity(), kin_group, jvals, link_name, Eigen::Vector3d::Zero());
319 
320  for (int i = 0; i < 6; ++i)
321  for (int j = 0; j < static_cast<int>(kin_group.numJoints()); ++j)
322  EXPECT_NEAR(numerical_jacobian(i, j), jacobian(i, j), 1e-3);
323  }
324 
325  std::vector<std::string> static_link_names = kin_group.getStaticLinkNames();
326  tesseract_common::TransformMap poses = kin_group.calcFwdKin(jvals);
327  for (const auto& static_link_name : static_link_names)
328  {
329  { // Test with all information
330  jacobian = kin_group.calcJacobian(jvals, static_link_name, link_name, link_point);
331 
332  numerical_jacobian.resize(6, kin_group.numJoints());
334  numerical_jacobian, poses.at(static_link_name).inverse(), kin_group, jvals, link_name, link_point);
335 
336  for (int i = 0; i < 6; ++i)
337  for (int j = 0; j < static_cast<int>(kin_group.numJoints()); ++j)
338  EXPECT_NEAR(numerical_jacobian(i, j), jacobian(i, j), 1e-3);
339  }
340 
341  { // Test don't use link_point
342  jacobian = kin_group.calcJacobian(jvals, static_link_name, link_name);
343 
344  numerical_jacobian.resize(6, kin_group.numJoints());
345  tesseract_kinematics::numericalJacobian(numerical_jacobian,
346  poses.at(static_link_name).inverse(),
347  kin_group,
348  jvals,
349  link_name,
350  Eigen::Vector3d::Zero());
351 
352  for (int i = 0; i < 6; ++i)
353  for (int j = 0; j < static_cast<int>(kin_group.numJoints()); ++j)
354  EXPECT_NEAR(numerical_jacobian(i, j), jacobian(i, j), 1e-3);
355  }
356  }
357 }
358 
365  const tesseract_common::KinematicLimits& target_limits)
366 {
368  // Test forward kinematics joint limits
370  EXPECT_EQ(limits.joint_limits.rows(), target_limits.joint_limits.rows());
371  EXPECT_EQ(limits.velocity_limits.rows(), target_limits.velocity_limits.rows());
372  EXPECT_EQ(limits.acceleration_limits.rows(), target_limits.acceleration_limits.rows());
373  EXPECT_EQ(limits.jerk_limits.rows(), target_limits.jerk_limits.rows());
374 
375  // Check limits
376  for (Eigen::Index i = 0; i < limits.joint_limits.rows(); ++i)
377  {
378  EXPECT_NEAR(limits.joint_limits(i, 0), target_limits.joint_limits(i, 0), 1e-6);
379  EXPECT_NEAR(limits.joint_limits(i, 1), target_limits.joint_limits(i, 1), 1e-6);
380 
381  EXPECT_NEAR(limits.velocity_limits(i, 0), target_limits.velocity_limits(i, 0), 1e-6);
382  EXPECT_NEAR(limits.velocity_limits(i, 1), target_limits.velocity_limits(i, 1), 1e-6);
383 
384  EXPECT_NEAR(limits.acceleration_limits(i, 0), target_limits.acceleration_limits(i, 0), 1e-6);
385  EXPECT_NEAR(limits.acceleration_limits(i, 1), target_limits.acceleration_limits(i, 1), 1e-6);
386 
387  EXPECT_NEAR(limits.jerk_limits(i, 0), target_limits.jerk_limits(i, 0), 1e-6);
388  EXPECT_NEAR(limits.jerk_limits(i, 1), target_limits.jerk_limits(i, 1), 1e-6);
389  }
390 }
391 
397 {
399  // Test setting kinematic group joint limits
401  tesseract_common::KinematicLimits limits = kin_group.getLimits();
402  EXPECT_TRUE(limits.joint_limits.rows() > 0);
403  EXPECT_TRUE(limits.velocity_limits.rows() > 0);
404  EXPECT_TRUE(limits.acceleration_limits.rows() > 0);
405  EXPECT_TRUE(limits.jerk_limits.rows() > 0);
406 
407  // Check limits
408  for (Eigen::Index i = 0; i < limits.joint_limits.rows(); ++i)
409  {
410  limits.joint_limits(i, 0) = -5.0 - double(i);
411  limits.joint_limits(i, 1) = 5.0 + double(i);
412 
413  limits.velocity_limits(i, 0) = -10.0 - double(i);
414  limits.velocity_limits(i, 1) = 10.0 + double(i);
415 
416  limits.acceleration_limits(i, 0) = -5.0 - double(i);
417  limits.acceleration_limits(i, 1) = 5.0 + double(i);
418 
419  limits.jerk_limits(i, 0) = -5.0 - double(i);
420  limits.jerk_limits(i, 1) = 5.0 + double(i);
421  }
422 
423  kin_group.setLimits(limits);
424  runKinJointLimitsTest(kin_group.getLimits(), limits);
425 
426  // Test failure
428  EXPECT_ANY_THROW(kin_group.setLimits(limits_empty)); // NOLINT
429 }
430 
436 inline void runStringVectorEqualTest(const std::vector<std::string>& names,
437  const std::vector<std::string>& target_names)
438 {
439  EXPECT_EQ(names.size(), target_names.size());
440  EXPECT_FALSE(names.empty());
441  EXPECT_FALSE(target_names.empty());
442 
443  std::vector<std::string> v1 = names;
444  std::vector<std::string> v2 = target_names;
445  std::sort(v1.begin(), v1.end());
446  std::sort(v2.begin(), v2.end());
447  EXPECT_TRUE(std::equal(v1.begin(), v1.end(), v2.begin()));
448  // EXPECT_TRUE(tesseract_common::isIdentical(names, target_names, false));
449 }
450 
460  const Eigen::Isometry3d& target_pose,
461  const std::string& tip_link_name,
462  const Eigen::VectorXd& seed)
463 {
465  // Test Inverse kinematics
467  EXPECT_TRUE(inv_kin.getBaseLinkName() == fwd_kin.getBaseLinkName()); // This only works if they are equal
468  tesseract_common::TransformMap input{ std::make_pair(tip_link_name, target_pose) };
469  IKSolutions solutions = inv_kin.calcInvKin(input, seed);
470  EXPECT_TRUE(!solutions.empty());
471 
472  for (const auto& sol : solutions)
473  {
474  tesseract_common::TransformMap result_poses = fwd_kin.calcFwdKin(sol);
475  Eigen::Isometry3d result = result_poses[tip_link_name];
476  EXPECT_TRUE(target_pose.translation().isApprox(result.translation(), 1e-4));
477 
478  Eigen::Quaterniond rot_pose(target_pose.rotation());
479  Eigen::Quaterniond rot_result(result.rotation());
480  EXPECT_TRUE(rot_pose.isApprox(rot_result, 1e-3));
481  }
482 }
483 
491  const Eigen::Isometry3d& target_pose,
492  const std::string& working_frame,
493  const std::string& tip_link_name,
494  const Eigen::VectorXd& seed)
495 {
497  // Test Inverse kinematics
499  KinGroupIKInputs inputs{ KinGroupIKInput(target_pose, working_frame, tip_link_name) };
500  IKSolutions solutions = kin_group.calcInvKin(inputs, seed);
501  EXPECT_TRUE(!solutions.empty());
502 
503  for (const auto& sol : solutions)
504  {
505  tesseract_common::TransformMap result_poses = kin_group.calcFwdKin(sol);
506  Eigen::Isometry3d result = result_poses.at(working_frame).inverse() * result_poses[tip_link_name];
507  EXPECT_TRUE(target_pose.translation().isApprox(result.translation(), 1e-4));
508 
509  Eigen::Quaterniond rot_pose(target_pose.rotation());
510  Eigen::Quaterniond rot_result(result.rotation());
511  EXPECT_TRUE(rot_pose.isApprox(rot_result, 1e-3));
512  }
513 
514  EXPECT_TRUE(checkKinematics(kin_group));
515 }
516 
518 {
520  // Test forward kinematics when tip link is the base of the chain
522 
523  Eigen::VectorXd jvals;
524  jvals.resize(7);
525  jvals.setZero();
526 
527  tesseract_common::TransformMap poses = kin.calcFwdKin(jvals);
528 
529  EXPECT_EQ(poses.size(), 1);
530  Eigen::Isometry3d pose = poses.at("tool0");
531  Eigen::Isometry3d result;
532  result.setIdentity();
533  result.translation()[0] = 0;
534  result.translation()[1] = 0;
535  result.translation()[2] = 1.306;
536  EXPECT_TRUE(pose.isApprox(result));
537 }
538 
539 inline void runJacobianIIWATest(tesseract_kinematics::ForwardKinematics& kin, bool is_kin_tree = false)
540 {
541  UNUSED(is_kin_tree);
542  std::string tip_link = "tool0";
543  std::string base_link = "base_link";
544 
546  // Test forward kinematics when tip link is the base of the chain
548  Eigen::VectorXd jvals;
549  jvals.resize(7);
550 
551  jvals(0) = -0.785398;
552  jvals(1) = 0.785398;
553  jvals(2) = -0.785398;
554  jvals(3) = 0.785398;
555  jvals(4) = -0.785398;
556  jvals(5) = 0.785398;
557  jvals(6) = -0.785398;
558 
560  // Test Jacobian
562  Eigen::Vector3d link_point(0, 0, 0);
563  runJacobianTest(kin, jvals, tip_link, link_point, Eigen::Isometry3d::Identity());
564 
565  EXPECT_ANY_THROW(runJacobianTest(kin, jvals, "", link_point, Eigen::Isometry3d::Identity())); // NOLINT
566 
568  // Test Jacobian at Point
570  for (int k = 0; k < 3; ++k)
571  {
572  Eigen::Vector3d link_point(0, 0, 0);
573  link_point[k] = 1;
574 
575  runJacobianTest(kin, jvals, tip_link, link_point, Eigen::Isometry3d::Identity());
576 
577  EXPECT_ANY_THROW(runJacobianTest(kin, jvals, "", link_point, Eigen::Isometry3d::Identity())); // NOLINT
578  }
579 
581  // Test Jacobian with change base
583  for (int k = 0; k < 3; ++k)
584  {
585  link_point = Eigen::Vector3d(0, 0, 0);
586  Eigen::Isometry3d change_base;
587  change_base.setIdentity();
588  change_base(0, 0) = 0;
589  change_base(1, 0) = 1;
590  change_base(0, 1) = -1;
591  change_base(1, 1) = 0;
592  change_base.translation() = Eigen::Vector3d(0, 0, 0);
593  change_base.translation()[k] = 1;
594 
595  runJacobianTest(kin, jvals, tip_link, link_point, change_base);
596 
597  EXPECT_ANY_THROW(runJacobianTest(kin, jvals, "", link_point, change_base)); // NOLINT
598  }
599 
601  // Test Jacobian at point with change base
603  for (int k = 0; k < 3; ++k)
604  {
605  Eigen::Vector3d link_point(0, 0, 0);
606  link_point[k] = 1;
607 
608  Eigen::Isometry3d change_base;
609  change_base.setIdentity();
610  change_base(0, 0) = 0;
611  change_base(1, 0) = 1;
612  change_base(0, 1) = -1;
613  change_base(1, 1) = 0;
614  change_base.translation() = link_point;
615 
616  runJacobianTest(kin, jvals, tip_link, link_point, change_base);
617 
618  EXPECT_ANY_THROW(runJacobianTest(kin, jvals, "", link_point, change_base)); // NOLINT
619  }
620 }
621 
623 {
624  std::string base_link_name = "base_link";
625  std::vector<std::string> link_names = { "base_link", "link_1", "link_2", "link_3", "link_4",
626  "link_5", "link_6", "link_7", "tool0" };
627 
629  // Test forward kinematics when tip link is the base of the chain
631  Eigen::VectorXd jvals;
632  jvals.resize(7);
633 
634  jvals(0) = -0.785398;
635  jvals(1) = 0.785398;
636  jvals(2) = -0.785398;
637  jvals(3) = 0.785398;
638  jvals(4) = -0.785398;
639  jvals(5) = 0.785398;
640  jvals(6) = -0.785398;
641 
643  // Test Jacobian at Point
644  // This also runs a test without the link point
646  for (int k = 0; k < 3; ++k)
647  {
648  Eigen::Vector3d link_point(0, 0, 0);
649  link_point[k] = 1;
650 
651  for (const auto& link_name : link_names)
652  runJacobianTest(kin_group, jvals, link_name, link_point);
653 
654  // NOLINTNEXTLINE
655  EXPECT_ANY_THROW(runJacobianTest(kin_group, jvals, "", link_point));
656  }
657 }
658 
660 {
661  EXPECT_FALSE(kin_group.checkJoints(Eigen::VectorXd::Zero(8)));
662  EXPECT_FALSE(kin_group.checkJoints(Eigen::VectorXd::Constant(7, std::numeric_limits<double>::max())));
663  EXPECT_FALSE(kin_group.checkJoints(Eigen::VectorXd::Constant(7, -std::numeric_limits<double>::max())));
664  EXPECT_TRUE(kin_group.checkJoints(Eigen::VectorXd::Zero(7)));
665 
666  std::vector<std::string> target_active_link_names = { "link_1", "link_2", "link_3", "link_4",
667  "link_5", "link_6", "link_7", "tool0" };
668 
669  std::vector<std::string> target_static_link_names = { "base_link", "base" };
670 
671  std::vector<std::string> target_link_names = target_active_link_names;
672  target_link_names.insert(target_link_names.end(), target_static_link_names.begin(), target_static_link_names.end());
673 
674  for (const auto& l : target_active_link_names)
675  {
676  EXPECT_TRUE(kin_group.isActiveLinkName(l));
677  }
678 
679  for (const auto& l : target_link_names)
680  {
681  EXPECT_TRUE(kin_group.hasLinkName(l));
682  }
683 
684  {
685  std::vector<std::string> link_names = kin_group.getActiveLinkNames();
686  runStringVectorEqualTest(link_names, target_active_link_names);
687  }
688 
689  {
690  std::vector<std::string> link_names = kin_group.getStaticLinkNames();
691  runStringVectorEqualTest(link_names, target_static_link_names);
692  }
693 
694  {
695  std::vector<std::string> link_names = kin_group.getLinkNames();
696  runStringVectorEqualTest(link_names, target_link_names);
697  }
698 }
699 
701 {
702  EXPECT_FALSE(kin_group.checkJoints(Eigen::VectorXd::Zero(7)));
703  EXPECT_FALSE(kin_group.checkJoints(Eigen::VectorXd::Constant(6, std::numeric_limits<double>::max())));
704  EXPECT_FALSE(kin_group.checkJoints(Eigen::VectorXd::Constant(6, -std::numeric_limits<double>::max())));
705  EXPECT_TRUE(kin_group.checkJoints(Eigen::VectorXd::Zero(6)));
706 
707  std::vector<std::string> target_active_link_names = { "link_1", "link_2", "link_3", "link_4",
708  "link_5", "link_6", "tool0" };
709 
710  std::vector<std::string> target_static_link_names = { "base_link" };
711 
712  std::vector<std::string> target_link_names = target_active_link_names;
713  target_link_names.insert(target_link_names.end(), target_static_link_names.begin(), target_static_link_names.end());
714 
715  for (const auto& l : target_active_link_names)
716  {
717  EXPECT_TRUE(kin_group.isActiveLinkName(l));
718  }
719 
720  for (const auto& l : target_link_names)
721  {
722  EXPECT_TRUE(kin_group.hasLinkName(l));
723  }
724 
725  {
726  std::vector<std::string> link_names = kin_group.getActiveLinkNames();
727  runStringVectorEqualTest(link_names, target_active_link_names);
728  }
729 
730  {
731  std::vector<std::string> link_names = kin_group.getStaticLinkNames();
732  runStringVectorEqualTest(link_names, target_static_link_names);
733  }
734 
735  {
736  std::vector<std::string> link_names = kin_group.getLinkNames();
737  runStringVectorEqualTest(link_names, target_link_names);
738  }
739 }
740 
742 {
743  EXPECT_FALSE(kin_group.checkJoints(Eigen::VectorXd::Zero(7)));
744  EXPECT_FALSE(kin_group.checkJoints(Eigen::VectorXd::Constant(6, std::numeric_limits<double>::max())));
745  EXPECT_FALSE(kin_group.checkJoints(Eigen::VectorXd::Constant(6, -std::numeric_limits<double>::max())));
746  EXPECT_TRUE(kin_group.checkJoints(Eigen::VectorXd::Zero(6)));
747 
748  std::vector<std::string> target_active_link_names = { "shoulder_link", "upper_arm_link", "forearm_link",
749  "wrist_1_link", "wrist_2_link", "wrist_3_link",
750  "tool0" };
751 
752  std::vector<std::string> target_static_link_names = { "base_link" };
753 
754  std::vector<std::string> target_link_names = target_active_link_names;
755  target_link_names.insert(target_link_names.end(), target_static_link_names.begin(), target_static_link_names.end());
756 
757  for (const auto& l : target_active_link_names)
758  {
759  EXPECT_TRUE(kin_group.isActiveLinkName(l));
760  }
761 
762  for (const auto& l : target_link_names)
763  {
764  EXPECT_TRUE(kin_group.hasLinkName(l));
765  }
766 
767  {
768  std::vector<std::string> link_names = kin_group.getActiveLinkNames();
769  runStringVectorEqualTest(link_names, target_active_link_names);
770  }
771 
772  {
773  std::vector<std::string> link_names = kin_group.getStaticLinkNames();
774  runStringVectorEqualTest(link_names, target_static_link_names);
775  }
776 
777  {
778  std::vector<std::string> link_names = kin_group.getLinkNames();
779  runStringVectorEqualTest(link_names, target_link_names);
780  }
781 }
782 
784 {
785  std::string base_link_name = "positioner_base_link";
786  std::vector<std::string> link_names{ "positioner_base_link",
787  "positioner_tool0",
788  "base",
789  "base_link",
790  "link_1",
791  "link_2",
792  "link_3",
793  "link_4",
794  "link_5",
795  "link_6",
796  "tool0" };
797 
799  // Test forward kinematics when tip link is the base of the chain
801  Eigen::MatrixXd jacobian, numerical_jacobian;
802  Eigen::VectorXd jvals;
803  jvals.resize(7);
804 
805  jvals(0) = -0.785398;
806  jvals(1) = 0.785398;
807  jvals(2) = -0.785398;
808  jvals(3) = 0.785398;
809  jvals(4) = -0.785398;
810  jvals(5) = 0.785398;
811  jvals(6) = -0.785398;
812 
814  // Test Jacobian at Point
815  // Note: Also tests without the link point
817  for (int k = 0; k < 3; ++k)
818  {
819  Eigen::Vector3d link_point(0, 0, 0);
820  link_point[k] = 1;
821 
822  for (const auto& link_name : link_names)
823  runJacobianTest(kin_group, jvals, link_name, link_point);
824 
825  // NOLINTNEXTLINE
826  EXPECT_ANY_THROW(runJacobianTest(kin_group, jvals, "", link_point));
827  }
828 }
829 
831 {
832  EXPECT_FALSE(kin_group.checkJoints(Eigen::VectorXd::Zero(8)));
833  EXPECT_FALSE(kin_group.checkJoints(Eigen::VectorXd::Constant(7, std::numeric_limits<double>::max())));
834  EXPECT_FALSE(kin_group.checkJoints(Eigen::VectorXd::Constant(7, -std::numeric_limits<double>::max())));
835  EXPECT_TRUE(kin_group.checkJoints(Eigen::VectorXd::Zero(7)));
836 
837  std::vector<std::string> target_active_link_names = { "positioner_tool0", "base_link", "base", "link_1", "link_2",
838  "link_3", "link_4", "link_5", "link_6", "tool0" };
839 
840  std::vector<std::string> target_static_link_names = { "positioner_base_link" };
841 
842  std::vector<std::string> target_link_names = target_active_link_names;
843  target_link_names.insert(target_link_names.end(), target_static_link_names.begin(), target_static_link_names.end());
844 
845  for (const auto& l : target_active_link_names)
846  {
847  EXPECT_TRUE(kin_group.isActiveLinkName(l));
848  }
849 
850  for (const auto& l : target_link_names)
851  {
852  EXPECT_TRUE(kin_group.hasLinkName(l));
853  }
854 
855  {
856  std::vector<std::string> link_names = kin_group.getActiveLinkNames();
857  runStringVectorEqualTest(link_names, target_active_link_names);
858  }
859 
860  {
861  std::vector<std::string> link_names = kin_group.getStaticLinkNames();
862  runStringVectorEqualTest(link_names, target_static_link_names);
863  }
864 
865  {
866  std::vector<std::string> link_names = kin_group.getLinkNames();
867  runStringVectorEqualTest(link_names, target_link_names);
868  }
869 }
870 
872 {
873  std::string base_link_name = "positioner_base_link";
874  std::vector<std::string> link_names{ "positioner_base_link",
875  "positioner_tool0",
876  "positioner_link_1",
877  "base_link",
878  "link_1",
879  "link_2",
880  "link_3",
881  "link_4",
882  "link_5",
883  "link_6",
884  "tool0" };
885 
887  // Test forward kinematics when tip link is the base of the chain
889  Eigen::MatrixXd jacobian, numerical_jacobian;
890  Eigen::VectorXd jvals;
891  jvals.resize(8);
892 
893  jvals(0) = -0.785398;
894  jvals(1) = 0.785398;
895  jvals(2) = -0.785398;
896  jvals(3) = 0.785398;
897  jvals(4) = -0.785398;
898  jvals(5) = 0.785398;
899  jvals(6) = -0.785398;
900  jvals(7) = 0.785398;
901 
903  // Test Jacobian at Point
904  // Note: Also tests without the link point
906  for (int k = 0; k < 3; ++k)
907  {
908  Eigen::Vector3d link_point(0, 0, 0);
909  link_point[k] = 1;
910 
911  for (const auto& link_name : link_names)
912  runJacobianTest(kin_group, jvals, link_name, link_point);
913 
914  // NOLINTNEXTLINE
915  EXPECT_ANY_THROW(runJacobianTest(kin_group, jvals, "", link_point));
916  }
917 }
918 
920 {
921  EXPECT_FALSE(kin_group.checkJoints(Eigen::VectorXd::Zero(9)));
922  EXPECT_FALSE(kin_group.checkJoints(Eigen::VectorXd::Constant(8, std::numeric_limits<double>::max())));
923  EXPECT_FALSE(kin_group.checkJoints(Eigen::VectorXd::Constant(8, -std::numeric_limits<double>::max())));
924  EXPECT_TRUE(kin_group.checkJoints(Eigen::VectorXd::Zero(8)));
925 
926  std::vector<std::string> target_active_link_names = {
927  "positioner_tool0", "positioner_link_1", "link_1", "link_2", "link_3", "link_4", "link_5", "link_6", "tool0"
928  };
929 
930  std::vector<std::string> target_static_link_names = { "world", "base_link", "base", "positioner_base_link" };
931 
932  std::vector<std::string> target_link_names = target_active_link_names;
933  target_link_names.insert(target_link_names.end(), target_static_link_names.begin(), target_static_link_names.end());
934 
935  for (const auto& l : target_active_link_names)
936  {
937  EXPECT_TRUE(kin_group.isActiveLinkName(l));
938  }
939 
940  for (const auto& l : target_link_names)
941  {
942  EXPECT_TRUE(kin_group.hasLinkName(l));
943  }
944 
945  {
946  std::vector<std::string> link_names = kin_group.getActiveLinkNames();
947  runStringVectorEqualTest(link_names, target_active_link_names);
948  }
949 
950  {
951  std::vector<std::string> link_names = kin_group.getStaticLinkNames();
952  runStringVectorEqualTest(link_names, target_static_link_names);
953  }
954 
955  {
956  std::vector<std::string> link_names = kin_group.getLinkNames();
957  runStringVectorEqualTest(link_names, target_link_names);
958  }
959 }
960 
962  const std::string& inv_factory_name,
963  const std::string& fwd_factory_name)
964 {
967  std::string manip_name = "manip";
968  std::string base_link_name = "base_link";
969  std::string tip_link_name = "tool0";
970  std::vector<std::string> joint_names{ "joint_a1", "joint_a2", "joint_a3", "joint_a4",
971  "joint_a5", "joint_a6", "joint_a7" };
972  std::vector<std::string> joint_link_names{ "link_1", "link_2", "link_3", "link_4", "link_5", "link_6", "link_7" };
973  tesseract_common::KinematicLimits target_limits = getTargetLimits(*scene_graph, joint_names);
974 
975  tesseract_scene_graph::KDLStateSolver state_solver(*scene_graph);
976  tesseract_scene_graph::SceneState scene_state = state_solver.getState();
977 
978  tesseract_common::PluginInfo fwd_plugin_info;
979  fwd_plugin_info.class_name = fwd_factory_name;
980  fwd_plugin_info.config["base_link"] = base_link_name;
981  fwd_plugin_info.config["tip_link"] = tip_link_name;
982 
983  tesseract_common::PluginInfo inv_plugin_info;
984  inv_plugin_info.class_name = inv_factory_name;
985  inv_plugin_info.config = fwd_plugin_info.config;
986 
987  // Inverse target pose and seed
988  Eigen::Isometry3d pose;
989  pose.setIdentity();
990  pose.translation()[0] = 0;
991  pose.translation()[1] = 0;
992  pose.translation()[2] = 1.306;
993 
994  Eigen::VectorXd seed;
995  seed.resize(7);
996  seed(0) = -0.785398;
997  seed(1) = 0.785398;
998  seed(2) = -0.785398;
999  seed(3) = 0.785398;
1000  seed(4) = -0.785398;
1001  seed(5) = 0.785398;
1002  seed(6) = -0.785398;
1003 
1004  // Check create method with empty scene graph
1005  tesseract_scene_graph::SceneGraph scene_graph_empty;
1006  auto kin_empty = factory.createInvKin(inv_factory_name, inv_plugin_info, scene_graph_empty, scene_state);
1007  EXPECT_TRUE(kin_empty == nullptr);
1008 
1009  { // Check create method using base_link and tool0
1010  auto fwd_kin = factory.createFwdKin(fwd_factory_name, fwd_plugin_info, *scene_graph, scene_state);
1011  EXPECT_TRUE(fwd_kin != nullptr);
1012  // EXPECT_EQ(fwd_kin->getSolverName(), fwd_solver_name);
1013  EXPECT_EQ(fwd_kin->numJoints(), 7);
1014  EXPECT_EQ(fwd_kin->getBaseLinkName(), base_link_name);
1015  EXPECT_EQ(fwd_kin->getTipLinkNames().size(), 1);
1016  EXPECT_EQ(fwd_kin->getTipLinkNames()[0], tip_link_name);
1017  EXPECT_EQ(fwd_kin->getJointNames(), joint_names);
1018 
1019  runJacobianIIWATest(*fwd_kin);
1020  runFwdKinIIWATest(*fwd_kin);
1021 
1022  auto inv_kin = factory.createInvKin(inv_factory_name, inv_plugin_info, *scene_graph, scene_state);
1023  EXPECT_TRUE(inv_kin != nullptr);
1024  // EXPECT_EQ(inv_kin->getSolverName(), inv_solver_name);
1025  EXPECT_EQ(inv_kin->numJoints(), 7);
1026  EXPECT_EQ(inv_kin->getBaseLinkName(), base_link_name);
1027  EXPECT_EQ(inv_kin->getWorkingFrame(), base_link_name);
1028  EXPECT_EQ(inv_kin->getTipLinkNames().size(), 1);
1029  EXPECT_EQ(inv_kin->getTipLinkNames()[0], tip_link_name);
1030  EXPECT_EQ(inv_kin->getJointNames(), joint_names);
1031 
1032  runInvKinTest(*inv_kin, *fwd_kin, pose, tip_link_name, seed);
1033 
1034  KinematicGroup kin_group(manip_name, joint_names, std::move(inv_kin), *scene_graph, scene_state);
1035  EXPECT_EQ(kin_group.getBaseLinkName(), scene_graph->getRoot());
1036  runInvKinTest(kin_group, pose, base_link_name, tip_link_name, seed);
1037  runKinGroupJacobianIIWATest(kin_group);
1038  runActiveLinkNamesIIWATest(kin_group);
1039  runKinJointLimitsTest(kin_group.getLimits(), target_limits);
1040  runKinSetJointLimitsTest(kin_group);
1041  EXPECT_EQ(kin_group.getRedundancyCapableJointIndices(), std::vector<Eigen::Index>({ 0, 1, 2, 3, 4, 5, 6 }));
1042  }
1043 
1044  { // Check cloned
1045  auto fwd_kin = factory.createFwdKin(fwd_factory_name, fwd_plugin_info, *scene_graph, scene_state);
1046  EXPECT_TRUE(fwd_kin != nullptr);
1047  auto fwd_kin3 = fwd_kin->clone();
1048  // EXPECT_EQ(fwd_kin3->getSolverName(), fwd_solver_name);
1049  EXPECT_EQ(fwd_kin3->numJoints(), 7);
1050  EXPECT_EQ(fwd_kin3->getBaseLinkName(), base_link_name);
1051  EXPECT_EQ(fwd_kin3->getTipLinkNames().size(), 1);
1052  EXPECT_EQ(fwd_kin3->getTipLinkNames()[0], tip_link_name);
1053  EXPECT_EQ(fwd_kin3->getJointNames(), joint_names);
1054 
1055  runJacobianIIWATest(*fwd_kin3);
1056  runFwdKinIIWATest(*fwd_kin3);
1057 
1058  auto inv_kin = factory.createInvKin(inv_factory_name, inv_plugin_info, *scene_graph, scene_state);
1059  auto inv_kin3 = inv_kin->clone();
1060  EXPECT_TRUE(inv_kin3 != nullptr);
1061  // EXPECT_EQ(inv_kin3->getSolverName(), inv_solver_name);
1062  EXPECT_EQ(inv_kin3->numJoints(), 7);
1063  EXPECT_EQ(inv_kin3->getBaseLinkName(), base_link_name);
1064  EXPECT_EQ(inv_kin3->getWorkingFrame(), base_link_name);
1065  EXPECT_EQ(inv_kin3->getTipLinkNames().size(), 1);
1066  EXPECT_EQ(inv_kin3->getTipLinkNames()[0], tip_link_name);
1067  EXPECT_EQ(inv_kin3->getJointNames(), joint_names);
1068 
1069  runInvKinTest(*inv_kin3, *fwd_kin3, pose, tip_link_name, seed);
1070 
1071  KinematicGroup kin_group(manip_name, joint_names, std::move(inv_kin3), *scene_graph, scene_state);
1072  EXPECT_EQ(kin_group.getBaseLinkName(), scene_graph->getRoot());
1073  runInvKinTest(kin_group, pose, base_link_name, tip_link_name, seed);
1074  runKinGroupJacobianIIWATest(kin_group);
1075  runActiveLinkNamesIIWATest(kin_group);
1076  runKinJointLimitsTest(kin_group.getLimits(), target_limits);
1077  runKinSetJointLimitsTest(kin_group);
1078  EXPECT_EQ(kin_group.getRedundancyCapableJointIndices(), std::vector<Eigen::Index>({ 0, 1, 2, 3, 4, 5, 6 }));
1079  }
1080 
1081  fwd_plugin_info.config["base_link"] = "missing_link";
1082  fwd_plugin_info.config["tip_link"] = tip_link_name;
1083  inv_plugin_info.config = fwd_plugin_info.config;
1084 
1085  { // Test forward kinematics failure
1086 
1087  auto fwd_kin = factory.createFwdKin(fwd_factory_name, fwd_plugin_info, *scene_graph, scene_state);
1088  EXPECT_TRUE(fwd_kin == nullptr);
1089  }
1090 
1091  { // Inverse Kinematics Test failure
1092  auto inv_kin = factory.createInvKin(inv_factory_name, inv_plugin_info, *scene_graph, scene_state);
1093  EXPECT_TRUE(inv_kin == nullptr);
1094  }
1095 }
1096 
1097 } // namespace tesseract_kinematics::test_suite
1098 #endif // TESSERACT_KINEMATICS_KIN_TEST_SUITE_H
tesseract_scene_graph::KDLStateSolver::getState
SceneState getState() const override final
tesseract_kinematics::test_suite::runKinJointLimitsTest
void runKinJointLimitsTest(const tesseract_common::KinematicLimits &limits, const tesseract_common::KinematicLimits &target_limits)
Run kinematic limits test.
Definition: kinematics_test_utils.h:364
graph.h
tesseract_kinematics::JointGroup::calcJacobian
Eigen::MatrixXd calcJacobian(const Eigen::Ref< const Eigen::VectorXd > &joint_angles, const std::string &link_name) const
Calculated jacobian of robot given joint angles.
Definition: joint_group.cpp:133
tesseract_kinematics::ForwardKinematics
Forward kinematics functions.
Definition: forward_kinematics.h:43
tesseract_kinematics::test_suite::runStringVectorEqualTest
void runStringVectorEqualTest(const std::vector< std::string > &names, const std::vector< std::string > &target_names)
Check if two vectors of strings are equal but ignore order.
Definition: kinematics_test_utils.h:436
tesseract_kinematics::KinGroupIKInput
Structure containing the data required to solve inverse kinematics.
Definition: kinematic_group.h:48
tesseract_kinematics::test_suite::runFwdKinIIWATest
void runFwdKinIIWATest(tesseract_kinematics::ForwardKinematics &kin)
Definition: kinematics_test_utils.h:517
tesseract_kinematics::JointGroup::isActiveLinkName
bool isActiveLinkName(const std::string &link_name) const
Check if link is an active link.
Definition: joint_group.cpp:275
tesseract_kinematics::JointGroup::numJoints
Eigen::Index numJoints() const
Number of joints in robot.
Definition: joint_group.cpp:299
UNUSED
#define UNUSED(x)
tesseract_common::KinematicLimits::resize
void resize(Eigen::Index size)
kdl_state_solver.h
types.h
Kinematics types.
tesseract_kinematics::test_suite::runKinGroupJacobianIIWATest
void runKinGroupJacobianIIWATest(tesseract_kinematics::KinematicGroup &kin_group)
Definition: kinematics_test_utils.h:622
tesseract_kinematics::test_suite::runActiveLinkNamesABBTest
void runActiveLinkNamesABBTest(const tesseract_kinematics::KinematicGroup &kin_group)
Definition: kinematics_test_utils.h:700
tesseract_kinematics::numericalJacobian
void numericalJacobian(Eigen::Ref< Eigen::MatrixXd > jacobian, const Eigen::Isometry3d &change_base, const tesseract_kinematics::ForwardKinematics &kin, const Eigen::Ref< const Eigen::VectorXd > &joint_values, const std::string &link_name, const Eigen::Ref< const Eigen::Vector3d > &link_point)
Numerically calculate a jacobian. This is mainly used for testing.
Definition: utils.cpp:38
utils.h
tesseract_kinematics::ForwardKinematics::getBaseLinkName
virtual std::string getBaseLinkName() const =0
Get the robot base link name.
tesseract_kinematics::JointGroup::getStaticLinkNames
std::vector< std::string > getStaticLinkNames() const
Get list of static link names (with and without geometry) for kinematic object.
Definition: joint_group.cpp:273
tesseract_common::KinematicLimits
tesseract_kinematics::test_suite::runActiveLinkNamesURTest
void runActiveLinkNamesURTest(const tesseract_kinematics::KinematicGroup &kin_group)
Definition: kinematics_test_utils.h:741
tesseract_kinematics::JointGroup::hasLinkName
bool hasLinkName(const std::string &link_name) const
Check if link name exists.
Definition: joint_group.cpp:280
tesseract_kinematics::InverseKinematics::calcInvKin
virtual IKSolutions calcInvKin(const tesseract_common::TransformMap &tip_link_poses, const Eigen::Ref< const Eigen::VectorXd > &seed) const =0
Calculates joint solutions given a pose for each tip link.
resource_locator.h
tesseract_kinematics::test_suite::getSceneGraphUR
tesseract_scene_graph::SceneGraph::UPtr getSceneGraphUR(const tesseract_kinematics::URParameters &params, double shoulder_offset, double elbow_offset)
Definition: kinematics_test_utils.h:89
tesseract_common::TransformMap
AlignedMap< std::string, Eigen::Isometry3d > TransformMap
tesseract_common::jacobianChangeRefPoint
void jacobianChangeRefPoint(Eigen::Ref< Eigen::MatrixXd > jacobian, const Eigen::Ref< const Eigen::Vector3d > &ref_point)
tesseract_kinematics::checkKinematics
bool checkKinematics(const KinematicGroup &manip, double tol=1e-3)
This compares calcFwdKin to calcInvKin for a KinematicGroup.
Definition: validate.cpp:40
tesseract_kinematics::URParameters::d5
double d5
Definition: types.h:53
tesseract_common::ResourceLocator::locateResource
virtual std::shared_ptr< Resource > locateResource(const std::string &url) const=0
joint.h
tesseract_kinematics::JointGroup::getBaseLinkName
std::string getBaseLinkName() const
Get the robot base link name.
Definition: joint_group.cpp:301
tesseract_scene_graph::Joint::parent_to_joint_origin_transform
Eigen::Isometry3d parent_to_joint_origin_transform
tesseract_kinematics::test_suite::runActiveLinkNamesABBOnPositionerTest
void runActiveLinkNamesABBOnPositionerTest(const tesseract_kinematics::KinematicGroup &kin_group)
Definition: kinematics_test_utils.h:830
inverse_kinematics.h
Inverse kinematics functions.
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
#define TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
tesseract_kinematics::test_suite::runActiveLinkNamesIIWATest
void runActiveLinkNamesIIWATest(const tesseract_kinematics::KinematicGroup &kin_group)
Definition: kinematics_test_utils.h:659
tesseract_scene_graph::Joint::axis
Eigen::Vector3d axis
tesseract_scene_graph::SceneGraph
tesseract_common::KinematicLimits::jerk_limits
Eigen::MatrixX2d jerk_limits
tesseract_scene_graph::SceneGraph::UPtr
std::unique_ptr< SceneGraph > UPtr
tesseract_kinematics::test_suite::getSceneGraphABBExternalPositioner
tesseract_scene_graph::SceneGraph::UPtr getSceneGraphABBExternalPositioner(const tesseract_common::ResourceLocator &locator)
Definition: kinematics_test_utils.h:62
tesseract_kinematics::URParameters::d6
double d6
Definition: types.h:54
tesseract_kinematics::test_suite::getSceneGraphIIWA
tesseract_scene_graph::SceneGraph::UPtr getSceneGraphIIWA(const tesseract_common::ResourceLocator &locator)
Definition: kinematics_test_utils.h:55
tesseract_kinematics::KinGroupIKInputs
tesseract_common::AlignedVector< KinGroupIKInput > KinGroupIKInputs
Definition: kinematic_group.h:73
tesseract_scene_graph::SceneState
tesseract_common::PluginInfo::class_name
std::string class_name
tesseract_kinematics::test_suite::getTargetLimits
tesseract_common::KinematicLimits getTargetLimits(const tesseract_scene_graph::SceneGraph &scene_graph, const std::vector< std::string > &joint_names)
Definition: kinematics_test_utils.h:226
utils.h
Kinematics utility functions.
tesseract_kinematics::URParameters::d4
double d4
Definition: types.h:52
tesseract_kinematics::ForwardKinematics::numJoints
virtual Eigen::Index numJoints() const =0
Number of joints in robot.
tesseract_kinematics::URParameters
The Universal Robot kinematic parameters.
Definition: types.h:41
tesseract_scene_graph::Joint::child_link_name
std::string child_link_name
tesseract_scene_graph::Joint::limits
JointLimits::Ptr limits
tesseract_kinematics::JointGroup::getLinkNames
std::vector< std::string > getLinkNames() const
Get list of all link names (with and without geometry) for kinematic object.
Definition: joint_group.cpp:269
tesseract_kinematics::URParameters::a2
double a2
Definition: types.h:50
tesseract_scene_graph::KDLStateSolver
tesseract_kinematics::test_suite::runJacobianTest
void runJacobianTest(tesseract_kinematics::ForwardKinematics &kin, const Eigen::VectorXd &jvals, const std::string &link_name, const Eigen::Vector3d &link_point, const Eigen::Isometry3d &change_base)
Run a kinematic jacobian test.
Definition: kinematics_test_utils.h:260
tesseract_common::PluginInfo
tesseract_kinematics::InverseKinematics::getBaseLinkName
virtual std::string getBaseLinkName() const =0
Get the robot base link name.
tesseract_kinematics::KinematicsPluginFactory::createInvKin
std::unique_ptr< InverseKinematics > createInvKin(const std::string &group_name, const std::string &solver_name, const tesseract_scene_graph::SceneGraph &scene_graph, const tesseract_scene_graph::SceneState &scene_state) const
Get inverse kinematics object given group name and solver name.
Definition: kinematics_plugin_factory.cpp:290
tesseract_kinematics::KinematicGroup::calcInvKin
IKSolutions calcInvKin(const KinGroupIKInputs &tip_link_poses, const Eigen::Ref< const Eigen::VectorXd > &seed) const
Calculates joint solutions given a pose.
Definition: kinematic_group.cpp:210
tesseract_common::ResourceLocator
tesseract_kinematics::test_suite::runKinGroupJacobianABBExternalPositionerTest
void runKinGroupJacobianABBExternalPositionerTest(tesseract_kinematics::KinematicGroup &kin_group)
Definition: kinematics_test_utils.h:871
tesseract_kinematics::ForwardKinematics::calcFwdKin
virtual tesseract_common::TransformMap calcFwdKin(const Eigen::Ref< const Eigen::VectorXd > &joint_angles) const =0
Calculates the transform for each tip link in the kinematic group.
tesseract_kinematics::test_suite
Definition: kinematics_test_utils.h:53
tesseract_kinematics::test_suite::getSceneGraphABBOnPositioner
tesseract_scene_graph::SceneGraph::UPtr getSceneGraphABBOnPositioner(const tesseract_common::ResourceLocator &locator)
Definition: kinematics_test_utils.h:70
tesseract_kinematics::URParameters::a3
double a3
Definition: types.h:51
tesseract_kinematics::JointGroup::getActiveLinkNames
std::vector< std::string > getActiveLinkNames() const
Get list of active link names (with and without geometry) for kinematic object.
Definition: joint_group.cpp:271
tesseract_kinematics::URParameters::d1
double d1
Definition: types.h:49
forward_kinematics.h
Forward kinematics functions.
tesseract_common::PluginInfo::config
YAML::Node config
tesseract_kinematics::test_suite::getSceneGraphIIWA7
tesseract_scene_graph::SceneGraph::UPtr getSceneGraphIIWA7(const tesseract_common::ResourceLocator &locator)
Definition: kinematics_test_utils.h:83
tesseract_kinematics::test_suite::runKinGroupJacobianABBOnPositionerTest
void runKinGroupJacobianABBOnPositionerTest(tesseract_kinematics::KinematicGroup &kin_group)
Definition: kinematics_test_utils.h:783
tesseract_kinematics::JointGroup::getRedundancyCapableJointIndices
std::vector< Eigen::Index > getRedundancyCapableJointIndices() const
Get vector indicating which joints are capable of producing redundant solutions.
Definition: joint_group.cpp:297
tesseract_kinematics::test_suite::runJacobianIIWATest
void runJacobianIIWATest(tesseract_kinematics::ForwardKinematics &kin, bool is_kin_tree=false)
Definition: kinematics_test_utils.h:539
tesseract_scene_graph::Joint
tesseract_kinematics::ForwardKinematics::calcJacobian
virtual Eigen::MatrixXd calcJacobian(const Eigen::Ref< const Eigen::VectorXd > &joint_angles, const std::string &link_name) const =0
Calculates the Jacobian matrix for a given joint state in the reference frame of the specified link.
kinematic_group.h
A kinematic group with forward and inverse kinematics methods.
tesseract_kinematics::KinematicsPluginFactory::createFwdKin
std::unique_ptr< ForwardKinematics > createFwdKin(const std::string &group_name, const std::string &solver_name, const tesseract_scene_graph::SceneGraph &scene_graph, const tesseract_scene_graph::SceneState &scene_state) const
Get forward kinematics object given group name and solver name.
Definition: kinematics_plugin_factory.cpp:233
tesseract_kinematics::test_suite::runActiveLinkNamesABBExternalPositionerTest
void runActiveLinkNamesABBExternalPositionerTest(const tesseract_kinematics::KinematicGroup &kin_group)
Definition: kinematics_test_utils.h:919
tesseract_kinematics::InverseKinematics
Inverse kinematics functions.
Definition: inverse_kinematics.h:43
kinematics_plugin_factory.h
Kinematics Plugin Factory.
TESSERACT_COMMON_IGNORE_WARNINGS_POP
#define TESSERACT_COMMON_IGNORE_WARNINGS_POP
tesseract_kinematics::test_suite::runInvKinIIWATest
void runInvKinIIWATest(const tesseract_kinematics::KinematicsPluginFactory &factory, const std::string &inv_factory_name, const std::string &fwd_factory_name)
Definition: kinematics_test_utils.h:961
tesseract_scene_graph::SceneGraph::getJoint
std::shared_ptr< const Joint > getJoint(const std::string &name) const
tesseract_common::jacobianChangeBase
void jacobianChangeBase(Eigen::Ref< Eigen::MatrixXd > jacobian, const Eigen::Isometry3d &change_base)
tesseract_kinematics::JointGroup::checkJoints
bool checkJoints(const Eigen::Ref< const Eigen::VectorXd > &vec) const
Check for consistency in # and limits of joints.
Definition: joint_group.cpp:242
tesseract_kinematics::JointGroup::getLimits
tesseract_common::KinematicLimits getLimits() const
Get the kinematic limits (joint, velocity, acceleration, etc.)
Definition: joint_group.cpp:285
tesseract_common::KinematicLimits::acceleration_limits
Eigen::MatrixX2d acceleration_limits
validate.h
This contains utility function validate things like forward kinematics match inverse kinematics.
tesseract_common::KinematicLimits::velocity_limits
Eigen::MatrixX2d velocity_limits
tesseract_common::GeneralResourceLocator
tesseract_scene_graph::Joint::type
JointType type
tesseract_kinematics::JointGroup::calcFwdKin
tesseract_common::TransformMap calcFwdKin(const Eigen::Ref< const Eigen::VectorXd > &joint_angles) const
Calculates tool pose of robot chain.
Definition: joint_group.cpp:126
tesseract_kinematics::IKSolutions
std::vector< Eigen::VectorXd > IKSolutions
The inverse kinematics solutions container.
Definition: types.h:38
macros.h
tesseract_scene_graph::SceneGraph::Ptr
std::shared_ptr< SceneGraph > Ptr
tesseract_kinematics::KinematicsPluginFactory
Definition: kinematics_plugin_factory.h:116
tesseract_kinematics::test_suite::runInvKinTest
void runInvKinTest(const tesseract_kinematics::InverseKinematics &inv_kin, const tesseract_kinematics::ForwardKinematics &fwd_kin, const Eigen::Isometry3d &target_pose, const std::string &tip_link_name, const Eigen::VectorXd &seed)
Run inverse kinematics test comparing the inverse solution to the forward solution.
Definition: kinematics_test_utils.h:458
tesseract_kinematics::KinematicGroup
Definition: kinematic_group.h:75
tesseract_kinematics::test_suite::runKinSetJointLimitsTest
void runKinSetJointLimitsTest(tesseract_kinematics::KinematicGroup &kin_group)
Run kinematics setJointLimits function test.
Definition: kinematics_test_utils.h:396
tesseract_scene_graph
tesseract_common::KinematicLimits::joint_limits
EIGEN_MAKE_ALIGNED_OPERATOR_NEW Eigen::MatrixX2d joint_limits
tesseract_scene_graph::Joint::parent_link_name
std::string parent_link_name
tesseract_kinematics::JointGroup::setLimits
void setLimits(const tesseract_common::KinematicLimits &limits)
Setter for kinematic limits (joint, velocity, acceleration, etc.)
Definition: joint_group.cpp:287
tesseract_kinematics::test_suite::getSceneGraphABB
tesseract_scene_graph::SceneGraph::UPtr getSceneGraphABB(const tesseract_common::ResourceLocator &locator)
Definition: kinematics_test_utils.h:77


tesseract_kinematics
Author(s): Levi Armstrong
autogenerated on Sun May 18 2025 03:02:14