state_solver_test_suite.h
Go to the documentation of this file.
1 #ifndef TESSERACT_STATE_SOLVER_STATE_SOLVER_TEST_SUITE_H
2 #define TESSERACT_STATE_SOLVER_STATE_SOLVER_TEST_SUITE_H
3 
6 #include <gtest/gtest.h>
7 #include <algorithm>
8 #include <vector>
9 #include <tesseract_urdf/urdf_parser.h>
12 #include <tesseract_common/utils.h>
14 
19 
21 {
23 {
24  std::string path = locator.locateResource("package://tesseract_support/urdf/lbr_iiwa_14_r820.urdf")->getFilePath();
25  return tesseract_urdf::parseURDFFile(path, locator);
26 }
27 
29 {
30  auto subgraph = std::make_unique<SceneGraph>();
31  subgraph->setName("subgraph");
32 
33  // Now add a link to empty environment
34  auto visual = std::make_shared<Visual>();
35  visual->geometry = std::make_shared<tesseract_geometry::Box>(1, 1, 1);
36  auto collision = std::make_shared<Collision>();
37  collision->geometry = std::make_shared<tesseract_geometry::Box>(1, 1, 1);
38 
39  const std::string link_name1 = "subgraph_base_link";
40  const std::string link_name2 = "subgraph_link_1";
41  const std::string joint_name1 = "subgraph_joint1";
42  Link link_1(link_name1);
43  link_1.visual.push_back(visual);
44  link_1.collision.push_back(collision);
45  Link link_2(link_name2);
46 
47  Joint joint_1(joint_name1);
48  joint_1.parent_to_joint_origin_transform.translation()(0) = 1.25;
49  joint_1.parent_link_name = link_name1;
50  joint_1.child_link_name = link_name2;
51  joint_1.type = JointType::FIXED;
52 
53  subgraph->addLink(link_1);
54  subgraph->addLink(link_2);
55  subgraph->addJoint(joint_1);
56 
57  return subgraph;
58 }
59 
60 inline void runCompareSceneStates(const SceneState& base_state, const SceneState& compare_state)
61 {
62  EXPECT_EQ(base_state.joints.size(), compare_state.joints.size());
63  EXPECT_EQ(base_state.joint_transforms.size(), compare_state.joint_transforms.size());
64  EXPECT_EQ(base_state.link_transforms.size(), compare_state.link_transforms.size());
65 
66  for (const auto& pair : base_state.joints)
67  {
68  EXPECT_NEAR(pair.second, compare_state.joints.at(pair.first), 1e-6);
69  }
70 
71  for (const auto& pair : base_state.floating_joints)
72  {
73  EXPECT_TRUE(pair.second.isApprox(compare_state.floating_joints.at(pair.first), 1e-6));
74  }
75 
76  for (const auto& pair : base_state.joint_transforms)
77  {
78  EXPECT_TRUE(pair.second.isApprox(compare_state.joint_transforms.at(pair.first), 1e-6));
79  }
80 
81  for (const auto& link_pair : base_state.link_transforms)
82  {
83  EXPECT_TRUE(link_pair.second.isApprox(compare_state.link_transforms.at(link_pair.first), 1e-6));
84  }
85 }
86 
87 inline void runCompareStateSolver(const StateSolver& base_solver, StateSolver& comp_solver)
88 {
89  EXPECT_EQ(base_solver.getBaseLinkName(), comp_solver.getBaseLinkName());
90  EXPECT_TRUE(tesseract_common::isIdentical(base_solver.getJointNames(), comp_solver.getJointNames(), false));
91  EXPECT_TRUE(
92  tesseract_common::isIdentical(base_solver.getActiveJointNames(), comp_solver.getActiveJointNames(), false));
93  EXPECT_TRUE(tesseract_common::isIdentical(base_solver.getLinkNames(), comp_solver.getLinkNames(), false));
94  EXPECT_TRUE(tesseract_common::isIdentical(base_solver.getActiveLinkNames(), comp_solver.getActiveLinkNames(), false));
95  EXPECT_TRUE(tesseract_common::isIdentical(base_solver.getStaticLinkNames(), comp_solver.getStaticLinkNames(), false));
96  EXPECT_TRUE(
98 
99  for (const auto& active_link_name : base_solver.getActiveLinkNames())
100  {
101  EXPECT_TRUE(comp_solver.isActiveLinkName(active_link_name));
102  }
103 
104  for (const auto& link_name : base_solver.getLinkNames())
105  {
106  EXPECT_TRUE(comp_solver.hasLinkName(link_name));
107  }
108 
109  for (int i = 0; i < 10; ++i)
110  {
111  SceneState base_random_state;
112  SceneState comp_state_const;
113 
114  if (i < 3)
115  {
116  base_random_state = comp_solver.getRandomState();
117  comp_state_const = comp_solver.getState(base_random_state.joints);
118 
119  comp_solver.setState(base_random_state.joints);
120  }
121  else if (i < 6)
122  {
123  base_random_state = base_solver.getRandomState();
124  comp_state_const = comp_solver.getState(base_random_state.joints);
125 
126  std::vector<std::string> joint_names(base_random_state.joints.size());
127  Eigen::VectorXd joint_values(base_random_state.joints.size());
128  std::size_t j{ 0 };
129  for (const auto& joint : base_random_state.joints)
130  {
131  joint_names.at(j) = joint.first;
132  joint_values(static_cast<Eigen::Index>(j)) = joint.second;
133  ++j;
134  }
135  comp_solver.setState(joint_names, joint_values);
136  }
137  else if (i < 10)
138  {
139  base_random_state = base_solver.getRandomState();
140  comp_state_const = comp_solver.getState(base_random_state.joints);
141 
142  std::vector<std::string> joint_names = comp_solver.getActiveJointNames();
143  Eigen::VectorXd joint_values = base_random_state.getJointValues(joint_names);
144  comp_solver.setState(joint_values);
145  }
146 
147  const SceneState& comp_state = comp_solver.getState();
148 
149  runCompareSceneStates(base_random_state, comp_state_const);
150  runCompareSceneStates(base_random_state, comp_state);
151 
152  // Test differetn link transform methods
153  for (const auto& base_link_tf : base_random_state.link_transforms)
154  {
155  EXPECT_TRUE(base_link_tf.second.isApprox(comp_solver.getLinkTransform(base_link_tf.first), 1e-6));
156  }
157 
158  std::vector<std::string> comp_link_names = comp_solver.getLinkNames();
159  tesseract_common::VectorIsometry3d comp_link_tf = comp_solver.getLinkTransforms();
160  for (std::size_t j = 0; j < comp_link_names.size(); ++j)
161  {
162  EXPECT_TRUE(base_random_state.link_transforms[comp_link_names.at(j)].isApprox(comp_link_tf.at(j), 1e-6));
163  }
164 
165  for (const auto& from_link_name : comp_link_names)
166  {
167  for (const auto& to_link_name : comp_link_names)
168  {
169  Eigen::Isometry3d comp_tf = comp_solver.getRelativeLinkTransform(from_link_name, to_link_name);
170  Eigen::Isometry3d base_tf = base_random_state.link_transforms[from_link_name].inverse() *
171  base_random_state.link_transforms[to_link_name];
172  EXPECT_TRUE(base_tf.isApprox(comp_tf, 1e-6));
173  }
174  }
175  }
176 }
177 
178 inline void runCompareStateSolverLimits(const SceneGraph& scene_graph, const StateSolver& comp_solver)
179 {
180  std::vector<std::string> comp_joint_names = comp_solver.getActiveJointNames();
181  tesseract_common::KinematicLimits limits = comp_solver.getLimits();
182 
183  for (Eigen::Index i = 0; i < static_cast<Eigen::Index>(comp_joint_names.size()); ++i)
184  {
185  const auto& scene_joint = scene_graph.getJoint(comp_joint_names[static_cast<std::size_t>(i)]);
186  EXPECT_NEAR(limits.joint_limits(i, 0), scene_joint->limits->lower, 1e-5);
187  EXPECT_NEAR(limits.joint_limits(i, 1), scene_joint->limits->upper, 1e-5);
188  EXPECT_NEAR(limits.velocity_limits(i, 0), -scene_joint->limits->velocity, 1e-5);
189  EXPECT_NEAR(limits.velocity_limits(i, 1), scene_joint->limits->velocity, 1e-5);
190  EXPECT_NEAR(limits.acceleration_limits(i, 0), -scene_joint->limits->acceleration, 1e-5);
191  EXPECT_NEAR(limits.acceleration_limits(i, 1), scene_joint->limits->acceleration, 1e-5);
192  EXPECT_NEAR(limits.jerk_limits(i, 0), -scene_joint->limits->jerk, 1e-5);
193  EXPECT_NEAR(limits.jerk_limits(i, 1), scene_joint->limits->jerk, 1e-5);
194  }
195 }
196 
205 inline static void numericalJacobian(Eigen::Ref<Eigen::MatrixXd> jacobian,
206  const Eigen::Isometry3d& change_base,
207  const StateSolver& state_solver,
208  const std::vector<std::string>& joint_names,
209  const Eigen::Ref<const Eigen::VectorXd>& joint_values,
210  const std::string& link_name,
211  const Eigen::Ref<const Eigen::Vector3d>& link_point)
212 {
213  Eigen::VectorXd njvals;
214  double delta = 0.001;
216  if (joint_names.empty())
217  poses = state_solver.getState(joint_values).link_transforms;
218  else
219  poses = state_solver.getState(joint_names, joint_values).link_transforms;
220 
221  Eigen::Isometry3d pose = poses[link_name];
222  pose = change_base * pose;
223 
224  for (int i = 0; i < static_cast<int>(joint_values.size()); ++i)
225  {
226  njvals = joint_values;
227  njvals[i] += delta;
228  tesseract_common::TransformMap updated_poses;
229  if (joint_names.empty())
230  updated_poses = state_solver.getState(njvals).link_transforms;
231  else
232  updated_poses = state_solver.getState(joint_names, njvals).link_transforms;
233 
234  Eigen::Isometry3d updated_pose = updated_poses[link_name];
235  updated_pose = change_base * updated_pose;
236 
237  Eigen::Vector3d temp = pose * link_point;
238  Eigen::Vector3d temp2 = updated_pose * link_point;
239  jacobian(0, i) = (temp2.x() - temp.x()) / delta;
240  jacobian(1, i) = (temp2.y() - temp.y()) / delta;
241  jacobian(2, i) = (temp2.z() - temp.z()) / delta;
242 
243  Eigen::AngleAxisd r12(pose.rotation().transpose() * updated_pose.rotation()); // rotation from p1 -> p2
244  double theta = r12.angle();
245  theta = copysign(fmod(fabs(theta), 2.0 * M_PI), theta);
246  if (theta < -M_PI)
247  theta = theta + 2. * M_PI;
248  if (theta > M_PI)
249  theta = theta - 2. * M_PI;
250  Eigen::VectorXd omega = (pose.rotation() * r12.axis() * theta) / delta;
251  jacobian(3, i) = omega(0);
252  jacobian(4, i) = omega(1);
253  jacobian(5, i) = omega(2);
254  }
255 }
256 
267 inline void runCompareJacobian(StateSolver& state_solver,
268  const std::vector<std::string>& joint_names,
269  const Eigen::VectorXd& jvals,
270  const std::string& link_name,
271  const Eigen::Vector3d& link_point,
272  const Eigen::Isometry3d& change_base)
273 {
274  Eigen::MatrixXd jacobian, numerical_jacobian;
275  jacobian.resize(6, jvals.size());
276 
278 
279  // The numerical jacobian orders things base on the provided joint list
280  // The order needs to be calculated to compare
281  std::vector<std::string> solver_jn = state_solver.getActiveJointNames();
282  std::vector<long> order;
283  order.reserve(solver_jn.size());
284  if (joint_names.empty())
285  {
286  for (int i = 0; i < static_cast<int>(solver_jn.size()); ++i)
287  order.push_back(i);
288 
289  poses = state_solver.getState(jvals).link_transforms;
290  jacobian = state_solver.getJacobian(jvals, link_name);
291  }
292  else
293  {
294  for (const auto& joint_name : solver_jn)
295  order.push_back(
296  std::distance(joint_names.begin(), std::find(joint_names.begin(), joint_names.end(), joint_name)));
297 
298  poses = state_solver.getState(joint_names, jvals).link_transforms;
299  jacobian = state_solver.getJacobian(joint_names, jvals, link_name);
300  }
301 
302  tesseract_common::jacobianChangeBase(jacobian, change_base);
303  tesseract_common::jacobianChangeRefPoint(jacobian, (change_base * poses[link_name]).linear() * link_point);
304 
305  numerical_jacobian.resize(6, jvals.size());
306  numericalJacobian(numerical_jacobian, change_base, state_solver, joint_names, jvals, link_name, link_point);
307 
308  for (int i = 0; i < 6; ++i)
309  {
310  for (int j = 0; j < static_cast<int>(jvals.size()); ++j)
311  {
312  EXPECT_NEAR(numerical_jacobian(i, order[static_cast<std::size_t>(j)]), jacobian(i, j), 1e-3);
313  }
314  }
315 }
316 
317 inline void runCompareJacobian(StateSolver& state_solver,
318  const std::unordered_map<std::string, double>& joints_values,
319  const std::string& link_name,
320  const Eigen::Vector3d& link_point,
321  const Eigen::Isometry3d& change_base)
322 {
323  Eigen::MatrixXd jacobian, numerical_jacobian;
324  jacobian.resize(6, static_cast<Eigen::Index>(joints_values.size()));
325 
326  std::vector<std::string> joint_names;
327  Eigen::VectorXd jvals(joints_values.size());
328  Eigen::Index j{ 0 };
329  for (const auto& jv : joints_values)
330  {
331  joint_names.push_back(jv.first);
332  jvals(j++) = jv.second;
333  }
334 
336 
337  // The numerical jacobian orders things base on the provided joint list
338  // The order needs to be calculated to compare
339  std::vector<std::string> solver_jn = state_solver.getActiveJointNames();
340  std::vector<long> order;
341  order.reserve(solver_jn.size());
342  for (const auto& joint_name : solver_jn)
343  order.push_back(std::distance(joint_names.begin(), std::find(joint_names.begin(), joint_names.end(), joint_name)));
344 
345  poses = state_solver.getState(joints_values).link_transforms;
346  jacobian = state_solver.getJacobian(joints_values, link_name);
347 
348  tesseract_common::jacobianChangeBase(jacobian, change_base);
349  tesseract_common::jacobianChangeRefPoint(jacobian, (change_base * poses[link_name]).linear() * link_point);
350 
351  numerical_jacobian.resize(6, static_cast<Eigen::Index>(joints_values.size()));
352  numericalJacobian(numerical_jacobian, change_base, state_solver, joint_names, jvals, link_name, link_point);
353 
354  for (int i = 0; i < 6; ++i)
355  {
356  for (int j = 0; j < static_cast<int>(jvals.size()); ++j)
357  {
358  EXPECT_NEAR(numerical_jacobian(i, order[static_cast<std::size_t>(j)]), jacobian(i, j), 1e-3);
359  }
360  }
361 }
362 
363 template <typename S>
364 inline void runJacobianTest()
365 {
366  // Get the scene graph
368  auto scene_graph = getSceneGraph(locator);
369  auto state_solver = S(*scene_graph);
370  StateSolver::UPtr state_solver_clone = state_solver.clone();
371 
372  std::vector<std::string> joint_names_empty;
373  std::vector<std::string> link_names = { "base_link", "link_1", "link_2", "link_3", "link_4",
374  "link_5", "link_6", "link_7", "tool0" };
375 
377  // Test forward kinematics when tip link is the base of the chain
379  Eigen::VectorXd jvals;
380  jvals.resize(7);
381 
382  // jvals(0) = -0.785398;
383  // jvals(1) = 0.785398;
384  // jvals(2) = -0.785398;
385  // jvals(3) = 0.785398;
386  // jvals(4) = -0.785398;
387  // jvals(5) = 0.785398;
388  // jvals(6) = -0.785398;
389  jvals(0) = -0.1;
390  jvals(1) = 0.2;
391  jvals(2) = -0.3;
392  jvals(3) = 0.4;
393  jvals(4) = -0.5;
394  jvals(5) = 0.6;
395  jvals(6) = -0.7;
396 
397  std::unordered_map<std::string, double> jv_map;
398  for (Eigen::Index i = 0; i < jvals.rows(); ++i)
399  jv_map["joint_a" + std::to_string(i + 1)] = jvals(i);
400 
402  // Test Jacobian
404  {
405  Eigen::Vector3d link_point(0, 0, 0);
406  for (const auto& link_name : link_names)
407  {
408  runCompareJacobian(state_solver, joint_names_empty, jvals, link_name, link_point, Eigen::Isometry3d::Identity());
410  *state_solver_clone, joint_names_empty, jvals, link_name, link_point, Eigen::Isometry3d::Identity());
411  }
412 
413  // NOLINTNEXTLINE
414  EXPECT_ANY_THROW(runCompareJacobian(
415  state_solver, joint_names_empty, jvals, "", link_point, Eigen::Isometry3d::Identity())); // NOLINT
416 
417  // NOLINTNEXTLINE
418  EXPECT_ANY_THROW(runCompareJacobian(
419  *state_solver_clone, joint_names_empty, jvals, "", link_point, Eigen::Isometry3d::Identity())); // NOLINT
420  }
421 
423  // Test Jacobian at Point
425  for (int k = 0; k < 3; ++k)
426  {
427  Eigen::Vector3d link_point(0, 0, 0);
428  link_point[k] = 1;
429 
430  for (const auto& link_name : link_names)
431  {
432  runCompareJacobian(state_solver, joint_names_empty, jvals, link_name, link_point, Eigen::Isometry3d::Identity());
434  *state_solver_clone, joint_names_empty, jvals, link_name, link_point, Eigen::Isometry3d::Identity());
435  }
436 
437  // NOLINTNEXTLINE
438  EXPECT_ANY_THROW(runCompareJacobian(
439  state_solver, joint_names_empty, jvals, "", link_point, Eigen::Isometry3d::Identity())); // NOLINT
440 
441  // NOLINTNEXTLINE
442  EXPECT_ANY_THROW(runCompareJacobian(
443  *state_solver_clone, joint_names_empty, jvals, "", link_point, Eigen::Isometry3d::Identity())); // NOLINT
444  }
445 
447  // Test Jacobian with change base
449  for (int k = 0; k < 3; ++k)
450  {
451  Eigen::Vector3d link_point(0, 0, 0);
452  Eigen::Isometry3d change_base;
453  change_base.setIdentity();
454  change_base(0, 0) = 0;
455  change_base(1, 0) = 1;
456  change_base(0, 1) = -1;
457  change_base(1, 1) = 0;
458  change_base.translation() = Eigen::Vector3d(0, 0, 0);
459  change_base.translation()[k] = 1;
460 
461  for (const auto& link_name : link_names)
462  {
463  runCompareJacobian(state_solver, joint_names_empty, jvals, link_name, link_point, change_base);
464  runCompareJacobian(*state_solver_clone, joint_names_empty, jvals, link_name, link_point, change_base);
465  }
466 
467  // NOLINTNEXTLINE
468  EXPECT_ANY_THROW(
469  runCompareJacobian(state_solver, joint_names_empty, jvals, "", link_point, change_base)); // NOLINT
470 
471  // NOLINTNEXTLINE
472  EXPECT_ANY_THROW(
473  runCompareJacobian(*state_solver_clone, joint_names_empty, jvals, "", link_point, change_base)); // NOLINT
474  }
475 
477  // Test Jacobian at point with change base
479  for (int k = 0; k < 3; ++k)
480  {
481  Eigen::Vector3d link_point(0, 0, 0);
482  link_point[k] = 1;
483 
484  Eigen::Isometry3d change_base;
485  change_base.setIdentity();
486  change_base(0, 0) = 0;
487  change_base(1, 0) = 1;
488  change_base(0, 1) = -1;
489  change_base(1, 1) = 0;
490  change_base.translation() = link_point;
491 
492  for (const auto& link_name : link_names)
493  {
494  runCompareJacobian(state_solver, joint_names_empty, jvals, link_name, link_point, change_base);
495  runCompareJacobian(*state_solver_clone, joint_names_empty, jvals, link_name, link_point, change_base);
496  }
497 
498  // NOLINTNEXTLINE
499  EXPECT_ANY_THROW(
500  runCompareJacobian(state_solver, joint_names_empty, jvals, "", link_point, change_base)); // NOLINT
501 
502  // NOLINTNEXTLINE
503  EXPECT_ANY_THROW(
504  runCompareJacobian(*state_solver_clone, joint_names_empty, jvals, "", link_point, change_base)); // NOLINT
505  }
506 
508  // Test Jacobian with joint names
510  std::vector<std::string> joint_names = state_solver.getActiveJointNames();
511  {
512  Eigen::Vector3d link_point(0, 0, 0);
513  for (const auto& link_name : link_names)
514  {
515  runCompareJacobian(state_solver, joint_names, jvals, link_name, link_point, Eigen::Isometry3d::Identity());
516  runCompareJacobian(*state_solver_clone, joint_names, jvals, link_name, link_point, Eigen::Isometry3d::Identity());
517 
518  runCompareJacobian(state_solver, jv_map, link_name, link_point, Eigen::Isometry3d::Identity());
519  runCompareJacobian(*state_solver_clone, jv_map, link_name, link_point, Eigen::Isometry3d::Identity());
520  }
521 
522  // NOLINTNEXTLINE
523  EXPECT_ANY_THROW(
524  runCompareJacobian(state_solver, joint_names, jvals, "", link_point, Eigen::Isometry3d::Identity())); // NOLINT
525 
526  // NOLINTNEXTLINE
527  EXPECT_ANY_THROW(runCompareJacobian(
528  *state_solver_clone, joint_names, jvals, "", link_point, Eigen::Isometry3d::Identity())); // NOLINT
529  }
530 
532  // Test Jacobian at Point
534  for (int k = 0; k < 3; ++k)
535  {
536  Eigen::Vector3d link_point(0, 0, 0);
537  link_point[k] = 1;
538 
539  for (const auto& link_name : link_names)
540  {
541  runCompareJacobian(state_solver, joint_names, jvals, link_name, link_point, Eigen::Isometry3d::Identity());
542  runCompareJacobian(*state_solver_clone, joint_names, jvals, link_name, link_point, Eigen::Isometry3d::Identity());
543 
544  runCompareJacobian(state_solver, jv_map, link_name, link_point, Eigen::Isometry3d::Identity());
545  runCompareJacobian(*state_solver_clone, jv_map, link_name, link_point, Eigen::Isometry3d::Identity());
546  }
547 
548  // NOLINTNEXTLINE
549  EXPECT_ANY_THROW(
550  runCompareJacobian(state_solver, joint_names, jvals, "", link_point, Eigen::Isometry3d::Identity())); // NOLINT
551 
552  // NOLINTNEXTLINE
553  EXPECT_ANY_THROW(runCompareJacobian(
554  *state_solver_clone, joint_names, jvals, "", link_point, Eigen::Isometry3d::Identity())); // NOLINT
555  }
556 
558  // Test Jacobian with change base
560  for (int k = 0; k < 3; ++k)
561  {
562  Eigen::Vector3d link_point(0, 0, 0);
563  Eigen::Isometry3d change_base;
564  change_base.setIdentity();
565  change_base(0, 0) = 0;
566  change_base(1, 0) = 1;
567  change_base(0, 1) = -1;
568  change_base(1, 1) = 0;
569  change_base.translation() = Eigen::Vector3d(0, 0, 0);
570  change_base.translation()[k] = 1;
571 
572  for (const auto& link_name : link_names)
573  {
574  runCompareJacobian(state_solver, joint_names, jvals, link_name, link_point, change_base);
575  runCompareJacobian(*state_solver_clone, joint_names, jvals, link_name, link_point, change_base);
576 
577  runCompareJacobian(state_solver, jv_map, link_name, link_point, change_base);
578  runCompareJacobian(*state_solver_clone, jv_map, link_name, link_point, change_base);
579  }
580 
581  // NOLINTNEXTLINE
582  EXPECT_ANY_THROW(runCompareJacobian(state_solver, joint_names, jvals, "", link_point, change_base)); // NOLINT
583 
584  // NOLINTNEXTLINE
585  EXPECT_ANY_THROW(
586  runCompareJacobian(*state_solver_clone, joint_names, jvals, "", link_point, change_base)); // NOLINT
587  }
588 
590  // Test Jacobian at point with change base
592  for (int k = 0; k < 3; ++k)
593  {
594  Eigen::Vector3d link_point(0, 0, 0);
595  link_point[k] = 1;
596 
597  Eigen::Isometry3d change_base;
598  change_base.setIdentity();
599  change_base(0, 0) = 0;
600  change_base(1, 0) = 1;
601  change_base(0, 1) = -1;
602  change_base(1, 1) = 0;
603  change_base.translation() = link_point;
604 
605  for (const auto& link_name : link_names)
606  {
607  runCompareJacobian(state_solver, joint_names, jvals, link_name, link_point, change_base);
608  runCompareJacobian(*state_solver_clone, joint_names, jvals, link_name, link_point, change_base);
609 
610  runCompareJacobian(state_solver, jv_map, link_name, link_point, change_base);
611  runCompareJacobian(*state_solver_clone, jv_map, link_name, link_point, change_base);
612  }
613 
614  // NOLINTNEXTLINE
615  EXPECT_ANY_THROW(runCompareJacobian(state_solver, joint_names, jvals, "", link_point, change_base)); // NOLINT
616 
617  // NOLINTNEXTLINE
618  EXPECT_ANY_THROW(
619  runCompareJacobian(*state_solver_clone, joint_names, jvals, "", link_point, change_base)); // NOLINT
620  }
621 
623  // Test Jacobian with joint names in different order
625  std::reverse(joint_names.begin(), joint_names.end());
626  jvals(0) = -0.7;
627  jvals(1) = 0.6;
628  jvals(2) = -0.5;
629  jvals(3) = 0.4;
630  jvals(4) = -0.3;
631  jvals(5) = 0.2;
632  jvals(6) = -0.1;
633 
634  {
635  Eigen::Vector3d link_point(0, 0, 0);
636  for (const auto& link_name : link_names)
637  {
638  runCompareJacobian(state_solver, joint_names, jvals, link_name, link_point, Eigen::Isometry3d::Identity());
639  runCompareJacobian(*state_solver_clone, joint_names, jvals, link_name, link_point, Eigen::Isometry3d::Identity());
640 
641  runCompareJacobian(state_solver, jv_map, link_name, link_point, Eigen::Isometry3d::Identity());
642  runCompareJacobian(*state_solver_clone, jv_map, link_name, link_point, Eigen::Isometry3d::Identity());
643  }
644 
645  // NOLINTNEXTLINE
646  EXPECT_ANY_THROW(
647  runCompareJacobian(state_solver, joint_names, jvals, "", link_point, Eigen::Isometry3d::Identity())); // NOLINT
648 
649  // NOLINTNEXTLINE
650  EXPECT_ANY_THROW(runCompareJacobian(
651  *state_solver_clone, joint_names, jvals, "", link_point, Eigen::Isometry3d::Identity())); // NOLINT
652  }
653 
655  // Test Jacobian at Point
657  for (int k = 0; k < 3; ++k)
658  {
659  Eigen::Vector3d link_point(0, 0, 0);
660  link_point[k] = 1;
661 
662  for (const auto& link_name : link_names)
663  {
664  runCompareJacobian(state_solver, joint_names, jvals, link_name, link_point, Eigen::Isometry3d::Identity());
665  runCompareJacobian(*state_solver_clone, joint_names, jvals, link_name, link_point, Eigen::Isometry3d::Identity());
666 
667  runCompareJacobian(state_solver, jv_map, link_name, link_point, Eigen::Isometry3d::Identity());
668  runCompareJacobian(*state_solver_clone, jv_map, link_name, link_point, Eigen::Isometry3d::Identity());
669  }
670 
671  // NOLINTNEXTLINE
672  EXPECT_ANY_THROW(
673  runCompareJacobian(state_solver, joint_names, jvals, "", link_point, Eigen::Isometry3d::Identity())); // NOLINT
674 
675  // NOLINTNEXTLINE
676  EXPECT_ANY_THROW(runCompareJacobian(
677  *state_solver_clone, joint_names, jvals, "", link_point, Eigen::Isometry3d::Identity())); // NOLINT
678  }
679 
681  // Test Jacobian with change base
683  for (int k = 0; k < 3; ++k)
684  {
685  Eigen::Vector3d link_point(0, 0, 0);
686  Eigen::Isometry3d change_base;
687  change_base.setIdentity();
688  change_base(0, 0) = 0;
689  change_base(1, 0) = 1;
690  change_base(0, 1) = -1;
691  change_base(1, 1) = 0;
692  change_base.translation() = Eigen::Vector3d(0, 0, 0);
693  change_base.translation()[k] = 1;
694 
695  for (const auto& link_name : link_names)
696  {
697  runCompareJacobian(state_solver, joint_names, jvals, link_name, link_point, change_base);
698  runCompareJacobian(*state_solver_clone, joint_names, jvals, link_name, link_point, change_base);
699 
700  runCompareJacobian(state_solver, jv_map, link_name, link_point, change_base);
701  runCompareJacobian(*state_solver_clone, jv_map, link_name, link_point, change_base);
702  }
703 
704  EXPECT_ANY_THROW(runCompareJacobian(state_solver, joint_names, jvals, "", link_point, change_base)); // NOLINT
705 
706  // NOLINTNEXTLINE
707  EXPECT_ANY_THROW(
708  runCompareJacobian(*state_solver_clone, joint_names, jvals, "", link_point, change_base)); // NOLINT
709  }
710 
712  // Test Jacobian at point with change base
714  for (int k = 0; k < 3; ++k)
715  {
716  Eigen::Vector3d link_point(0, 0, 0);
717  link_point[k] = 1;
718 
719  Eigen::Isometry3d change_base;
720  change_base.setIdentity();
721  change_base(0, 0) = 0;
722  change_base(1, 0) = 1;
723  change_base(0, 1) = -1;
724  change_base(1, 1) = 0;
725  change_base.translation() = link_point;
726 
727  for (const auto& link_name : link_names)
728  {
729  runCompareJacobian(state_solver, joint_names, jvals, link_name, link_point, change_base);
730  runCompareJacobian(*state_solver_clone, joint_names, jvals, link_name, link_point, change_base);
731 
732  runCompareJacobian(state_solver, jv_map, link_name, link_point, change_base);
733  runCompareJacobian(*state_solver_clone, jv_map, link_name, link_point, change_base);
734  }
735 
736  EXPECT_ANY_THROW(runCompareJacobian(state_solver, joint_names, jvals, "", link_point, change_base)); // NOLINT
737 
738  // NOLINTNEXTLINE
739  EXPECT_ANY_THROW(
740  runCompareJacobian(*state_solver_clone, joint_names, jvals, "", link_point, change_base)); // NOLINT
741  }
742 }
743 
744 template <typename S>
746 {
747  // Get the scene graph
749  auto scene_graph = getSceneGraph(locator);
750  auto state_solver = S(*scene_graph);
751 
752  Eigen::Isometry3d origin{ Eigen::Isometry3d::Identity() };
753  origin.translation()(0) = 1.25;
754 
755  {
756  Joint joint_1("joint_a1");
757  joint_1.parent_to_joint_origin_transform = origin;
758  joint_1.parent_link_name = "base_link";
759  joint_1.child_link_name = "link_1";
760  joint_1.type = JointType::FLOATING;
761 
762  EXPECT_TRUE(scene_graph->removeJoint("joint_a1"));
763  EXPECT_TRUE(scene_graph->addJoint(joint_1));
764  EXPECT_TRUE(state_solver.replaceJoint(joint_1));
765 
766  KDLStateSolver base_state_solver(*scene_graph);
767  runCompareStateSolver(base_state_solver, state_solver);
768 
769  // Test Clone
770  StateSolver::UPtr state_solver_clone = state_solver.clone();
771  runCompareStateSolver(base_state_solver, *state_solver_clone);
772  }
773 
774  {
775  origin.translation()(1) = 1.5;
776  tesseract_common::TransformMap floating_joint_values;
777  floating_joint_values["joint_a1"] = origin;
778  state_solver.setState(floating_joint_values);
779 
780  EXPECT_TRUE(scene_graph->changeJointOrigin("joint_a1", origin));
781 
782  KDLStateSolver base_state_solver(*scene_graph);
783  runCompareStateSolver(base_state_solver, state_solver);
784 
785  // Test Clone
786  StateSolver::UPtr state_solver_clone = state_solver.clone();
787  runCompareStateSolver(base_state_solver, *state_solver_clone);
788  }
789 
790  {
791  origin.translation()(2) = 1.5;
792  auto state = state_solver.getState();
793  state.floating_joints.at("joint_a1") = origin;
794  state_solver.setState(state.joints, state.floating_joints);
795 
796  EXPECT_TRUE(scene_graph->changeJointOrigin("joint_a1", origin));
797 
798  KDLStateSolver base_state_solver(*scene_graph);
799  runCompareStateSolver(base_state_solver, state_solver);
800 
801  // Test Clone
802  StateSolver::UPtr state_solver_clone = state_solver.clone();
803  runCompareStateSolver(base_state_solver, *state_solver_clone);
804  }
805 
806  // Failures
807  {
808  tesseract_common::TransformMap floating_joint_values;
809  floating_joint_values["does_not_exist"] = origin;
810  EXPECT_ANY_THROW(state_solver.setState(floating_joint_values)); // NOLINT
811  }
812 
813  {
814  auto state = state_solver.getState();
815  state.floating_joints["does_not_exist"] = origin;
816  EXPECT_ANY_THROW(state_solver.setState(state.joints, state.floating_joints)); // NOLINT
817  }
818 }
819 
820 template <typename S>
822 {
823  // Get the scene graph
825  auto scene_graph = getSceneGraph(locator);
826  auto state_solver = S(*scene_graph);
827 
828  auto visual = std::make_shared<Visual>();
829  visual->geometry = std::make_shared<tesseract_geometry::Box>(1, 1, 1);
830  auto collision = std::make_shared<Collision>();
831  collision->geometry = std::make_shared<tesseract_geometry::Box>(1, 1, 1);
832 
833  const std::string link_name1 = "link_n1";
834  const std::string link_name2 = "link_n2";
835  const std::string joint_name1 = "joint_n1";
836  const std::string joint_name2 = "joint_n2";
837 
838  Link link_1(link_name1);
839  link_1.visual.push_back(visual);
840  link_1.collision.push_back(collision);
841 
842  Joint joint_1(joint_name1);
843  joint_1.parent_link_name = scene_graph->getRoot();
844  joint_1.child_link_name = link_name1;
845  joint_1.type = JointType::FIXED;
846 
847  Link link_2(link_name2);
848 
849  Joint joint_2(joint_name2);
850  joint_2.parent_to_joint_origin_transform.translation()(0) = 1.25;
851  joint_2.parent_link_name = link_name1;
852  joint_2.child_link_name = link_name2;
853  joint_2.type = JointType::FLOATING;
854 
855  // Test adding link
856 
857  EXPECT_TRUE(scene_graph->addLink(link_1, joint_1));
858  EXPECT_TRUE(state_solver.addLink(link_1, joint_1));
859 
860  auto base_state_solver = std::make_shared<KDLStateSolver>(*scene_graph);
861 
862  runCompareStateSolver(*base_state_solver, state_solver);
863  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
864 
865  // Test Clone
866  StateSolver::UPtr state_solver_clone = state_solver.clone();
867  runCompareStateSolver(*base_state_solver, *state_solver_clone);
868 
869  std::vector<std::string> joint_names = state_solver.getActiveJointNames();
870  SceneState state = state_solver.getState();
871  // Fixed joints are not listed
872  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), joint_name1) == joint_names.end());
873  EXPECT_TRUE(state.link_transforms.find(link_name1) != state.link_transforms.end());
874  EXPECT_TRUE(state.joint_transforms.find(joint_name1) != state.joint_transforms.end());
875  // Fixed joints are not listed
876  EXPECT_TRUE(state.joints.find(joint_name1) == state.joints.end());
877  EXPECT_TRUE(state.floating_joints.empty());
878 
879  EXPECT_TRUE(scene_graph->addLink(link_2, joint_2));
880  EXPECT_TRUE(state_solver.addLink(link_2, joint_2));
881 
882  base_state_solver = std::make_shared<KDLStateSolver>(*scene_graph);
883 
884  runCompareStateSolver(*base_state_solver, state_solver);
885  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
886 
887  // Test Clone
888  state_solver_clone = state_solver.clone();
889  runCompareStateSolver(*base_state_solver, *state_solver_clone);
890 
891  joint_names = state_solver.getActiveJointNames();
892  state = state_solver.getState();
893  // Fixed joints are not listed
894  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), joint_name2) == joint_names.end());
895  EXPECT_TRUE(state.link_transforms.find(link_name2) != state.link_transforms.end());
896  EXPECT_TRUE(state.joint_transforms.find(joint_name2) != state.joint_transforms.end());
897  EXPECT_TRUE(state.floating_joints.find(joint_name2) != state.floating_joints.end());
898  // Fixed joints are not listed
899  EXPECT_TRUE(state.joints.find(joint_name2) == state.joints.end());
900 
901  scene_graph->saveDOT(tesseract_common::getTempPath() + "state_solver_before_remove_link_unit.dot");
902 
903  // Test removing link
904  EXPECT_TRUE(scene_graph->removeLink(link_name1, true));
905  EXPECT_TRUE(state_solver.removeLink(link_name1));
906 
907  base_state_solver = std::make_shared<KDLStateSolver>(*scene_graph);
908 
909  runCompareStateSolver(*base_state_solver, state_solver);
910  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
911 
912  // Test Clone
913  state_solver_clone = state_solver.clone();
914  runCompareStateSolver(*base_state_solver, *state_solver_clone);
915 
916  joint_names = state_solver.getActiveJointNames();
917  state = state_solver.getState();
918  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), joint_name1) == joint_names.end());
919  EXPECT_TRUE(state.link_transforms.find(link_name1) == state.link_transforms.end());
920  EXPECT_TRUE(state.joint_transforms.find(joint_name1) == state.joint_transforms.end());
921  EXPECT_TRUE(state.joints.find(joint_name1) == state.joints.end());
922  EXPECT_TRUE(state.link_transforms.find(link_name2) == state.link_transforms.end());
923  EXPECT_TRUE(state.joint_transforms.find(joint_name2) == state.joint_transforms.end());
924  EXPECT_TRUE(state.joints.find(joint_name2) == state.joints.end());
925  EXPECT_TRUE(state.floating_joints.find(joint_name2) == state.floating_joints.end());
926  EXPECT_TRUE(state.floating_joints.empty());
927 
928  scene_graph->saveDOT(tesseract_common::getTempPath() + "state_solver_after_remove_link_unit.dot");
929 
930  // Test against double removing
931 
932  EXPECT_FALSE(state_solver.removeLink(link_name1));
933  runCompareStateSolver(*base_state_solver, state_solver);
934  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
935 
936  // Test Clone
937  state_solver_clone = state_solver.clone();
938  runCompareStateSolver(*base_state_solver, *state_solver_clone);
939 
940  EXPECT_FALSE(state_solver.removeLink(link_name2));
941  runCompareStateSolver(*base_state_solver, state_solver);
942  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
943 
944  // Test Clone
945  state_solver_clone = state_solver.clone();
946  runCompareStateSolver(*base_state_solver, *state_solver_clone);
947 
948  EXPECT_FALSE(state_solver.removeJoint(joint_name1));
949  runCompareStateSolver(*base_state_solver, state_solver);
950  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
951 
952  // Test Clone
953  state_solver_clone = state_solver.clone();
954  runCompareStateSolver(*base_state_solver, *state_solver_clone);
955 
956  EXPECT_FALSE(state_solver.removeJoint(joint_name2));
957  runCompareStateSolver(*base_state_solver, state_solver);
958  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
959 
960  // Test Clone
961  state_solver_clone = state_solver.clone();
962  runCompareStateSolver(*base_state_solver, *state_solver_clone);
963 
965 
966  // Test adding link
967 
968  EXPECT_TRUE(scene_graph->addLink(link_1, joint_1));
969  EXPECT_TRUE(state_solver.addLink(link_1, joint_1));
970 
971  base_state_solver = std::make_shared<KDLStateSolver>(*scene_graph);
972 
973  runCompareStateSolver(*base_state_solver, state_solver);
974  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
975 
976  // Test Clone
977  state_solver_clone = state_solver.clone();
978  runCompareStateSolver(*base_state_solver, *state_solver_clone);
979 
980  joint_names = state_solver.getActiveJointNames();
981  state = state_solver.getState();
982  // Fixed joints are not listed
983  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), joint_name1) == joint_names.end());
984  EXPECT_TRUE(state.link_transforms.find(link_name1) != state.link_transforms.end());
985  EXPECT_TRUE(state.joint_transforms.find(joint_name1) != state.joint_transforms.end());
986  // Fixed joints are not listed
987  EXPECT_TRUE(state.joints.find(joint_name1) == state.joints.end());
988 
989  EXPECT_TRUE(scene_graph->addLink(link_2, joint_2));
990  EXPECT_TRUE(state_solver.addLink(link_2, joint_2));
991 
992  base_state_solver = std::make_shared<KDLStateSolver>(*scene_graph);
993 
994  runCompareStateSolver(*base_state_solver, state_solver);
995  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
996 
997  // Test Clone
998  state_solver_clone = state_solver.clone();
999  runCompareStateSolver(*base_state_solver, *state_solver_clone);
1000 
1001  joint_names = state_solver.getActiveJointNames();
1002  state = state_solver.getState();
1003  // Fixed joints are not listed
1004  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), joint_name2) == joint_names.end());
1005  EXPECT_TRUE(state.link_transforms.find(link_name2) != state.link_transforms.end());
1006  EXPECT_TRUE(state.joint_transforms.find(joint_name2) != state.joint_transforms.end());
1007  EXPECT_TRUE(state.floating_joints.find(joint_name2) != state.floating_joints.end());
1008  // Fixed joints are not listed
1009  EXPECT_TRUE(state.joints.find(joint_name2) == state.joints.end());
1010 
1011  scene_graph->saveDOT(tesseract_common::getTempPath() + "state_solver_before_remove_link_unit2.dot");
1012 
1013  // Test removing link
1014  EXPECT_TRUE(scene_graph->removeJoint(joint_name1, true));
1015  EXPECT_TRUE(state_solver.removeJoint(joint_name1));
1016 
1017  base_state_solver = std::make_shared<KDLStateSolver>(*scene_graph);
1018 
1019  runCompareStateSolver(*base_state_solver, state_solver);
1020  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
1021 
1022  // Test Clone
1023  state_solver_clone = state_solver.clone();
1024  runCompareStateSolver(*base_state_solver, *state_solver_clone);
1025 
1026  joint_names = state_solver.getActiveJointNames();
1027  state = state_solver.getState();
1028  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), joint_name1) == joint_names.end());
1029  EXPECT_TRUE(state.link_transforms.find(link_name1) == state.link_transforms.end());
1030  EXPECT_TRUE(state.joint_transforms.find(joint_name1) == state.joint_transforms.end());
1031  EXPECT_TRUE(state.joints.find(joint_name1) == state.joints.end());
1032  EXPECT_TRUE(state.link_transforms.find(link_name2) == state.link_transforms.end());
1033  EXPECT_TRUE(state.joint_transforms.find(joint_name2) == state.joint_transforms.end());
1034  EXPECT_TRUE(state.floating_joints.find(joint_name2) == state.floating_joints.end());
1035  EXPECT_TRUE(state.joints.find(joint_name2) == state.joints.end());
1036  EXPECT_TRUE(state.floating_joints.empty());
1037 
1038  scene_graph->saveDOT(tesseract_common::getTempPath() + "state_solver_after_remove_link_unit2.dot");
1039 
1040  EXPECT_FALSE(state_solver.removeLink(link_name1));
1041  runCompareStateSolver(*base_state_solver, state_solver);
1042  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
1043 
1044  // Test Clone
1045  state_solver_clone = state_solver.clone();
1046  runCompareStateSolver(*base_state_solver, *state_solver_clone);
1047 
1048  EXPECT_FALSE(state_solver.removeLink(link_name2));
1049  runCompareStateSolver(*base_state_solver, state_solver);
1050  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
1051 
1052  // Test Clone
1053  state_solver_clone = state_solver.clone();
1054  runCompareStateSolver(*base_state_solver, *state_solver_clone);
1055 
1056  EXPECT_FALSE(state_solver.removeJoint(joint_name1));
1057  runCompareStateSolver(*base_state_solver, state_solver);
1058  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
1059 
1060  // Test Clone
1061  state_solver_clone = state_solver.clone();
1062  runCompareStateSolver(*base_state_solver, *state_solver_clone);
1063 
1064  EXPECT_FALSE(state_solver.removeJoint(joint_name2));
1065  runCompareStateSolver(*base_state_solver, state_solver);
1066  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
1067 
1068  // Test Clone
1069  state_solver_clone = state_solver.clone();
1070  runCompareStateSolver(*base_state_solver, *state_solver_clone);
1071 
1072  // Link already exists
1073  Link link_exists("link_1");
1074  EXPECT_FALSE(state_solver.addLink(link_exists, joint_1));
1075  runCompareStateSolver(*base_state_solver, state_solver);
1076  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
1077 
1078  // Test Clone
1079  state_solver_clone = state_solver.clone();
1080  runCompareStateSolver(*base_state_solver, *state_solver_clone);
1081 
1082  // joint already exists
1083  Link link_10("link_10");
1084  Joint joint_exists("joint_a1");
1085  joint_exists.parent_link_name = scene_graph->getRoot();
1086  joint_exists.child_link_name = "link_10";
1087  joint_exists.type = JointType::FIXED;
1088 
1089  EXPECT_FALSE(state_solver.addLink(link_10, joint_exists));
1090  runCompareStateSolver(*base_state_solver, state_solver);
1091  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
1092 
1093  // Test Clone
1094  state_solver_clone = state_solver.clone();
1095  runCompareStateSolver(*base_state_solver, *state_solver_clone);
1096 }
1097 
1098 template <typename S>
1100 {
1101  // Get the scene graph
1103  auto scene_graph = getSceneGraph(locator);
1104  auto state_solver = S(*scene_graph);
1105 
1106  auto subgraph = std::make_unique<SceneGraph>();
1107  subgraph->setName("subgraph");
1108 
1109  Joint joint_1_empty("provided_subgraph_joint");
1110  joint_1_empty.parent_link_name = "base_link";
1111  joint_1_empty.child_link_name = "prefix_subgraph_base_link";
1112  joint_1_empty.type = JointType::FLOATING;
1113 
1114  EXPECT_FALSE(scene_graph->insertSceneGraph(*subgraph, joint_1_empty));
1115  EXPECT_FALSE(state_solver.insertSceneGraph(*subgraph, joint_1_empty));
1116 
1117  auto base_state_solver = std::make_shared<KDLStateSolver>(*scene_graph);
1118 
1119  runCompareStateSolver(*base_state_solver, state_solver);
1120  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
1121 
1122  // Test Clone
1123  StateSolver::UPtr state_solver_clone = state_solver.clone();
1124  runCompareStateSolver(*base_state_solver, *state_solver_clone);
1125 
1126  subgraph = getSubSceneGraph();
1127 
1128  const std::string subgraph_joint_name = "attach_subgraph_joint";
1129 
1130  Joint joint(subgraph_joint_name);
1131  joint.parent_link_name = scene_graph->getRoot();
1132  joint.child_link_name = subgraph->getRoot();
1133  joint.type = JointType::FIXED;
1134 
1135  EXPECT_TRUE(scene_graph->insertSceneGraph(*subgraph, joint));
1136  EXPECT_TRUE(state_solver.insertSceneGraph(*subgraph, joint));
1137 
1138  base_state_solver = std::make_shared<KDLStateSolver>(*scene_graph);
1139 
1140  runCompareStateSolver(*base_state_solver, state_solver);
1141  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
1142 
1143  // Test Clone
1144  state_solver_clone = state_solver.clone();
1145  runCompareStateSolver(*base_state_solver, *state_solver_clone);
1146 
1147  std::vector<std::string> joint_names = state_solver.getActiveJointNames();
1148  SceneState state = state_solver.getState();
1149  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), subgraph_joint_name) == joint_names.end());
1150  EXPECT_TRUE(state.link_transforms.find(subgraph->getRoot()) != state.link_transforms.end());
1151  EXPECT_TRUE(state.joint_transforms.find(subgraph_joint_name) != state.joint_transforms.end());
1152  EXPECT_TRUE(state.joints.find(subgraph_joint_name) == state.joints.end());
1153 
1154  // Adding twice with the same name should fail
1155  EXPECT_FALSE(scene_graph->insertSceneGraph(*subgraph, joint));
1156  EXPECT_FALSE(state_solver.insertSceneGraph(*subgraph, joint));
1157 
1158  base_state_solver = std::make_shared<KDLStateSolver>(*scene_graph);
1159 
1160  runCompareStateSolver(*base_state_solver, state_solver);
1161  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
1162 
1163  // Test Clone
1164  state_solver_clone = state_solver.clone();
1165  runCompareStateSolver(*base_state_solver, *state_solver_clone);
1166 
1167  // Add subgraph with prefix
1168  std::string prefix = "prefix_";
1169  Joint prefix_joint(prefix + subgraph_joint_name);
1170  prefix_joint.parent_link_name = scene_graph->getRoot();
1171  prefix_joint.child_link_name = prefix + subgraph->getRoot();
1172  prefix_joint.type = JointType::FLOATING;
1173 
1174  EXPECT_TRUE(scene_graph->insertSceneGraph(*subgraph, prefix_joint, prefix));
1175  EXPECT_TRUE(state_solver.insertSceneGraph(*subgraph, prefix_joint, prefix));
1176 
1177  base_state_solver = std::make_shared<KDLStateSolver>(*scene_graph);
1178 
1179  runCompareStateSolver(*base_state_solver, state_solver);
1180  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
1181 
1182  // Test Clone
1183  state_solver_clone = state_solver.clone();
1184  runCompareStateSolver(*base_state_solver, *state_solver_clone);
1185 
1186  joint_names = state_solver.getActiveJointNames();
1187  state = state_solver.getState();
1188  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), prefix + subgraph_joint_name) == joint_names.end());
1189  EXPECT_TRUE(state.link_transforms.find(prefix + subgraph->getRoot()) != state.link_transforms.end());
1190  EXPECT_TRUE(state.joint_transforms.find(prefix + subgraph_joint_name) != state.joint_transforms.end());
1191  EXPECT_TRUE(state.floating_joints.find(prefix + subgraph_joint_name) != state.floating_joints.end());
1192  EXPECT_TRUE(state.joints.find(prefix + subgraph_joint_name) == state.joints.end());
1193 
1194  // Add subgraph with prefix and joint
1195  prefix = "prefix2_";
1196  Joint prefix_joint2(prefix + subgraph_joint_name);
1197  prefix_joint2.parent_link_name = scene_graph->getRoot();
1198  prefix_joint2.child_link_name = prefix + subgraph->getRoot();
1199  prefix_joint2.type = JointType::FIXED;
1200 
1201  EXPECT_TRUE(scene_graph->insertSceneGraph(*subgraph, prefix_joint2, prefix));
1202  EXPECT_TRUE(state_solver.insertSceneGraph(*subgraph, prefix_joint2, prefix));
1203 
1204  base_state_solver = std::make_shared<KDLStateSolver>(*scene_graph);
1205 
1206  runCompareStateSolver(*base_state_solver, state_solver);
1207  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
1208 
1209  // Test Clone
1210  state_solver_clone = state_solver.clone();
1211  runCompareStateSolver(*base_state_solver, *state_solver_clone);
1212 
1213  joint_names = state_solver.getActiveJointNames();
1214 
1215  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), prefix + subgraph_joint_name) == joint_names.end());
1216  state = state_solver.getState();
1217  EXPECT_TRUE(state.link_transforms.find(prefix + subgraph->getRoot()) != state.link_transforms.end());
1218  EXPECT_TRUE(state.joint_transforms.find(prefix + subgraph_joint_name) != state.joint_transforms.end());
1219  EXPECT_TRUE(state.joints.find(prefix + subgraph_joint_name) == state.joints.end());
1220 
1221  // Add empty subgraph with prefix and joint
1222  tesseract_scene_graph::SceneGraph empty_scene_graph;
1223  prefix = "prefix3_";
1224  Joint prefix_joint3(prefix + subgraph_joint_name);
1225  prefix_joint3.parent_link_name = scene_graph->getRoot();
1226  prefix_joint3.child_link_name = "empty";
1227  prefix_joint3.type = JointType::FIXED;
1228 
1229  EXPECT_FALSE(state_solver.insertSceneGraph(empty_scene_graph, prefix_joint3, prefix));
1230 
1231  base_state_solver = std::make_shared<KDLStateSolver>(*scene_graph);
1232 
1233  runCompareStateSolver(*base_state_solver, state_solver);
1234  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
1235 
1236  // Test Clone
1237  state_solver_clone = state_solver.clone();
1238  runCompareStateSolver(*base_state_solver, *state_solver_clone);
1239 }
1240 
1241 template <typename S>
1243 {
1244  // Get the scene graph
1246  auto scene_graph = getSceneGraph(locator);
1247  auto state_solver = S(*scene_graph);
1248 
1249  const std::string link_name1 = "link_n1";
1250  const std::string joint_name1 = "joint_n1";
1251  Link link_1(link_name1);
1252 
1253  Joint joint_1(joint_name1);
1254  joint_1.parent_link_name = scene_graph->getRoot();
1255  joint_1.child_link_name = link_name1;
1256  joint_1.type = JointType::FIXED;
1257 
1258  EXPECT_TRUE(scene_graph->addLink(link_1, joint_1));
1259  EXPECT_TRUE(state_solver.addLink(link_1, joint_1));
1260 
1261  const std::string link_name2 = "link_n2";
1262  const std::string joint_name2 = "joint_n2";
1263  Link link_2(link_name2);
1264 
1265  Joint joint_2(joint_name2);
1266  joint_2.parent_link_name = scene_graph->getRoot();
1267  joint_2.child_link_name = link_name2;
1268  joint_2.type = JointType::FLOATING;
1269  joint_2.parent_to_joint_origin_transform.translation() = Eigen::Vector3d(1, 1, 1);
1270 
1271  EXPECT_TRUE(scene_graph->addLink(link_2, joint_2));
1272  EXPECT_TRUE(state_solver.addLink(link_2, joint_2));
1273 
1274  auto base_state_solver = std::make_shared<KDLStateSolver>(*scene_graph);
1275 
1276  runCompareStateSolver(*base_state_solver, state_solver);
1277  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
1278 
1279  // Test Clone
1280  StateSolver::UPtr state_solver_clone = state_solver.clone();
1281  runCompareStateSolver(*base_state_solver, *state_solver_clone);
1282 
1283  SceneState state = state_solver.getState();
1284  EXPECT_TRUE(state.link_transforms.find(link_name1) != state.link_transforms.end());
1285  EXPECT_TRUE(state.joint_transforms.find(joint_name1) != state.joint_transforms.end());
1286  EXPECT_TRUE(state.joints.find(joint_name1) == state.joints.end());
1287  EXPECT_TRUE(state.joints.find(joint_name2) == state.joints.end());
1288  EXPECT_TRUE(state.joint_transforms.at(joint_name2).isApprox(joint_2.parent_to_joint_origin_transform));
1289  EXPECT_TRUE(state.floating_joints.at(joint_name2).isApprox(joint_2.parent_to_joint_origin_transform));
1290  EXPECT_TRUE(state.floating_joints.find(joint_name2) != state.floating_joints.end());
1291  EXPECT_EQ(state.floating_joints.size(), 1);
1292 
1293  scene_graph->saveDOT(tesseract_common::getTempPath() + "state_solver_before_change_joint_origin_unit.dot");
1294 
1295  Eigen::Isometry3d new_origin1 = Eigen::Isometry3d::Identity();
1296  new_origin1.translation()(0) += 1.234;
1297 
1298  Eigen::Isometry3d new_origin2 = Eigen::Isometry3d::Identity();
1299  new_origin2.translation()(1) += 1.234;
1300 
1301  EXPECT_TRUE(scene_graph->changeJointOrigin(joint_name1, new_origin1));
1302  EXPECT_TRUE(state_solver.changeJointOrigin(joint_name1, new_origin1));
1303  EXPECT_TRUE(scene_graph->changeJointOrigin(joint_name2, new_origin2));
1304  EXPECT_TRUE(state_solver.changeJointOrigin(joint_name2, new_origin2));
1305 
1306  base_state_solver = std::make_shared<KDLStateSolver>(*scene_graph);
1307 
1308  runCompareStateSolver(*base_state_solver, state_solver);
1309  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
1310 
1311  // Test Clone
1312  state_solver_clone = state_solver.clone();
1313  runCompareStateSolver(*base_state_solver, *state_solver_clone);
1314 
1315  // Check that the origin got updated
1316  state = state_solver.getState();
1317  EXPECT_TRUE(state.link_transforms.at(link_name1).isApprox(new_origin1));
1318  EXPECT_TRUE(state.joint_transforms.at(joint_name1).isApprox(new_origin1));
1319  EXPECT_TRUE(state.link_transforms.at(link_name2).isApprox(new_origin2));
1320  EXPECT_TRUE(state.joint_transforms.at(joint_name2).isApprox(new_origin2));
1321  EXPECT_TRUE(state.floating_joints.at(joint_name2).isApprox(new_origin2));
1322 
1323  scene_graph->saveDOT(tesseract_common::getTempPath() + "state_solver_after_change_joint_origin_unit.dot");
1324 
1325  // Joint does not eixist
1326  EXPECT_FALSE(state_solver.changeJointOrigin("joint_does_not_exist", new_origin1));
1327 
1328  base_state_solver = std::make_shared<KDLStateSolver>(*scene_graph);
1329 
1330  runCompareStateSolver(*base_state_solver, state_solver);
1331  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
1332 
1333  // Test Clone
1334  state_solver_clone = state_solver.clone();
1335  runCompareStateSolver(*base_state_solver, *state_solver_clone);
1336 }
1337 
1338 template <typename S>
1340 {
1341  // Get the scene graph
1343  auto scene_graph = getSceneGraph(locator);
1344  auto state_solver = S(*scene_graph);
1345 
1346  const std::string link_name1 = "link_n1";
1347  const std::string link_name2 = "link_n2";
1348  const std::string joint_name1 = "joint_n1";
1349  const std::string joint_name2 = "joint_n2";
1350  Link link_1(link_name1);
1351  Link link_2(link_name2);
1352 
1353  Joint joint_1(joint_name1);
1354  joint_1.parent_link_name = scene_graph->getRoot();
1355  joint_1.child_link_name = link_name1;
1356  joint_1.type = JointType::FIXED;
1357 
1358  Joint joint_2(joint_name2);
1359  joint_2.parent_to_joint_origin_transform.translation()(0) = 1.25;
1360  joint_2.parent_link_name = link_name1;
1361  joint_2.child_link_name = link_name2;
1362  joint_2.type = JointType::FLOATING;
1363 
1364  EXPECT_TRUE(scene_graph->addLink(link_1, joint_1));
1365  EXPECT_TRUE(state_solver.addLink(link_1, joint_1));
1366 
1367  auto base_state_solver = std::make_shared<KDLStateSolver>(*scene_graph);
1368 
1369  runCompareStateSolver(*base_state_solver, state_solver);
1370  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
1371 
1372  // Test Clone
1373  StateSolver::UPtr state_solver_clone = state_solver.clone();
1374  runCompareStateSolver(*base_state_solver, *state_solver_clone);
1375 
1376  SceneState state = state_solver.getState();
1377  EXPECT_TRUE(state.link_transforms.find(link_name1) != state.link_transforms.end());
1378  EXPECT_TRUE(state.joint_transforms.find(joint_name1) != state.joint_transforms.end());
1379  EXPECT_TRUE(state.joints.find(joint_name1) == state.joints.end());
1380 
1381  EXPECT_TRUE(scene_graph->addLink(link_2, joint_2));
1382  EXPECT_TRUE(state_solver.addLink(link_2, joint_2));
1383 
1384  base_state_solver = std::make_shared<KDLStateSolver>(*scene_graph);
1385 
1386  runCompareStateSolver(*base_state_solver, state_solver);
1387 
1388  // Test Clone
1389  state_solver_clone = state_solver.clone();
1390  runCompareStateSolver(*base_state_solver, *state_solver_clone);
1391 
1392  std::vector<std::string> joint_names = state_solver.getActiveJointNames();
1393  state = state_solver.getState();
1394  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), joint_name1) == joint_names.end());
1395  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), joint_name2) == joint_names.end());
1396  EXPECT_TRUE(state.link_transforms.find(link_name1) != state.link_transforms.end());
1397  EXPECT_TRUE(state.joint_transforms.find(joint_name1) != state.joint_transforms.end());
1398  EXPECT_TRUE(state.joints.find(joint_name1) == state.joints.end());
1399  EXPECT_TRUE(state.link_transforms.find(link_name2) != state.link_transforms.end());
1400  EXPECT_TRUE(state.joint_transforms.find(joint_name2) != state.joint_transforms.end());
1401  EXPECT_TRUE(state.floating_joints.find(joint_name2) != state.floating_joints.end());
1402  EXPECT_TRUE(state.joints.find(joint_name2) == state.joints.end());
1403 
1404  scene_graph->saveDOT(tesseract_common::getTempPath() + "state_solver_before_move_joint_unit.dot");
1405 
1406  EXPECT_TRUE(scene_graph->moveJoint(joint_name1, "tool0"));
1407  EXPECT_TRUE(state_solver.moveJoint(joint_name1, "tool0"));
1408 
1409  base_state_solver = std::make_shared<KDLStateSolver>(*scene_graph);
1410 
1411  runCompareStateSolver(*base_state_solver, state_solver);
1412  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
1413 
1414  // Test Clone
1415  state_solver_clone = state_solver.clone();
1416  runCompareStateSolver(*base_state_solver, *state_solver_clone);
1417 
1418  joint_names = state_solver.getActiveJointNames();
1419  state = state_solver.getState();
1420  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), joint_name1) == joint_names.end());
1421  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), joint_name2) == joint_names.end());
1422  EXPECT_TRUE(state.link_transforms.find(link_name1) != state.link_transforms.end());
1423  EXPECT_TRUE(state.joint_transforms.find(joint_name1) != state.joint_transforms.end());
1424  EXPECT_TRUE(state.joints.find(joint_name1) == state.joints.end());
1425  EXPECT_TRUE(state.link_transforms.find(link_name2) != state.link_transforms.end());
1426  EXPECT_TRUE(state.joint_transforms.find(joint_name2) != state.joint_transforms.end());
1427  EXPECT_TRUE(state.floating_joints.find(joint_name2) != state.floating_joints.end());
1428  EXPECT_TRUE(state.joints.find(joint_name2) == state.joints.end());
1429 
1430  scene_graph->saveDOT(tesseract_common::getTempPath() + "state_solver_after_move_joint_unit.dot");
1431 
1432  // Joint does not exist
1433  EXPECT_FALSE(state_solver.moveJoint("joint_does_not_exist", "tool0"));
1434 
1435  base_state_solver = std::make_shared<KDLStateSolver>(*scene_graph);
1436 
1437  runCompareStateSolver(*base_state_solver, state_solver);
1438  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
1439 
1440  // Test Clone
1441  state_solver_clone = state_solver.clone();
1442  runCompareStateSolver(*base_state_solver, *state_solver_clone);
1443 
1444  // Link does not exist
1445  EXPECT_FALSE(state_solver.moveJoint(joint_name1, "link_does_not_exist"));
1446 
1447  base_state_solver = std::make_shared<KDLStateSolver>(*scene_graph);
1448 
1449  runCompareStateSolver(*base_state_solver, state_solver);
1450  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
1451 
1452  // Test Clone
1453  state_solver_clone = state_solver.clone();
1454  runCompareStateSolver(*base_state_solver, *state_solver_clone);
1455 }
1456 
1457 template <typename S>
1459 {
1460  // Get the scene graph
1462  auto scene_graph = getSceneGraph(locator);
1463  auto state_solver = S(*scene_graph);
1464 
1465  const std::string link_name1 = "link_n1";
1466  const std::string link_name2 = "link_n2";
1467  const std::string joint_name1 = "joint_n1";
1468  const std::string joint_name2 = "joint_n2";
1469  Link link_1(link_name1);
1470  Link link_2(link_name2);
1471 
1472  Joint joint_1(joint_name1);
1473  joint_1.parent_link_name = scene_graph->getRoot();
1474  joint_1.child_link_name = link_name1;
1475  joint_1.type = JointType::FLOATING;
1476 
1477  Joint joint_2(joint_name2);
1478  joint_2.parent_to_joint_origin_transform.translation()(0) = 1.25;
1479  joint_2.parent_link_name = link_name1;
1480  joint_2.child_link_name = link_name2;
1481  joint_2.type = JointType::FIXED;
1482 
1483  EXPECT_TRUE(scene_graph->addLink(link_1, joint_1));
1484  EXPECT_TRUE(state_solver.addLink(link_1, joint_1));
1485 
1486  auto base_state_solver = std::make_shared<KDLStateSolver>(*scene_graph);
1487 
1488  runCompareStateSolver(*base_state_solver, state_solver);
1489  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
1490 
1491  // Test Clone
1492  StateSolver::UPtr state_solver_clone = state_solver.clone();
1493  runCompareStateSolver(*base_state_solver, *state_solver_clone);
1494 
1495  SceneState state = state_solver.getState();
1496  EXPECT_TRUE(state.link_transforms.find(link_name1) != state.link_transforms.end());
1497  EXPECT_TRUE(state.joint_transforms.find(joint_name1) != state.joint_transforms.end());
1498  EXPECT_TRUE(state.floating_joints.find(joint_name1) != state.floating_joints.end());
1499  EXPECT_TRUE(state.joints.find(joint_name1) == state.joints.end());
1500 
1501  EXPECT_TRUE(scene_graph->addLink(link_2, joint_2));
1502  EXPECT_TRUE(state_solver.addLink(link_2, joint_2));
1503 
1504  base_state_solver = std::make_shared<KDLStateSolver>(*scene_graph);
1505 
1506  runCompareStateSolver(*base_state_solver, state_solver);
1507  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
1508 
1509  // Test Clone
1510  state_solver_clone = state_solver.clone();
1511  runCompareStateSolver(*base_state_solver, *state_solver_clone);
1512 
1513  std::vector<std::string> joint_names = state_solver.getActiveJointNames();
1514  state = state_solver.getState();
1515  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), joint_name1) == joint_names.end());
1516  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), joint_name2) == joint_names.end());
1517  EXPECT_TRUE(state.link_transforms.find(link_name1) != state.link_transforms.end());
1518  EXPECT_TRUE(state.joint_transforms.find(joint_name1) != state.joint_transforms.end());
1519  EXPECT_TRUE(state.floating_joints.find(joint_name1) != state.floating_joints.end());
1520  EXPECT_TRUE(state.joints.find(joint_name1) == state.joints.end());
1521  EXPECT_TRUE(state.link_transforms.find(link_name2) != state.link_transforms.end());
1522  EXPECT_TRUE(state.joint_transforms.find(joint_name2) != state.joint_transforms.end());
1523  EXPECT_TRUE(state.joints.find(joint_name2) == state.joints.end());
1524 
1525  scene_graph->saveDOT(tesseract_common::getTempPath() + "state_solver_before_move_link_unit.dot");
1526 
1527  std::string moved_joint_name = joint_name1 + "_moved";
1528  Joint move_link_joint = joint_1.clone(moved_joint_name);
1529  move_link_joint.parent_link_name = "tool0";
1530  move_link_joint.type = JointType::FIXED;
1531 
1532  EXPECT_TRUE(scene_graph->moveLink(move_link_joint));
1533  EXPECT_TRUE(state_solver.moveLink(move_link_joint));
1534 
1535  base_state_solver = std::make_shared<KDLStateSolver>(*scene_graph);
1536 
1537  runCompareStateSolver(*base_state_solver, state_solver);
1538  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
1539 
1540  // Test Clone
1541  state_solver_clone = state_solver.clone();
1542  runCompareStateSolver(*base_state_solver, *state_solver_clone);
1543 
1544  joint_names = state_solver.getActiveJointNames();
1545  state = state_solver.getState();
1546  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), joint_name1) == joint_names.end());
1547  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), moved_joint_name) == joint_names.end());
1548  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), joint_name2) == joint_names.end());
1549 
1550  EXPECT_TRUE(state.link_transforms.find(link_name1) != state.link_transforms.end());
1551  EXPECT_TRUE(state.joint_transforms.find(joint_name1) == state.joint_transforms.end());
1552  EXPECT_TRUE(state.floating_joints.find(joint_name1) == state.floating_joints.end());
1553  EXPECT_TRUE(state.floating_joints.empty());
1554  EXPECT_TRUE(state.joint_transforms.find(moved_joint_name) != state.joint_transforms.end());
1555  EXPECT_TRUE(state.joints.find(joint_name1) == state.joints.end());
1556  EXPECT_TRUE(state.link_transforms.find(link_name2) != state.link_transforms.end());
1557  EXPECT_TRUE(state.joint_transforms.find(joint_name2) != state.joint_transforms.end());
1558  EXPECT_TRUE(state.joints.find(joint_name2) == state.joints.end());
1559 
1560  scene_graph->saveDOT(tesseract_common::getTempPath() + "state_solver_after_move_link_unit.dot");
1561 
1562  // Child link does not exist
1563  std::string moved_joint_name_err = joint_name1 + "_err";
1564  Joint move_link_joint_err1 = joint_1.clone(moved_joint_name_err);
1565  move_link_joint_err1.child_link_name = "link_does_not_exist";
1566  move_link_joint_err1.parent_link_name = "tool0";
1567 
1568  EXPECT_FALSE(state_solver.moveLink(move_link_joint_err1));
1569 
1570  base_state_solver = std::make_shared<KDLStateSolver>(*scene_graph);
1571 
1572  runCompareStateSolver(*base_state_solver, state_solver);
1573  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
1574 
1575  // Parent link does not exist
1576  Joint move_link_joint_err2 = joint_1.clone(moved_joint_name_err);
1577  move_link_joint_err2.parent_link_name = "link_does_not_exist";
1578 
1579  EXPECT_FALSE(state_solver.moveLink(move_link_joint_err2));
1580 
1581  base_state_solver = std::make_shared<KDLStateSolver>(*scene_graph);
1582 
1583  runCompareStateSolver(*base_state_solver, state_solver);
1584  runCompareStateSolverLimits(*scene_graph, *base_state_solver);
1585 }
1586 
1587 template <typename S>
1589 {
1590  // Get the scene graph
1592  auto scene_graph = getSceneGraph(locator);
1593  auto state_solver = S(*scene_graph);
1594 
1595  double new_lower = 1.0;
1596  double new_upper = 2.0;
1597  double new_velocity = 3.0;
1598  double new_acceleration = 4.0;
1599  double new_jerk = 5.0;
1600 
1601  scene_graph->changeJointPositionLimits("joint_a1", new_lower, new_upper);
1602  scene_graph->changeJointVelocityLimits("joint_a1", new_velocity);
1603  scene_graph->changeJointAccelerationLimits("joint_a1", new_acceleration);
1604  scene_graph->changeJointJerkLimits("joint_a1", new_jerk);
1605 
1606  EXPECT_TRUE(state_solver.changeJointPositionLimits("joint_a1", new_lower, new_upper));
1607  EXPECT_TRUE(state_solver.changeJointVelocityLimits("joint_a1", new_velocity));
1608  EXPECT_TRUE(state_solver.changeJointAccelerationLimits("joint_a1", new_acceleration));
1609  EXPECT_TRUE(state_solver.changeJointJerkLimits("joint_a1", new_jerk));
1610 
1611  {
1612  std::vector<std::string> joint_names = state_solver.getActiveJointNames();
1613  long idx = std::distance(joint_names.begin(), std::find(joint_names.begin(), joint_names.end(), "joint_a1"));
1614  auto limits = state_solver.getLimits();
1615  EXPECT_NEAR(limits.joint_limits(idx, 0), new_lower, 1e-5);
1616  EXPECT_NEAR(limits.joint_limits(idx, 1), new_upper, 1e-5);
1617  EXPECT_NEAR(limits.velocity_limits(idx, 0), -new_velocity, 1e-5);
1618  EXPECT_NEAR(limits.velocity_limits(idx, 1), new_velocity, 1e-5);
1619  EXPECT_NEAR(limits.acceleration_limits(idx, 0), -new_acceleration, 1e-5);
1620  EXPECT_NEAR(limits.acceleration_limits(idx, 1), new_acceleration, 1e-5);
1621  EXPECT_NEAR(limits.jerk_limits(idx, 0), -new_jerk, 1e-5);
1622  EXPECT_NEAR(limits.jerk_limits(idx, 1), new_jerk, 1e-5);
1623  }
1624 
1625  { // Test Clone
1626  StateSolver::UPtr temp = state_solver.clone();
1627  S& state_solver_clone = static_cast<S&>(*temp);
1628 
1629  std::vector<std::string> joint_names = state_solver_clone.getActiveJointNames();
1630  long idx = std::distance(joint_names.begin(), std::find(joint_names.begin(), joint_names.end(), "joint_a1"));
1631  auto limits = state_solver_clone.getLimits();
1632  EXPECT_NEAR(limits.joint_limits(idx, 0), new_lower, 1e-5);
1633  EXPECT_NEAR(limits.joint_limits(idx, 1), new_upper, 1e-5);
1634  EXPECT_NEAR(limits.velocity_limits(idx, 0), -new_velocity, 1e-5);
1635  EXPECT_NEAR(limits.velocity_limits(idx, 1), new_velocity, 1e-5);
1636  EXPECT_NEAR(limits.acceleration_limits(idx, 0), -new_acceleration, 1e-5);
1637  EXPECT_NEAR(limits.acceleration_limits(idx, 1), new_acceleration, 1e-5);
1638  EXPECT_NEAR(limits.jerk_limits(idx, 0), -new_jerk, 1e-5);
1639  EXPECT_NEAR(limits.jerk_limits(idx, 1), new_jerk, 1e-5);
1640  }
1641 
1642  // Joint does not exist
1643  double new_lower_err = 1.0 * 10;
1644  double new_upper_err = 2.0 * 10;
1645  double new_velocity_err = 3.0 * 10;
1646  double new_acceleration_err = 4.0 * 10;
1647  double new_jerk_err = 5.0 * 10;
1648  EXPECT_FALSE(state_solver.changeJointPositionLimits("joint_does_not_exist", new_lower_err, new_upper_err));
1649  EXPECT_FALSE(state_solver.changeJointVelocityLimits("joint_does_not_exist", new_velocity_err));
1650  EXPECT_FALSE(state_solver.changeJointAccelerationLimits("joint_does_not_exist", new_acceleration_err));
1651  EXPECT_FALSE(state_solver.changeJointJerkLimits("joint_does_not_exist", new_jerk_err));
1652 
1653  {
1654  std::vector<std::string> joint_names = state_solver.getActiveJointNames();
1655  long idx = std::distance(joint_names.begin(), std::find(joint_names.begin(), joint_names.end(), "joint_a1"));
1656  auto limits = state_solver.getLimits();
1657  EXPECT_NEAR(limits.joint_limits(idx, 0), new_lower, 1e-5);
1658  EXPECT_NEAR(limits.joint_limits(idx, 1), new_upper, 1e-5);
1659  EXPECT_NEAR(limits.velocity_limits(idx, 0), -new_velocity, 1e-5);
1660  EXPECT_NEAR(limits.velocity_limits(idx, 1), new_velocity, 1e-5);
1661  EXPECT_NEAR(limits.acceleration_limits(idx, 0), -new_acceleration, 1e-5);
1662  EXPECT_NEAR(limits.acceleration_limits(idx, 1), new_acceleration, 1e-5);
1663  EXPECT_NEAR(limits.jerk_limits(idx, 0), -new_jerk, 1e-5);
1664  EXPECT_NEAR(limits.jerk_limits(idx, 1), new_jerk, 1e-5);
1665  }
1666 
1667  { // Test Clone
1668  StateSolver::UPtr temp = state_solver.clone();
1669  S& state_solver_clone = static_cast<S&>(*temp);
1670 
1671  std::vector<std::string> joint_names = state_solver_clone.getActiveJointNames();
1672  long idx = std::distance(joint_names.begin(), std::find(joint_names.begin(), joint_names.end(), "joint_a1"));
1673  auto limits = state_solver_clone.getLimits();
1674  EXPECT_NEAR(limits.joint_limits(idx, 0), new_lower, 1e-5);
1675  EXPECT_NEAR(limits.joint_limits(idx, 1), new_upper, 1e-5);
1676  EXPECT_NEAR(limits.velocity_limits(idx, 0), -new_velocity, 1e-5);
1677  EXPECT_NEAR(limits.velocity_limits(idx, 1), new_velocity, 1e-5);
1678  EXPECT_NEAR(limits.acceleration_limits(idx, 0), -new_acceleration, 1e-5);
1679  EXPECT_NEAR(limits.acceleration_limits(idx, 1), new_acceleration, 1e-5);
1680  EXPECT_NEAR(limits.jerk_limits(idx, 0), -new_jerk, 1e-5);
1681  EXPECT_NEAR(limits.jerk_limits(idx, 1), new_jerk, 1e-5);
1682  }
1683 }
1684 
1685 template <typename S>
1687 {
1689  { // Replace joint with same type
1690  // Get the scene graph
1691  auto scene_graph = getSceneGraph(locator);
1692  auto state_solver = S(*scene_graph);
1693 
1694  Joint joint_1("joint_a1");
1695  joint_1.parent_to_joint_origin_transform.translation()(0) = 1.25;
1696  joint_1.parent_link_name = "base_link";
1697  joint_1.child_link_name = "link_1";
1698  joint_1.type = JointType::FIXED;
1699 
1700  EXPECT_TRUE(scene_graph->removeJoint("joint_a1"));
1701  EXPECT_TRUE(scene_graph->addJoint(joint_1));
1702  EXPECT_TRUE(state_solver.replaceJoint(joint_1));
1703 
1704  KDLStateSolver base_state_solver(*scene_graph);
1705 
1706  runCompareStateSolver(base_state_solver, state_solver);
1707  runCompareStateSolverLimits(*scene_graph, base_state_solver);
1708 
1709  // Test Clone
1710  StateSolver::UPtr state_solver_clone = state_solver.clone();
1711  runCompareStateSolver(base_state_solver, *state_solver_clone);
1712  }
1713 
1714  { // Replace joint which exist but the link does not which should fail
1715  // Get the scene graph
1716  auto scene_graph = getSceneGraph(locator);
1717  auto state_solver = S(*scene_graph);
1718 
1719  Joint joint_1("joint_a1");
1720  joint_1.parent_to_joint_origin_transform.translation()(0) = 1.25;
1721  joint_1.parent_link_name = "base_link";
1722  joint_1.child_link_name = "link_2_does_not_exist";
1723  joint_1.type = JointType::FIXED;
1724 
1725  EXPECT_FALSE(state_solver.replaceJoint(joint_1));
1726 
1727  KDLStateSolver base_state_solver(*scene_graph);
1728 
1729  runCompareStateSolver(base_state_solver, state_solver);
1730  runCompareStateSolverLimits(*scene_graph, base_state_solver);
1731 
1732  // Test Clone
1733  StateSolver::UPtr state_solver_clone = state_solver.clone();
1734  runCompareStateSolver(base_state_solver, *state_solver_clone);
1735  }
1736 
1737  { // Replace joint with same type but change transform
1738  // Get the scene graph
1739  auto scene_graph = getSceneGraph(locator);
1740  auto state_solver = S(*scene_graph);
1741 
1742  Joint new_joint_a1 = scene_graph->getJoint("joint_a1")->clone();
1743  new_joint_a1.parent_to_joint_origin_transform.translation()(0) = 1.25;
1744 
1745  EXPECT_TRUE(scene_graph->removeJoint("joint_a1"));
1746  EXPECT_TRUE(scene_graph->addJoint(new_joint_a1));
1747  EXPECT_TRUE(state_solver.replaceJoint(new_joint_a1));
1748 
1749  KDLStateSolver base_state_solver(*scene_graph);
1750 
1751  runCompareStateSolver(base_state_solver, state_solver);
1752  runCompareStateSolverLimits(*scene_graph, base_state_solver);
1753 
1754  // Test Clone
1755  StateSolver::UPtr state_solver_clone = state_solver.clone();
1756  runCompareStateSolver(base_state_solver, *state_solver_clone);
1757  }
1758 
1759  { // Replace joint with different type (Fixed)
1760  // Get the scene graph
1761  auto scene_graph = getSceneGraph(locator);
1762  auto state_solver = S(*scene_graph);
1763 
1764  Joint new_joint_a1 = scene_graph->getJoint("joint_a1")->clone();
1765  new_joint_a1.parent_to_joint_origin_transform.translation()(0) = 1.25;
1766  new_joint_a1.type = JointType::FIXED;
1767 
1768  EXPECT_TRUE(scene_graph->removeJoint("joint_a1"));
1769  EXPECT_TRUE(scene_graph->addJoint(new_joint_a1));
1770  EXPECT_TRUE(state_solver.replaceJoint(new_joint_a1));
1771 
1772  KDLStateSolver base_state_solver(*scene_graph);
1773 
1774  runCompareStateSolver(base_state_solver, state_solver);
1775  runCompareStateSolverLimits(*scene_graph, base_state_solver);
1776 
1777  // Test Clone
1778  StateSolver::UPtr state_solver_clone = state_solver.clone();
1779  runCompareStateSolver(base_state_solver, *state_solver_clone);
1780  }
1781 
1782  { // Replace joint with different type (Floating)
1783  // Get the scene graph
1784  auto scene_graph = getSceneGraph(locator);
1785  auto state_solver = S(*scene_graph);
1786 
1787  {
1788  Joint new_joint_a1 = scene_graph->getJoint("joint_a1")->clone();
1789  new_joint_a1.parent_to_joint_origin_transform.translation()(0) = 1.25;
1790  new_joint_a1.type = JointType::FLOATING;
1791 
1792  EXPECT_TRUE(scene_graph->removeJoint("joint_a1"));
1793  EXPECT_TRUE(scene_graph->addJoint(new_joint_a1));
1794  EXPECT_TRUE(state_solver.replaceJoint(new_joint_a1));
1795 
1796  KDLStateSolver base_state_solver(*scene_graph);
1797 
1798  auto state = state_solver.getState();
1799  EXPECT_TRUE(state.floating_joints.find("joint_a1") != state.floating_joints.end());
1800  EXPECT_FALSE(state.floating_joints.empty());
1801 
1802  runCompareStateSolver(base_state_solver, state_solver);
1803  runCompareStateSolverLimits(*scene_graph, base_state_solver);
1804 
1805  // Test Clone
1806  StateSolver::UPtr state_solver_clone = state_solver.clone();
1807  runCompareStateSolver(base_state_solver, *state_solver_clone);
1808  }
1809 
1810  { // Replace floating joint with floating joint but different origin
1811  Joint new_joint_a1 = scene_graph->getJoint("joint_a1")->clone();
1812  new_joint_a1.parent_to_joint_origin_transform.translation()(1) = 1.25;
1813  new_joint_a1.type = JointType::FLOATING;
1814 
1815  EXPECT_TRUE(scene_graph->removeJoint("joint_a1"));
1816  EXPECT_TRUE(scene_graph->addJoint(new_joint_a1));
1817  EXPECT_TRUE(state_solver.replaceJoint(new_joint_a1));
1818 
1819  KDLStateSolver base_state_solver(*scene_graph);
1820 
1821  auto state = state_solver.getState();
1822  EXPECT_TRUE(state.floating_joints.find("joint_a1") != state.floating_joints.end());
1823  EXPECT_FALSE(state.floating_joints.empty());
1824 
1825  runCompareStateSolver(base_state_solver, state_solver);
1826  runCompareStateSolverLimits(*scene_graph, base_state_solver);
1827 
1828  // Test Clone
1829  StateSolver::UPtr state_solver_clone = state_solver.clone();
1830  runCompareStateSolver(base_state_solver, *state_solver_clone);
1831  }
1832 
1833  { // Replace floating joint with another joint type
1834  Joint new_joint_a1 = scene_graph->getJoint("joint_a1")->clone();
1835  new_joint_a1.parent_to_joint_origin_transform.translation()(0) = 1.25;
1836  new_joint_a1.type = JointType::FIXED;
1837 
1838  EXPECT_TRUE(scene_graph->removeJoint("joint_a1"));
1839  EXPECT_TRUE(scene_graph->addJoint(new_joint_a1));
1840  EXPECT_TRUE(state_solver.replaceJoint(new_joint_a1));
1841 
1842  KDLStateSolver base_state_solver(*scene_graph);
1843 
1844  auto state = state_solver.getState();
1845  EXPECT_TRUE(state.floating_joints.find("joint_a1") == state.floating_joints.end());
1846  EXPECT_TRUE(state.floating_joints.empty());
1847 
1848  runCompareStateSolver(base_state_solver, state_solver);
1849  runCompareStateSolverLimits(*scene_graph, base_state_solver);
1850 
1851  // Test Clone
1852  StateSolver::UPtr state_solver_clone = state_solver.clone();
1853  runCompareStateSolver(base_state_solver, *state_solver_clone);
1854  }
1855  }
1856 
1857  { // Replace joint with different type (Continuous)
1858  // Get the scene graph
1859  auto scene_graph = getSceneGraph(locator);
1860  auto state_solver = S(*scene_graph);
1861 
1862  Joint new_joint_a1 = scene_graph->getJoint("joint_a1")->clone();
1863  new_joint_a1.parent_to_joint_origin_transform.translation()(0) = 1.25;
1864  new_joint_a1.type = JointType::CONTINUOUS;
1865 
1866  EXPECT_TRUE(scene_graph->removeJoint("joint_a1"));
1867  EXPECT_TRUE(scene_graph->addJoint(new_joint_a1));
1868  EXPECT_TRUE(state_solver.replaceJoint(new_joint_a1));
1869 
1870  KDLStateSolver base_state_solver(*scene_graph);
1871 
1872  runCompareStateSolver(base_state_solver, state_solver);
1873  runCompareStateSolverLimits(*scene_graph, base_state_solver);
1874 
1875  // Test Clone
1876  StateSolver::UPtr state_solver_clone = state_solver.clone();
1877  runCompareStateSolver(base_state_solver, *state_solver_clone);
1878  }
1879 
1880  { // Replace joint with different type (Prismatic)
1881  // Get the scene graph
1882  auto scene_graph = getSceneGraph(locator);
1883  auto state_solver = S(*scene_graph);
1884 
1885  Joint new_joint_a1 = scene_graph->getJoint("joint_a1")->clone();
1886  new_joint_a1.parent_to_joint_origin_transform.translation()(0) = 1.25;
1887  new_joint_a1.type = JointType::PRISMATIC;
1888 
1889  EXPECT_TRUE(scene_graph->removeJoint("joint_a1"));
1890  EXPECT_TRUE(scene_graph->addJoint(new_joint_a1));
1891  EXPECT_TRUE(state_solver.replaceJoint(new_joint_a1));
1892 
1893  KDLStateSolver base_state_solver(*scene_graph);
1894 
1895  runCompareStateSolver(base_state_solver, state_solver);
1896  runCompareStateSolverLimits(*scene_graph, base_state_solver);
1897 
1898  // Test Clone
1899  StateSolver::UPtr state_solver_clone = state_solver.clone();
1900  runCompareStateSolver(base_state_solver, *state_solver_clone);
1901  }
1902 
1903  { // Replace joint with different parent which is a replace and move
1904  // Get the scene graph
1905  auto scene_graph = getSceneGraph(locator);
1906  auto state_solver = S(*scene_graph);
1907 
1908  Joint new_joint_a3 = scene_graph->getJoint("joint_a3")->clone();
1909  new_joint_a3.parent_link_name = "base_link";
1910 
1911  EXPECT_TRUE(state_solver.replaceJoint(new_joint_a3));
1912 
1913  EXPECT_TRUE(scene_graph->removeJoint("joint_a3"));
1914  EXPECT_TRUE(scene_graph->addJoint(new_joint_a3));
1915 
1916  KDLStateSolver base_state_solver(*scene_graph);
1917 
1918  runCompareStateSolver(base_state_solver, state_solver);
1919  runCompareStateSolverLimits(*scene_graph, base_state_solver);
1920 
1921  // Test Clone
1922  StateSolver::UPtr state_solver_clone = state_solver.clone();
1923  runCompareStateSolver(base_state_solver, *state_solver_clone);
1924  }
1925 
1926  { // Replace joint which does not exist which should fail
1927  auto scene_graph = getSceneGraph(locator);
1928  auto state_solver = S(*scene_graph);
1929 
1930  Joint new_joint_a3 = scene_graph->getJoint("joint_a3")->clone("joint_does_not_exist");
1931 
1932  EXPECT_FALSE(state_solver.replaceJoint(new_joint_a3));
1933 
1934  KDLStateSolver base_state_solver(*scene_graph);
1935 
1936  runCompareStateSolver(base_state_solver, state_solver);
1937  runCompareStateSolverLimits(*scene_graph, base_state_solver);
1938 
1939  // Test Clone
1940  StateSolver::UPtr state_solver_clone = state_solver.clone();
1941  runCompareStateSolver(base_state_solver, *state_solver_clone);
1942  }
1943 
1944  { // Replace joint where parent link does not exist
1945  auto scene_graph = getSceneGraph(locator);
1946  auto state_solver = S(*scene_graph);
1947 
1948  Joint new_joint_a3 = scene_graph->getJoint("joint_a3")->clone();
1949  new_joint_a3.parent_link_name = "link_does_not_exist";
1950 
1951  EXPECT_FALSE(state_solver.replaceJoint(new_joint_a3));
1952 
1953  KDLStateSolver base_state_solver(*scene_graph);
1954 
1955  runCompareStateSolver(base_state_solver, state_solver);
1956  runCompareStateSolverLimits(*scene_graph, base_state_solver);
1957 
1958  // Test Clone
1959  StateSolver::UPtr state_solver_clone = state_solver.clone();
1960  runCompareStateSolver(base_state_solver, *state_solver_clone);
1961  }
1962 }
1963 } // namespace tesseract_scene_graph::test_suite
1964 
1965 #endif // TESSERACT_STATE_SOLVER_
tesseract_common::VectorIsometry3d
AlignedVector< Eigen::Isometry3d > VectorIsometry3d
tesseract_scene_graph::test_suite::runChangeJointOriginTest
void runChangeJointOriginTest()
Definition: state_solver_test_suite.h:1242
graph.h
tesseract_scene_graph::SceneState::floating_joints
tesseract_common::TransformMap floating_joints
tesseract_scene_graph::StateSolver::getJointNames
virtual std::vector< std::string > getJointNames() const =0
Get the vector of joint names.
tesseract_common::getTempPath
std::string getTempPath()
tesseract_scene_graph::StateSolver::getActiveJointNames
virtual std::vector< std::string > getActiveJointNames() const =0
Get the vector of joint names which align with the limits.
tesseract_scene_graph::JointType::FLOATING
@ FLOATING
tesseract_common::isIdentical
bool isIdentical(const std::vector< T > &vec1, const std::vector< T > &vec2, bool ordered=true, const std::function< bool(const T &, const T &)> &equal_pred=[](const T &v1, const T &v2) { return v1==v2;}, const std::function< bool(const T &, const T &)> &comp=[](const T &v1, const T &v2) { return v1< v2;})
tesseract_scene_graph::Joint::clone
Joint clone() const
utils.h
tesseract_scene_graph::StateSolver::getState
virtual SceneState getState(const Eigen::Ref< const Eigen::VectorXd > &joint_values, const tesseract_common::TransformMap &floating_joint_values={}) const =0
Get the state of the solver given the joint values.
tesseract_scene_graph::StateSolver::getRelativeLinkTransform
virtual Eigen::Isometry3d getRelativeLinkTransform(const std::string &from_link_name, const std::string &to_link_name) const =0
Get transform between two links using the current state.
tesseract_common::KinematicLimits
resource_locator.h
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_scene_graph::StateSolver::hasLinkName
virtual bool hasLinkName(const std::string &link_name) const =0
Check if link name exists.
tesseract_scene_graph::StateSolver::getBaseLinkName
virtual std::string getBaseLinkName() const =0
Get the base link name.
tesseract_common::ResourceLocator::locateResource
virtual std::shared_ptr< Resource > locateResource(const std::string &url) const=0
tesseract_scene_graph::test_suite::runCompareStateSolver
void runCompareStateSolver(const StateSolver &base_solver, StateSolver &comp_solver)
Definition: state_solver_test_suite.h:87
joint.h
tesseract_scene_graph::Joint::parent_to_joint_origin_transform
Eigen::Isometry3d parent_to_joint_origin_transform
tesseract_scene_graph::StateSolver::getFloatingJointNames
virtual std::vector< std::string > getFloatingJointNames() const =0
Get the vector of floating joint names.
tesseract_scene_graph::StateSolver
Definition: state_solver.h:45
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
#define TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
tesseract_scene_graph::test_suite::numericalJacobian
static void numericalJacobian(Eigen::Ref< Eigen::MatrixXd > jacobian, const Eigen::Isometry3d &change_base, const StateSolver &state_solver, const std::vector< std::string > &joint_names, 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: state_solver_test_suite.h:205
tesseract_scene_graph::SceneGraph
tesseract_scene_graph::test_suite::runCompareJacobian
void runCompareJacobian(StateSolver &state_solver, const std::vector< std::string > &joint_names, 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: state_solver_test_suite.h:267
tesseract_common::KinematicLimits::jerk_limits
Eigen::MatrixX2d jerk_limits
tesseract_scene_graph::SceneGraph::UPtr
std::unique_ptr< SceneGraph > UPtr
tesseract_scene_graph::StateSolver::getLinkTransform
virtual Eigen::Isometry3d getLinkTransform(const std::string &link_name) const =0
Get the transform corresponding to the link.
tesseract_scene_graph::SceneState
tesseract_scene_graph::test_suite::runMoveJointTest
void runMoveJointTest()
Definition: state_solver_test_suite.h:1339
tesseract_scene_graph::test_suite::runSetFloatingJointStateTest
void runSetFloatingJointStateTest()
Definition: state_solver_test_suite.h:745
tesseract_scene_graph::Joint::child_link_name
std::string child_link_name
tesseract_scene_graph::StateSolver::getRandomState
virtual SceneState getRandomState() const =0
Get the random state of the environment.
tesseract_scene_graph::test_suite::getSubSceneGraph
SceneGraph::UPtr getSubSceneGraph()
Definition: state_solver_test_suite.h:28
tesseract_scene_graph::KDLStateSolver
Definition: kdl_state_solver.h:44
tesseract_scene_graph::StateSolver::getLimits
virtual tesseract_common::KinematicLimits getLimits() const =0
Getter for kinematic limits.
tesseract_scene_graph::StateSolver::getLinkTransforms
virtual tesseract_common::VectorIsometry3d getLinkTransforms() const =0
Get all of the links transforms.
tesseract_scene_graph::JointType::PRISMATIC
@ PRISMATIC
tesseract_scene_graph::SceneState::joints
std::unordered_map< std::string, double > joints
tesseract_common::ResourceLocator
tesseract_scene_graph::test_suite::runMoveLinkTest
void runMoveLinkTest()
Definition: state_solver_test_suite.h:1458
tesseract_scene_graph::StateSolver::isActiveLinkName
virtual bool isActiveLinkName(const std::string &link_name) const =0
Check if link is an active link.
tesseract_scene_graph::StateSolver::getStaticLinkNames
virtual std::vector< std::string > getStaticLinkNames() const =0
Get a vector of static link names in the environment.
tesseract_scene_graph::test_suite::runAddandRemoveLinkTest
void runAddandRemoveLinkTest()
Definition: state_solver_test_suite.h:821
tesseract_scene_graph::test_suite
Definition: state_solver_test_suite.h:20
tesseract_scene_graph::test_suite::runAddSceneGraphTest
void runAddSceneGraphTest()
Definition: state_solver_test_suite.h:1099
tesseract_scene_graph::test_suite::getSceneGraph
SceneGraph::UPtr getSceneGraph(const tesseract_common::ResourceLocator &locator)
Definition: state_solver_test_suite.h:22
tesseract_scene_graph::StateSolver::UPtr
std::unique_ptr< StateSolver > UPtr
Definition: state_solver.h:50
tesseract_scene_graph::JointType::CONTINUOUS
@ CONTINUOUS
tesseract_scene_graph::Joint
tesseract_scene_graph::StateSolver::getLinkNames
virtual std::vector< std::string > getLinkNames() const =0
Get the vector of link names.
tesseract_scene_graph::test_suite::runJacobianTest
void runJacobianTest()
Definition: state_solver_test_suite.h:364
tesseract_scene_graph::SceneState::joint_transforms
tesseract_common::TransformMap joint_transforms
TESSERACT_COMMON_IGNORE_WARNINGS_POP
#define TESSERACT_COMMON_IGNORE_WARNINGS_POP
tesseract_scene_graph::SceneState::getJointValues
Eigen::VectorXd getJointValues(const std::vector< std::string > &joint_names) const
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_common::KinematicLimits::acceleration_limits
Eigen::MatrixX2d acceleration_limits
tesseract_common::KinematicLimits::velocity_limits
Eigen::MatrixX2d velocity_limits
tesseract_common::GeneralResourceLocator
tesseract_scene_graph::test_suite::runCompareStateSolverLimits
void runCompareStateSolverLimits(const SceneGraph &scene_graph, const StateSolver &comp_solver)
Definition: state_solver_test_suite.h:178
tesseract_scene_graph::Joint::type
JointType type
tesseract_scene_graph::StateSolver::getActiveLinkNames
virtual std::vector< std::string > getActiveLinkNames() const =0
Get the vector of active link names.
tesseract_scene_graph::SceneState::link_transforms
tesseract_common::TransformMap link_transforms
macros.h
box.h
tesseract_scene_graph::test_suite::runCompareSceneStates
void runCompareSceneStates(const SceneState &base_state, const SceneState &compare_state)
Definition: state_solver_test_suite.h:60
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_scene_graph::StateSolver::setState
virtual void setState(const Eigen::Ref< const Eigen::VectorXd > &joint_values, const tesseract_common::TransformMap &floating_joint_values={})=0
Set the current state of the solver.
tesseract_scene_graph::JointType::FIXED
@ FIXED
tesseract_scene_graph::test_suite::runReplaceJointTest
void runReplaceJointTest()
Definition: state_solver_test_suite.h:1686
tesseract_scene_graph::test_suite::runChangeJointLimitsTest
void runChangeJointLimitsTest()
Definition: state_solver_test_suite.h:1588
kdl_state_solver.h
Tesseract Scene Graph State Solver KDL Implementation.
tesseract_scene_graph::StateSolver::getJacobian
virtual Eigen::MatrixXd getJacobian(const Eigen::Ref< const Eigen::VectorXd > &joint_values, const std::string &link_name, const tesseract_common::TransformMap &floating_joint_values={}) const =0
Get the jacobian of the solver given the joint values.


tesseract_state_solver
Author(s): Levi Armstrong
autogenerated on Sun May 18 2025 03:02:10