tesseract_environment_unit.cpp
Go to the documentation of this file.
3 #include <gtest/gtest.h>
4 #include <algorithm>
5 #include <vector>
6 #include <omp.h>
7 #include <cmath>
8 #include <fstream>
9 #include <console_bridge/console.h>
11 
13 
15 
18 
21 #include <tesseract_common/utils.h>
22 
27 
30 
33 
37 
42 
43 using namespace tesseract_scene_graph;
44 using namespace tesseract_srdf;
45 using namespace tesseract_collision;
46 using namespace tesseract_environment;
47 
48 Eigen::Isometry3d tcpCallback(const tesseract_common::ManipulatorInfo& mi)
49 {
50  const std::string& tcp_offset_name = std::get<0>(mi.tcp_offset);
51  if (tcp_offset_name == "laser_callback")
52  return Eigen::Isometry3d::Identity() * Eigen::Translation3d(0, 0, 0.1);
53 
54  throw std::runtime_error("TCPCallback failed to find tcp!");
55 }
56 
58 {
59  std::string path = "package://tesseract_support/urdf/lbr_iiwa_14_r820.urdf";
60  return tesseract_urdf::parseURDFFile(locator.locateResource(path)->getFilePath(), locator);
61 }
62 
64 {
65  std::string path = "package://tesseract_support/urdf/lbr_iiwa_14_r820.srdf";
66 
67  auto srdf = std::make_shared<SRDFModel>();
68  srdf->initFile(scene_graph, locator.locateResource(path)->getFilePath(), locator);
69 
70  return srdf;
71 }
72 
74 {
75  std::string path = "package://tesseract_support/urdf/lbr_iiwa_14_r820.urdf";
76 
77  std::ifstream f(locator.locateResource(path)->getFilePath());
78  std::ostringstream ss;
79  ss << f.rdbuf();
80  return ss.str();
81 }
82 
84 {
85  std::string path = "package://tesseract_support/urdf/lbr_iiwa_14_r820.srdf";
86 
87  std::ifstream f(locator.locateResource(path)->getFilePath());
88  std::ostringstream ss;
89  ss << f.rdbuf();
90  return ss.str();
91 }
92 
94 {
95  SceneGraph::Ptr subgraph = std::make_shared<SceneGraph>();
96  subgraph->setName("subgraph");
97 
98  // Now add a link to empty environment
99  auto visual = std::make_shared<Visual>();
100  visual->geometry = std::make_shared<tesseract_geometry::Box>(1, 1, 1);
101  auto collision = std::make_shared<Collision>();
102  collision->geometry = std::make_shared<tesseract_geometry::Box>(1, 1, 1);
103 
104  const std::string link_name1 = "subgraph_base_link";
105  const std::string link_name2 = "subgraph_link_1";
106  const std::string joint_name1 = "subgraph_joint1";
107  Link link_1(link_name1);
108  link_1.visual.push_back(visual);
109  link_1.collision.push_back(collision);
110  Link link_2(link_name2);
111 
112  Joint joint_1(joint_name1);
113  joint_1.parent_to_joint_origin_transform.translation()(0) = 1.25;
114  joint_1.parent_link_name = link_name1;
115  joint_1.child_link_name = link_name2;
116  joint_1.type = JointType::FIXED;
117 
118  subgraph->addLink(link_1);
119  subgraph->addLink(link_2);
120  subgraph->addJoint(joint_1);
121 
122  return subgraph;
123 }
124 
126 {
127  StateSolver::Ptr state_solver = env.getStateSolver();
128  for (int i = 0; i < 20; ++i)
129  {
130  SceneState random_state = state_solver->getRandomState();
131  env.setState(random_state.joints);
132 
133  std::vector<std::string> link_names = env.getLinkNames();
134  SceneState env_state = env.getState();
136  for (std::size_t i = 0; i < link_names.size(); ++i)
137  {
138  EXPECT_TRUE(env_state.link_transforms.at(link_names.at(i)).isApprox(link_transforms.at(i), 1e-6));
139  EXPECT_TRUE(
140  env_state.link_transforms.at(link_names.at(i)).isApprox(env.getLinkTransform(link_names.at(i)), 1e-6));
141  }
142  }
143 
144  // Check relative link transform
145  std::vector<std::string> link_names = env.getLinkNames();
146  SceneState env_state = env.getState();
147  for (const auto& link1 : link_names)
148  {
149  for (const auto& link2 : link_names)
150  {
151  Eigen::Isometry3d t1 = env_state.link_transforms.at(link1).inverse() * env_state.link_transforms.at(link2);
152  Eigen::Isometry3d t2 = env.getRelativeLinkTransform(link1, link2);
153  EXPECT_TRUE(t1.isApprox(t2, 1e-6));
154  }
155  }
156 }
157 
159 {
160  OBJECT,
161  STRING,
162  FILEPATH
163 };
164 
166 {
168 
169  auto env = std::make_shared<Environment>();
170  EXPECT_TRUE(env != nullptr);
171  EXPECT_EQ(0, env->getRevision());
172  EXPECT_EQ(0, env->getInitRevision());
173  EXPECT_EQ(0, env->getCommandHistory().size());
174  EXPECT_FALSE(env->reset());
175  EXPECT_FALSE(env->isInitialized());
176  EXPECT_TRUE(env->clone() != nullptr);
177  EXPECT_TRUE(env->getEventCallbacks().empty());
178 
179  bool success = false;
180  switch (init_type)
181  {
183  {
185  EXPECT_TRUE(scene_graph != nullptr);
186 
187  // Check to make sure all links are enabled
188  for (const auto& link : scene_graph->getLinks())
189  {
190  EXPECT_TRUE(scene_graph->getLinkCollisionEnabled(link->getName()));
191  EXPECT_TRUE(scene_graph->getLinkVisibility(link->getName()));
192  }
193 
194  auto srdf = getSRDFModel(*scene_graph, locator);
195  EXPECT_TRUE(srdf != nullptr);
196 
197  success = env->init(*scene_graph, srdf);
198  EXPECT_TRUE(env->getResourceLocator() == nullptr);
199  env->setResourceLocator(std::make_shared<tesseract_common::GeneralResourceLocator>());
200  EXPECT_TRUE(env->getResourceLocator() != nullptr);
201  break;
202  }
204  {
205  std::string urdf_string = getSceneGraphString(locator);
206  std::string srdf_string = getSRDFModelString(locator);
207  success = env->init(urdf_string, srdf_string, std::make_shared<tesseract_common::GeneralResourceLocator>());
208  EXPECT_TRUE(env->getResourceLocator() != nullptr);
209  break;
210  }
212  {
213  std::filesystem::path urdf_path(
214  locator.locateResource("package://tesseract_support/urdf/lbr_iiwa_14_r820.urdf")->getFilePath());
215  std::filesystem::path srdf_path(
216  locator.locateResource("package://tesseract_support/urdf/lbr_iiwa_14_r820.srdf")->getFilePath());
217 
218  success = env->init(urdf_path, srdf_path, std::make_shared<tesseract_common::GeneralResourceLocator>());
219  EXPECT_TRUE(env->getResourceLocator() != nullptr);
220  break;
221  }
222  }
223 
224  Environment::ConstPtr env_const = env;
225  EXPECT_TRUE(success);
226  EXPECT_EQ(3, env->getRevision());
227  EXPECT_EQ(3, env->getInitRevision());
228  EXPECT_TRUE(env->isInitialized());
229 
230  // Check to make sure all links are enabled
231  for (const auto& link : env->getSceneGraph()->getLinks())
232  {
233  EXPECT_TRUE(env->getSceneGraph()->getLinkCollisionEnabled(link->getName()));
234  EXPECT_TRUE(env->getSceneGraph()->getLinkVisibility(link->getName()));
235  }
236 
237  EXPECT_EQ(env->getFindTCPOffsetCallbacks().size(), 0);
238  env->addFindTCPOffsetCallback(tcpCallback);
239  EXPECT_EQ(env->getFindTCPOffsetCallbacks().size(), 1);
240 
241  // Check Group Names
242  tesseract_srdf::GroupNames group_names = env->getGroupNames();
243  std::vector<std::string> group_names_v(group_names.begin(), group_names.end());
244  EXPECT_EQ(group_names_v.size(), 2);
245  EXPECT_EQ(group_names_v[0], "manipulator");
246  EXPECT_EQ(group_names_v[1], "manipulator_joint_group");
247 
248  // Check Group Joint Names
249  std::vector<std::string> target_joint_names = { "joint_a1", "joint_a2", "joint_a3", "joint_a4",
250  "joint_a5", "joint_a6", "joint_a7" };
251  {
252  std::vector<std::string> joint_names = env->getGroupJointNames("manipulator");
253  EXPECT_TRUE(tesseract_common::isIdentical(joint_names, target_joint_names));
254  }
255 
256  {
257  std::vector<std::string> joint_names = env->getGroupJointNames("manipulator_joint_group");
258  EXPECT_TRUE(tesseract_common::isIdentical(joint_names, target_joint_names));
259  }
260 
261  // Check Get Joint Group
262  auto jg = env->getJointGroup("manipulator");
263  EXPECT_TRUE(jg != nullptr);
264 
265  EXPECT_ANY_THROW(env->getJointGroup("does_not_exist")); // NOLINT
266 
267  // Check Get Joint Group
268  auto kg = env->getKinematicGroup("manipulator");
269  EXPECT_TRUE(kg != nullptr);
270 
271  EXPECT_ANY_THROW(env->getKinematicGroup("does_not_exist")); // NOLINT
272 
273  // Check Kinematics Information
274  tesseract_srdf::KinematicsInformation kin_info = env->getKinematicsInformation();
275  std::vector<std::string> group_names_ki(kin_info.group_names.begin(), kin_info.group_names.end());
276  EXPECT_EQ(group_names_ki.size(), 2);
277  EXPECT_EQ(group_names_ki[0], "manipulator");
278  EXPECT_EQ(group_names_ki[1], "manipulator_joint_group");
279 
280  // Check allowed collision matrix is not nullptr
281  EXPECT_TRUE(env->getDiscreteContactManager()->getContactAllowedValidator() != nullptr);
282  EXPECT_TRUE(env->getContinuousContactManager()->getContactAllowedValidator() != nullptr);
283 
284  // Get active contact managers
285  {
286  tesseract_common::ContactManagersPluginInfo cm_info = env->getContactManagersPluginInfo();
287  EXPECT_EQ(cm_info.discrete_plugin_infos.default_plugin, "BulletDiscreteBVHManager");
288  EXPECT_EQ(cm_info.continuous_plugin_infos.default_plugin, "BulletCastBVHManager");
289  EXPECT_EQ(env->getDiscreteContactManager()->getName(), "BulletDiscreteBVHManager");
290  EXPECT_EQ(env->getContinuousContactManager()->getName(), "BulletCastBVHManager");
291  EXPECT_EQ(env->getDiscreteContactManager()->getCollisionObjects().size(), 8);
292  EXPECT_EQ(env->getContinuousContactManager()->getCollisionObjects().size(), 8);
293  }
294  {
295  env->setActiveDiscreteContactManager("BulletDiscreteSimpleManager");
296  env->setActiveContinuousContactManager("BulletCastSimpleManager");
297  tesseract_common::ContactManagersPluginInfo cm_info = env->getContactManagersPluginInfo();
298  EXPECT_EQ(cm_info.discrete_plugin_infos.default_plugin, "BulletDiscreteSimpleManager");
299  EXPECT_EQ(cm_info.continuous_plugin_infos.default_plugin, "BulletCastSimpleManager");
300  EXPECT_EQ(env->getDiscreteContactManager()->getName(), "BulletDiscreteSimpleManager");
301  EXPECT_EQ(env->getContinuousContactManager()->getName(), "BulletCastSimpleManager");
302  EXPECT_EQ(env->getDiscreteContactManager()->getCollisionObjects().size(), 8);
303  EXPECT_EQ(env->getContinuousContactManager()->getCollisionObjects().size(), 8);
304  }
305  {
306  env->setActiveDiscreteContactManager("does_not_exist");
307  env->setActiveContinuousContactManager("does_not_exist");
308  tesseract_common::ContactManagersPluginInfo cm_info = env->getContactManagersPluginInfo();
309  EXPECT_EQ(cm_info.discrete_plugin_infos.default_plugin, "BulletDiscreteSimpleManager");
310  EXPECT_EQ(cm_info.continuous_plugin_infos.default_plugin, "BulletCastSimpleManager");
311  EXPECT_EQ(env->getDiscreteContactManager()->getName(), "BulletDiscreteSimpleManager");
312  EXPECT_EQ(env->getContinuousContactManager()->getName(), "BulletCastSimpleManager");
313  EXPECT_EQ(env->getDiscreteContactManager()->getCollisionObjects().size(), 8);
314  EXPECT_EQ(env->getContinuousContactManager()->getCollisionObjects().size(), 8);
315  }
316  {
317  env->clearCachedDiscreteContactManager();
318  env->clearCachedContinuousContactManager();
319  tesseract_common::ContactManagersPluginInfo cm_info = env->getContactManagersPluginInfo();
320  EXPECT_EQ(cm_info.discrete_plugin_infos.default_plugin, "BulletDiscreteSimpleManager");
321  EXPECT_EQ(cm_info.continuous_plugin_infos.default_plugin, "BulletCastSimpleManager");
322  EXPECT_EQ(env->getDiscreteContactManager()->getName(), "BulletDiscreteSimpleManager");
323  EXPECT_EQ(env->getContinuousContactManager()->getName(), "BulletCastSimpleManager");
324  EXPECT_EQ(env->getDiscreteContactManager()->getCollisionObjects().size(), 8);
325  EXPECT_EQ(env->getContinuousContactManager()->getCollisionObjects().size(), 8);
326  }
327  {
328  env->setActiveDiscreteContactManager("BulletDiscreteBVHManager");
329  env->setActiveContinuousContactManager("BulletCastBVHManager");
330  tesseract_common::ContactManagersPluginInfo cm_info = env->getContactManagersPluginInfo();
331  EXPECT_EQ(cm_info.discrete_plugin_infos.default_plugin, "BulletDiscreteBVHManager");
332  EXPECT_EQ(cm_info.continuous_plugin_infos.default_plugin, "BulletCastBVHManager");
333  EXPECT_EQ(env->getDiscreteContactManager()->getName(), "BulletDiscreteBVHManager");
334  EXPECT_EQ(env->getContinuousContactManager()->getName(), "BulletCastBVHManager");
335  EXPECT_EQ(env->getDiscreteContactManager()->getCollisionObjects().size(), 8);
336  EXPECT_EQ(env->getContinuousContactManager()->getCollisionObjects().size(), 8);
337  }
338 
339  // Test getting contact managers
340  {
341  EXPECT_EQ(env->getDiscreteContactManager("BulletDiscreteSimpleManager")->getName(), "BulletDiscreteSimpleManager");
342  EXPECT_EQ(env->getContinuousContactManager("BulletCastSimpleManager")->getName(), "BulletCastSimpleManager");
343  }
344 
345  // Failed
346  EXPECT_TRUE(env->getDiscreteContactManager("does_not_exist") == nullptr);
347  EXPECT_TRUE(env->getContinuousContactManager("does_not_exist") == nullptr);
348 
349  return env;
350 }
351 
353 {
355 
356  auto env = std::make_shared<Environment>();
357  EXPECT_TRUE(env != nullptr);
358  EXPECT_EQ(0, env->getRevision());
359  EXPECT_EQ(0, env->getInitRevision());
360  EXPECT_EQ(0, env->getCommandHistory().size());
361  EXPECT_FALSE(env->reset());
362  EXPECT_FALSE(env->isInitialized());
363  EXPECT_TRUE(env->clone() != nullptr);
364 
365  bool success = false;
366  switch (init_type)
367  {
369  {
371  EXPECT_TRUE(scene_graph != nullptr);
372 
373  // Check to make sure all links are enabled
374  for (const auto& link : scene_graph->getLinks())
375  {
376  EXPECT_TRUE(scene_graph->getLinkCollisionEnabled(link->getName()));
377  EXPECT_TRUE(scene_graph->getLinkVisibility(link->getName()));
378  }
379 
380  success = env->init(*scene_graph);
381  EXPECT_TRUE(env->getResourceLocator() == nullptr);
382  env->setResourceLocator(std::make_shared<tesseract_common::GeneralResourceLocator>());
383  EXPECT_TRUE(env->getResourceLocator() != nullptr);
384  break;
385  }
387  {
388  std::string urdf_string = getSceneGraphString(locator);
389  success = env->init(urdf_string, std::make_shared<tesseract_common::GeneralResourceLocator>());
390  EXPECT_TRUE(env->getResourceLocator() != nullptr);
391  break;
392  }
394  {
395  std::filesystem::path urdf_path(
396  locator.locateResource("package://tesseract_support/urdf/lbr_iiwa_14_r820.urdf")->getFilePath());
397  success = env->init(urdf_path, std::make_shared<tesseract_common::GeneralResourceLocator>());
398  EXPECT_TRUE(env->getResourceLocator() != nullptr);
399  break;
400  }
401  }
402 
403  Environment::ConstPtr env_const = env;
404  EXPECT_TRUE(success);
405  EXPECT_EQ(1, env->getRevision());
406  EXPECT_EQ(1, env->getInitRevision());
407  EXPECT_TRUE(env->isInitialized());
408 
409  // Check to make sure all links are enabled
410  for (const auto& link : env->getSceneGraph()->getLinks())
411  {
412  EXPECT_TRUE(env->getSceneGraph()->getLinkCollisionEnabled(link->getName()));
413  EXPECT_TRUE(env->getSceneGraph()->getLinkVisibility(link->getName()));
414  }
415 
416  EXPECT_TRUE(env->getDiscreteContactManager() == nullptr);
417  EXPECT_TRUE(env->getContinuousContactManager() == nullptr);
418 
419  return env;
420 }
421 
422 TEST(TesseractEnvironmentUnit, EnvInitURDFOnlyUnit) // NOLINT
423 {
427 }
428 
429 TEST(TesseractEnvironmentUnit, EnvInitFailuresUnit) // NOLINT
430 {
431  auto rl = std::make_shared<tesseract_common::GeneralResourceLocator>();
432  {
433  auto env = std::make_shared<Environment>();
434  EXPECT_TRUE(env != nullptr);
435  EXPECT_EQ(0, env->getRevision());
436  EXPECT_EQ(0, env->getInitRevision());
437  EXPECT_FALSE(env->reset());
438  EXPECT_FALSE(env->isInitialized());
439  EXPECT_TRUE(env->clone() != nullptr);
440  }
441 
442  { // Test Empty commands
443  Commands commands;
444  auto env = std::make_shared<Environment>();
445 
446  EXPECT_FALSE(env->init(commands));
447  EXPECT_FALSE(env->isInitialized());
448  }
449 
450  { // Test scene graph is not first command
451  Commands commands;
452  auto env = std::make_shared<Environment>();
453  auto cmd = std::make_shared<MoveJointCommand>("joint_name", "parent_link");
454  commands.push_back(cmd);
455  EXPECT_FALSE(env->init(commands));
456  EXPECT_FALSE(env->isInitialized());
457  }
458 
459  { // Test Empty URDF String
460  auto env = std::make_shared<Environment>();
461  std::string urdf_string;
462  EXPECT_FALSE(env->init(urdf_string, rl));
463  EXPECT_FALSE(env->isInitialized());
464  }
465 
466  { // Test bad URDF file path
467  auto env = std::make_shared<Environment>();
468  std::filesystem::path urdf_path("/usr/tmp/doesnotexist.urdf");
469  EXPECT_FALSE(env->init(urdf_path, rl));
470  EXPECT_FALSE(env->isInitialized());
471  }
472 
473  { // Test Empty URDF String with srdf
474  auto env = std::make_shared<Environment>();
475  std::string urdf_string;
476  std::string srdf_string = getSRDFModelString(*rl);
477  EXPECT_FALSE(env->init(urdf_string, srdf_string, rl));
478  EXPECT_FALSE(env->isInitialized());
479  }
480 
481  { // Test bad URDF file path with srdf
482  auto env = std::make_shared<Environment>();
483  std::filesystem::path urdf_path("/usr/tmp/doesnotexist.urdf");
484  std::filesystem::path srdf_path(
485  rl->locateResource("package://tesseract_support/urdf/lbr_iiwa_14_r820.srdf")->getFilePath());
486  EXPECT_FALSE(env->init(urdf_path, srdf_path, rl));
487  EXPECT_FALSE(env->isInitialized());
488  }
489 
490  { // Test URDF String with empty srdf
491  auto env = std::make_shared<Environment>();
492  std::string urdf_string = getSceneGraphString(*rl);
493  std::string srdf_string;
494  EXPECT_FALSE(env->init(urdf_string, srdf_string, rl));
495  EXPECT_FALSE(env->isInitialized());
496  }
497 
498  { // Test URDF file path with bad srdf path
499  auto env = std::make_shared<Environment>();
500  std::filesystem::path urdf_path(
501  rl->locateResource("package://tesseract_support/urdf/lbr_iiwa_14_r820.urdf")->getFilePath());
502  std::filesystem::path srdf_path("/usr/tmp/doesnotexist.srdf");
503  EXPECT_FALSE(env->init(urdf_path, srdf_path, rl));
504  EXPECT_FALSE(env->isInitialized());
505  }
506 }
507 
508 TEST(TesseractEnvironmentUnit, EnvCloneContactManagerUnit) // NOLINT
509 {
510  { // Get the environment
512 
513  // Test after clone if active list correct
514  tesseract_collision::DiscreteContactManager::Ptr discrete_manager = env->getDiscreteContactManager();
515  const std::vector<std::string>& e_active_list = env->getActiveLinkNames();
516  const std::vector<std::string>& d_active_list = discrete_manager->getActiveCollisionObjects();
517  EXPECT_TRUE(std::equal(e_active_list.begin(), e_active_list.end(), d_active_list.begin()));
518 
519  tesseract_collision::ContinuousContactManager::Ptr cast_manager = env->getContinuousContactManager();
520  const std::vector<std::string>& c_active_list = cast_manager->getActiveCollisionObjects();
521  EXPECT_TRUE(std::equal(e_active_list.begin(), e_active_list.end(), c_active_list.begin()));
522  }
523 
524  { // Get the environment
526 
527  // Test after clone if active list correct
528  tesseract_collision::DiscreteContactManager::Ptr discrete_manager = env->getDiscreteContactManager();
529  const std::vector<std::string>& e_active_list = env->getActiveLinkNames();
530  const std::vector<std::string>& d_active_list = discrete_manager->getActiveCollisionObjects();
531  EXPECT_TRUE(std::equal(e_active_list.begin(), e_active_list.end(), d_active_list.begin()));
532 
533  tesseract_collision::ContinuousContactManager::Ptr cast_manager = env->getContinuousContactManager();
534  const std::vector<std::string>& c_active_list = cast_manager->getActiveCollisionObjects();
535  EXPECT_TRUE(std::equal(e_active_list.begin(), e_active_list.end(), c_active_list.begin()));
536  }
537 
538  { // Get the environment
540 
541  // Test after clone if active list correct
542  tesseract_collision::DiscreteContactManager::Ptr discrete_manager = env->getDiscreteContactManager();
543  const std::vector<std::string>& e_active_list = env->getActiveLinkNames();
544  const std::vector<std::string>& d_active_list = discrete_manager->getActiveCollisionObjects();
545  EXPECT_TRUE(std::equal(e_active_list.begin(), e_active_list.end(), d_active_list.begin()));
546 
547  tesseract_collision::ContinuousContactManager::Ptr cast_manager = env->getContinuousContactManager();
548  const std::vector<std::string>& c_active_list = cast_manager->getActiveCollisionObjects();
549  EXPECT_TRUE(std::equal(e_active_list.begin(), e_active_list.end(), c_active_list.begin()));
550  }
551 }
552 
553 TEST(TesseractEnvironmentUnit, EnvAddAndRemoveAllowedCollisionCommandUnit) // NOLINT
554 {
555  // Get the environment
556  auto env = getEnvironment();
557 
558  int callback_counter{ 0 };
559  EventCallbackFn callback = [&callback_counter](const Event& /*event*/) { ++callback_counter; };
560 
561  env->addEventCallback(0, callback);
562  EXPECT_FALSE(env->getEventCallbacks().empty());
563  env->removeEventCallback(0);
564  EXPECT_TRUE(env->getEventCallbacks().empty());
565 
566  env->addEventCallback(0, callback);
567  EXPECT_FALSE(env->getEventCallbacks().empty());
568  env->clearEventCallbacks();
569  EXPECT_TRUE(env->getEventCallbacks().empty());
570 
571  env->addEventCallback(0, callback);
572  EXPECT_FALSE(env->getEventCallbacks().empty());
573  EXPECT_EQ(callback_counter, 0);
574 
575  std::string l1 = "link_1";
576  std::string l2 = "link_6";
577  std::string r = "Unit Test";
578 
579  tesseract_common::AllowedCollisionMatrix::ConstPtr acm = env->getAllowedCollisionMatrix();
580  EXPECT_TRUE(acm->isCollisionAllowed(l1, "base_link"));
581  EXPECT_TRUE(acm->isCollisionAllowed(l1, "link_2"));
582  EXPECT_TRUE(acm->isCollisionAllowed(l1, "link_3"));
583  EXPECT_TRUE(acm->isCollisionAllowed(l1, "link_4"));
584  EXPECT_TRUE(acm->isCollisionAllowed(l1, "link_5"));
585  EXPECT_TRUE(acm->isCollisionAllowed(l1, "link_6"));
586  EXPECT_TRUE(acm->isCollisionAllowed(l1, "link_7"));
587  EXPECT_EQ(env->getRevision(), 3);
588  EXPECT_EQ(env->getInitRevision(), 3);
589  EXPECT_EQ(env->getCommandHistory().size(), 3);
590 
591  // Remove allowed collision
593  remove_ac.addAllowedCollision(l1, l2, "remove");
594  auto cmd_remove = std::make_shared<ModifyAllowedCollisionsCommand>(remove_ac, ModifyAllowedCollisionsType::REMOVE);
595  EXPECT_EQ(cmd_remove->getType(), CommandType::MODIFY_ALLOWED_COLLISIONS);
596  EXPECT_EQ(cmd_remove->getAllowedCollisionMatrix().getAllAllowedCollisions().size(), 1);
597  EXPECT_TRUE(cmd_remove->getAllowedCollisionMatrix().isCollisionAllowed(l1, l2));
598 
599  EXPECT_TRUE(env->applyCommand(cmd_remove));
600  EXPECT_EQ(callback_counter, 2);
601 
602  EXPECT_FALSE(acm->isCollisionAllowed(l1, l2));
603  EXPECT_EQ(env->getRevision(), 4);
604  EXPECT_EQ(env->getInitRevision(), 3);
605  EXPECT_EQ(env->getCommandHistory().size(), 4);
606  EXPECT_EQ(env->getCommandHistory().back(), cmd_remove);
607 
608  // Add allowed collision back
610  add_ac.addAllowedCollision(l1, l2, r);
611  auto cmd_add = std::make_shared<ModifyAllowedCollisionsCommand>(add_ac, ModifyAllowedCollisionsType::ADD);
612  EXPECT_EQ(cmd_add->getType(), CommandType::MODIFY_ALLOWED_COLLISIONS);
613  EXPECT_EQ(cmd_add->getAllowedCollisionMatrix().getAllAllowedCollisions().size(), 1);
614  EXPECT_TRUE(cmd_add->getAllowedCollisionMatrix().isCollisionAllowed(l1, l2));
615 
616  EXPECT_TRUE(env->applyCommand(cmd_add));
617  EXPECT_EQ(callback_counter, 4);
618 
619  EXPECT_TRUE(acm->isCollisionAllowed(l1, l2));
620  EXPECT_EQ(env->getRevision(), 5);
621  EXPECT_EQ(env->getInitRevision(), 3);
622  EXPECT_EQ(env->getCommandHistory().size(), 5);
623  EXPECT_EQ(env->getCommandHistory().back(), cmd_add);
624 
625  // Remove allowed collision
626  auto cmd_remove_link = std::make_shared<RemoveAllowedCollisionLinkCommand>(l1);
627  EXPECT_EQ(cmd_remove_link->getType(), CommandType::REMOVE_ALLOWED_COLLISION_LINK);
628  EXPECT_EQ(cmd_remove_link->getLinkName(), l1);
629 
630  EXPECT_TRUE(env->applyCommand(cmd_remove_link));
631  EXPECT_EQ(callback_counter, 6);
632 
633  EXPECT_FALSE(acm->isCollisionAllowed(l1, "base_link"));
634  EXPECT_FALSE(acm->isCollisionAllowed(l1, "link_2"));
635  EXPECT_FALSE(acm->isCollisionAllowed(l1, "link_3"));
636  EXPECT_FALSE(acm->isCollisionAllowed(l1, "link_4"));
637  EXPECT_FALSE(acm->isCollisionAllowed(l1, "link_5"));
638  EXPECT_FALSE(acm->isCollisionAllowed(l1, "link_6"));
639  EXPECT_FALSE(acm->isCollisionAllowed(l1, "link_7"));
640  EXPECT_EQ(env->getRevision(), 6);
641  EXPECT_EQ(env->getInitRevision(), 3);
642  EXPECT_EQ(env->getCommandHistory().size(), 6);
643  EXPECT_EQ(env->getCommandHistory().back(), cmd_remove_link);
644 }
645 
646 TEST(TesseractEnvironmentUnit, EnvAddandRemoveLink) // NOLINT
647 {
648  // Get the environment
649  auto env = getEnvironment();
650 
651  auto visual = std::make_shared<Visual>();
652  visual->geometry = std::make_shared<tesseract_geometry::Box>(1, 1, 1);
653  auto collision = std::make_shared<Collision>();
654  collision->geometry = std::make_shared<tesseract_geometry::Box>(1, 1, 1);
655 
656  const std::string link_name1 = "link_n1";
657  const std::string link_name2 = "link_n2";
658  const std::string joint_name1 = "joint_n1";
659  Link link_1(link_name1);
660  link_1.visual.push_back(visual);
661  link_1.collision.push_back(collision);
662  Link link_2(link_name2);
663 
664  Joint joint_1(joint_name1);
665  joint_1.parent_to_joint_origin_transform.translation()(0) = 1.25;
666  joint_1.parent_link_name = link_name1;
667  joint_1.child_link_name = link_name2;
668  joint_1.type = JointType::FIXED;
669 
670  {
671  auto cmd = std::make_shared<AddLinkCommand>(link_1);
672  EXPECT_TRUE(cmd != nullptr);
673  EXPECT_EQ(cmd->getType(), CommandType::ADD_LINK);
674  EXPECT_TRUE(cmd->getLink() != nullptr);
675  EXPECT_TRUE(cmd->getJoint() == nullptr);
676  EXPECT_TRUE(env->applyCommand(cmd));
677  }
678 
679  EXPECT_EQ(env->getRevision(), 4);
680  EXPECT_EQ(env->getInitRevision(), 3);
681  EXPECT_EQ(env->getCommandHistory().size(), 4);
682  EXPECT_TRUE(env->getDiscreteContactManager()->hasCollisionObject(link_name1));
683  EXPECT_FALSE(env->getDiscreteContactManager()->hasCollisionObject(link_name2));
684  EXPECT_TRUE(env->getContinuousContactManager()->hasCollisionObject(link_name1));
685  EXPECT_FALSE(env->getContinuousContactManager()->hasCollisionObject(link_name2));
686 
687  std::vector<std::string> link_names = env->getLinkNames();
688  std::vector<std::string> joint_names = env->getJointNames();
689  tesseract_scene_graph::SceneState state = env->getState();
690  EXPECT_TRUE(std::find(link_names.begin(), link_names.end(), link_name1) != link_names.end());
691  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), "joint_" + link_name1) != joint_names.end());
692  EXPECT_TRUE(state.link_transforms.find(link_name1) != state.link_transforms.end());
693  EXPECT_TRUE(state.joint_transforms.find("joint_" + link_name1) != state.joint_transforms.end());
694  EXPECT_TRUE(state.joints.find("joint_" + link_name1) == state.joints.end());
695 
696  {
697  auto cmd = std::make_shared<AddLinkCommand>(link_2, joint_1);
698  EXPECT_TRUE(cmd != nullptr);
699  EXPECT_EQ(cmd->getType(), CommandType::ADD_LINK);
700  EXPECT_TRUE(cmd->getLink() != nullptr);
701  EXPECT_TRUE(cmd->getJoint() != nullptr);
702  EXPECT_TRUE(env->applyCommand(cmd));
703  }
704 
705  EXPECT_EQ(env->getRevision(), 5);
706  EXPECT_EQ(env->getInitRevision(), 3);
707  EXPECT_EQ(env->getCommandHistory().size(), 5);
708 
709  link_names = env->getLinkNames();
710  joint_names = env->getJointNames();
711  state = env->getState();
712  EXPECT_TRUE(std::find(link_names.begin(), link_names.end(), link_name2) != link_names.end());
713  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), joint_name1) != joint_names.end());
714  EXPECT_TRUE(state.link_transforms.find(link_name2) != state.link_transforms.end());
715  EXPECT_TRUE(state.joint_transforms.find(joint_name1) != state.joint_transforms.end());
716  EXPECT_TRUE(state.joints.find(joint_name1) == state.joints.end());
717 
718  env->getSceneGraph()->saveDOT(tesseract_common::getTempPath() + "before_remove_link_unit.dot");
719 
720  {
721  auto cmd = std::make_shared<RemoveLinkCommand>(link_name1);
722  EXPECT_TRUE(cmd != nullptr);
723  EXPECT_EQ(cmd->getType(), CommandType::REMOVE_LINK);
724  EXPECT_EQ(cmd->getLinkName(), link_name1);
725  EXPECT_TRUE(env->applyCommand(cmd));
726  }
727 
728  EXPECT_EQ(env->getRevision(), 6);
729  EXPECT_EQ(env->getInitRevision(), 3);
730  EXPECT_EQ(env->getCommandHistory().size(), 6);
731  EXPECT_FALSE(env->getDiscreteContactManager()->hasCollisionObject(link_name1));
732  EXPECT_FALSE(env->getDiscreteContactManager()->hasCollisionObject(link_name2));
733  EXPECT_FALSE(env->getContinuousContactManager()->hasCollisionObject(link_name1));
734  EXPECT_FALSE(env->getContinuousContactManager()->hasCollisionObject(link_name2));
735 
736  link_names = env->getLinkNames();
737  joint_names = env->getJointNames();
738  state = env->getState();
739  EXPECT_TRUE(std::find(link_names.begin(), link_names.end(), link_name1) == link_names.end());
740  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), "joint_" + link_name1) == joint_names.end());
741  EXPECT_TRUE(std::find(link_names.begin(), link_names.end(), link_name2) == link_names.end());
742  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), joint_name1) == joint_names.end());
743  EXPECT_TRUE(state.link_transforms.find(link_name1) == state.link_transforms.end());
744  EXPECT_TRUE(state.joint_transforms.find("joint_" + link_name1) == state.joint_transforms.end());
745  EXPECT_TRUE(state.joints.find("joint_" + link_name1) == state.joints.end());
746  EXPECT_TRUE(state.link_transforms.find(link_name2) == state.link_transforms.end());
747  EXPECT_TRUE(state.joint_transforms.find(joint_name1) == state.joint_transforms.end());
748  EXPECT_TRUE(state.joints.find(joint_name1) == state.joints.end());
749 
750  env->getSceneGraph()->saveDOT(tesseract_common::getTempPath() + "after_remove_link_unit.dot");
751 
752  // Test against double removing
753  {
754  auto cmd = std::make_shared<RemoveLinkCommand>(link_name1);
755  EXPECT_TRUE(cmd != nullptr);
756  EXPECT_EQ(cmd->getType(), CommandType::REMOVE_LINK);
757  EXPECT_EQ(cmd->getLinkName(), link_name1);
758  EXPECT_FALSE(env->applyCommand(cmd));
759  }
760  EXPECT_EQ(env->getRevision(), 6);
761  EXPECT_EQ(env->getInitRevision(), 3);
762  EXPECT_EQ(env->getCommandHistory().size(), 6);
763 
764  {
765  auto cmd = std::make_shared<RemoveLinkCommand>(link_name2);
766  EXPECT_TRUE(cmd != nullptr);
767  EXPECT_EQ(cmd->getType(), CommandType::REMOVE_LINK);
768  EXPECT_EQ(cmd->getLinkName(), link_name2);
769  EXPECT_FALSE(env->applyCommand(cmd));
770  }
771  EXPECT_EQ(env->getRevision(), 6);
772  EXPECT_EQ(env->getInitRevision(), 3);
773  EXPECT_EQ(env->getCommandHistory().size(), 6);
774 
775  {
776  auto cmd = std::make_shared<RemoveJointCommand>(joint_name1);
777  EXPECT_TRUE(cmd != nullptr);
778  EXPECT_EQ(cmd->getType(), CommandType::REMOVE_JOINT);
779  EXPECT_EQ(cmd->getJointName(), joint_name1);
780  EXPECT_FALSE(env->applyCommand(cmd));
781  }
782  EXPECT_EQ(env->getRevision(), 6);
783  EXPECT_EQ(env->getInitRevision(), 3);
784  EXPECT_EQ(env->getCommandHistory().size(), 6);
785 
786  {
787  auto cmd = std::make_shared<RemoveJointCommand>("joint_" + link_name1);
788  EXPECT_TRUE(cmd != nullptr);
789  EXPECT_EQ(cmd->getType(), CommandType::REMOVE_JOINT);
790  EXPECT_EQ(cmd->getJointName(), "joint_" + link_name1);
791  EXPECT_FALSE(env->applyCommand(cmd));
792  }
793  EXPECT_EQ(env->getRevision(), 6);
794  EXPECT_EQ(env->getInitRevision(), 3);
795  EXPECT_EQ(env->getCommandHistory().size(), 6);
796 
797  { // Test when joint child link name does not match link names
798  const std::string link_name3 = "link_n3";
799  const std::string joint_name3 = "joint_n3";
800  Link link_3(link_name3);
801 
802  Joint joint_3(joint_name3);
803  joint_3.parent_to_joint_origin_transform.translation()(0) = 1.25;
804  joint_3.parent_link_name = link_name1;
805  joint_3.child_link_name = "does_not_exist";
806  joint_3.type = JointType::FIXED;
807 
808  EXPECT_ANY_THROW(std::make_shared<AddLinkCommand>(link_3, joint_3)); // NOLINT
809  }
810 }
811 
812 TEST(TesseractEnvironmentUnit, EnvAddandRemoveTrajectoryLink) // NOLINT
813 {
814  // Get the environment
815  auto env = getEnvironment();
816 
818  trajectory.push_back(tesseract_common::JointState({ "joint_a1", "joint_a2" }, Eigen::VectorXd::Zero(2)));
819  trajectory.push_back(tesseract_common::JointState({ "joint_a1", "joint_a2" }, Eigen::VectorXd::Ones(2)));
820 
821  std::string link_name = "traj_link";
822  std::string parent_link_name = "base_link";
823 
824  {
825  auto cmd = std::make_shared<AddTrajectoryLinkCommand>(link_name, parent_link_name, trajectory, false);
826  EXPECT_TRUE(cmd != nullptr);
827  EXPECT_EQ(cmd->getType(), CommandType::ADD_TRAJECTORY_LINK);
828  EXPECT_TRUE(cmd->getLinkName() == link_name);
829  EXPECT_TRUE(cmd->getParentLinkName() == parent_link_name);
830  EXPECT_TRUE(!cmd->getTrajectory().empty());
831  EXPECT_TRUE(cmd->replaceAllowed() == false);
832  EXPECT_TRUE(env->applyCommand(cmd));
833  }
834 
835  EXPECT_EQ(env->getRevision(), 4);
836  EXPECT_EQ(env->getInitRevision(), 3);
837  EXPECT_EQ(env->getCommandHistory().size(), 4);
838  EXPECT_TRUE(env->getDiscreteContactManager()->hasCollisionObject(link_name));
839  EXPECT_TRUE(env->getContinuousContactManager()->hasCollisionObject(link_name));
840 
841  std::vector<std::string> link_names = env->getLinkNames();
842  std::vector<std::string> joint_names = env->getJointNames();
843  tesseract_scene_graph::SceneState state = env->getState();
844  EXPECT_TRUE(std::find(link_names.begin(), link_names.end(), link_name) != link_names.end());
845  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), "joint_" + link_name) != joint_names.end());
846  EXPECT_TRUE(state.link_transforms.find(link_name) != state.link_transforms.end());
847  EXPECT_TRUE(state.joint_transforms.find("joint_" + link_name) != state.joint_transforms.end());
848  EXPECT_TRUE(state.joints.find("joint_" + link_name) == state.joints.end());
849 
850  env->getSceneGraph()->saveDOT(tesseract_common::getTempPath() + "before_remove_traj_link_unit.dot");
851 
852  {
853  auto cmd = std::make_shared<RemoveLinkCommand>(link_name);
854  EXPECT_TRUE(cmd != nullptr);
855  EXPECT_EQ(cmd->getType(), CommandType::REMOVE_LINK);
856  EXPECT_EQ(cmd->getLinkName(), link_name);
857  EXPECT_TRUE(env->applyCommand(cmd));
858  }
859 
860  EXPECT_EQ(env->getRevision(), 5);
861  EXPECT_EQ(env->getInitRevision(), 3);
862  EXPECT_EQ(env->getCommandHistory().size(), 5);
863  EXPECT_FALSE(env->getDiscreteContactManager()->hasCollisionObject(link_name));
864  EXPECT_FALSE(env->getContinuousContactManager()->hasCollisionObject(link_name));
865 
866  link_names = env->getLinkNames();
867  joint_names = env->getJointNames();
868  state = env->getState();
869  EXPECT_TRUE(std::find(link_names.begin(), link_names.end(), link_name) == link_names.end());
870  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), "joint_" + link_name) == joint_names.end());
871  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), link_name) == joint_names.end());
872  EXPECT_TRUE(state.link_transforms.find(link_name) == state.link_transforms.end());
873  EXPECT_TRUE(state.joint_transforms.find("joint_" + link_name) == state.joint_transforms.end());
874  EXPECT_TRUE(state.joints.find("joint_" + link_name) == state.joints.end());
875  EXPECT_TRUE(state.joint_transforms.find(link_name) == state.joint_transforms.end());
876  EXPECT_TRUE(state.joints.find(link_name) == state.joints.end());
877 
878  env->getSceneGraph()->saveDOT(tesseract_common::getTempPath() + "after_remove_traj_link_unit.dot");
879 
880  // Test against double removing
881  {
882  auto cmd = std::make_shared<RemoveLinkCommand>(link_name);
883  EXPECT_TRUE(cmd != nullptr);
884  EXPECT_EQ(cmd->getType(), CommandType::REMOVE_LINK);
885  EXPECT_EQ(cmd->getLinkName(), link_name);
886  EXPECT_FALSE(env->applyCommand(cmd));
887  }
888  EXPECT_EQ(env->getRevision(), 5);
889  EXPECT_EQ(env->getInitRevision(), 3);
890  EXPECT_EQ(env->getCommandHistory().size(), 5);
891 
892  {
893  auto cmd = std::make_shared<RemoveJointCommand>("joint_" + link_name);
894  EXPECT_TRUE(cmd != nullptr);
895  EXPECT_EQ(cmd->getType(), CommandType::REMOVE_JOINT);
896  EXPECT_EQ(cmd->getJointName(), "joint_" + link_name);
897  EXPECT_FALSE(env->applyCommand(cmd));
898  }
899  EXPECT_EQ(env->getRevision(), 5);
900  EXPECT_EQ(env->getInitRevision(), 3);
901  EXPECT_EQ(env->getCommandHistory().size(), 5);
902 }
903 
904 TEST(TesseractEnvironmentUnit, EnvAddKinematicsInformationCommandUnit) // NOLINT
905 {
906  // Get the environment
907  auto env = getEnvironment();
908 
909  KinematicsInformation kin_info;
910 
911  auto cmd = std::make_shared<AddKinematicsInformationCommand>(kin_info);
912 
913  EXPECT_TRUE(cmd != nullptr);
914  EXPECT_EQ(cmd->getType(), CommandType::ADD_KINEMATICS_INFORMATION);
915  KinematicsInformation kin_info2 = cmd->getKinematicsInformation();
916  EXPECT_TRUE(kin_info2.group_names == kin_info.group_names);
917  EXPECT_TRUE(kin_info2.group_names == kin_info.group_names);
918  EXPECT_TRUE(kin_info2.chain_groups == kin_info.chain_groups);
919  EXPECT_TRUE(kin_info2.joint_groups == kin_info.joint_groups);
920  EXPECT_TRUE(kin_info2.link_groups == kin_info.link_groups);
921  EXPECT_TRUE(kin_info2.group_states == kin_info.group_states);
922  EXPECT_TRUE(env->applyCommand(cmd));
923 
924  EXPECT_EQ(env->getRevision(), 4);
925  EXPECT_EQ(env->getInitRevision(), 3);
926  EXPECT_EQ(env->getCommandHistory().size(), 4);
927 }
928 
929 TEST(TesseractEnvironmentUnit, EnvAddSceneGraphCommandUnit) // NOLINT
930 {
931  // Get the environment
932  auto env = getEnvironment();
933 
934  SceneGraph::Ptr subgraph = std::make_shared<SceneGraph>();
935  subgraph->setName("subgraph");
936 
937  { // Adding an empty scene graph which should fail
938  auto cmd = std::make_shared<AddSceneGraphCommand>(*subgraph);
939  EXPECT_TRUE(cmd != nullptr);
940  EXPECT_EQ(cmd->getType(), CommandType::ADD_SCENE_GRAPH);
941  EXPECT_TRUE(cmd->getSceneGraph() != nullptr);
942  EXPECT_FALSE(env->applyCommand(cmd));
943  }
944 
945  EXPECT_EQ(env->getRevision(), 3);
946  EXPECT_EQ(env->getInitRevision(), 3);
947  EXPECT_EQ(env->getCommandHistory().size(), 3);
948 
949  Joint joint_1("provided_subgraph_joint");
950  joint_1.parent_link_name = "base_link";
951  joint_1.child_link_name = "prefix_subgraph_base_link";
952  joint_1.type = JointType::FIXED;
953 
954  { // Adding an empty scene graph which should fail with joint
955  auto cmd = std::make_shared<AddSceneGraphCommand>(*subgraph, joint_1);
956  EXPECT_TRUE(cmd != nullptr);
957  EXPECT_EQ(cmd->getType(), CommandType::ADD_SCENE_GRAPH);
958  EXPECT_TRUE(cmd->getSceneGraph() != nullptr);
959  EXPECT_FALSE(env->applyCommand(cmd));
960  }
961 
962  EXPECT_EQ(env->getRevision(), 3);
963  EXPECT_EQ(env->getInitRevision(), 3);
964  EXPECT_EQ(env->getCommandHistory().size(), 3);
965 
966  subgraph = getSubSceneGraph();
967 
968  const std::string link_name1 = "subgraph_base_link";
969  const std::string link_name2 = "subgraph_link_1";
970  const std::string joint_name1 = "subgraph_joint1";
971 
972  {
973  auto cmd = std::make_shared<AddSceneGraphCommand>(*subgraph);
974  EXPECT_TRUE(cmd != nullptr);
975  EXPECT_EQ(cmd->getType(), CommandType::ADD_SCENE_GRAPH);
976  EXPECT_TRUE(cmd->getSceneGraph() != nullptr);
977  EXPECT_TRUE(env->applyCommand(cmd));
978  }
979 
980  EXPECT_EQ(env->getRevision(), 4);
981  EXPECT_EQ(env->getInitRevision(), 3);
982  EXPECT_EQ(env->getCommandHistory().size(), 4);
983  EXPECT_TRUE(env->getDiscreteContactManager()->hasCollisionObject(link_name1));
984  EXPECT_FALSE(env->getDiscreteContactManager()->hasCollisionObject(link_name2));
985  EXPECT_TRUE(env->getContinuousContactManager()->hasCollisionObject(link_name1));
986  EXPECT_FALSE(env->getContinuousContactManager()->hasCollisionObject(link_name2));
987 
988  tesseract_scene_graph::SceneState state = env->getState();
989  EXPECT_TRUE(env->getJoint("subgraph_joint") != nullptr);
990  EXPECT_TRUE(env->getLink(link_name1) != nullptr);
991  EXPECT_TRUE(state.link_transforms.find(link_name1) != state.link_transforms.end());
992  EXPECT_TRUE(state.joint_transforms.find("subgraph_joint") != state.joint_transforms.end());
993  EXPECT_TRUE(state.joints.find("subgraph_joint") == state.joints.end());
994 
995  { // Adding twice with the same name should fail
996  auto cmd = std::make_shared<AddSceneGraphCommand>(*subgraph);
997  EXPECT_TRUE(cmd != nullptr);
998  EXPECT_EQ(cmd->getType(), CommandType::ADD_SCENE_GRAPH);
999  EXPECT_TRUE(cmd->getSceneGraph() != nullptr);
1000  EXPECT_FALSE(env->applyCommand(cmd));
1001  }
1002 
1003  EXPECT_EQ(env->getRevision(), 4);
1004  EXPECT_EQ(env->getInitRevision(), 3);
1005  EXPECT_EQ(env->getCommandHistory().size(), 4);
1006 
1007  // Add subgraph with prefix
1008  {
1009  auto cmd = std::make_shared<AddSceneGraphCommand>(*subgraph, "prefix_");
1010  EXPECT_TRUE(cmd != nullptr);
1011  EXPECT_EQ(cmd->getType(), CommandType::ADD_SCENE_GRAPH);
1012  EXPECT_TRUE(cmd->getSceneGraph() != nullptr);
1013  EXPECT_TRUE(env->applyCommand(cmd));
1014  }
1015 
1016  EXPECT_EQ(env->getRevision(), 5);
1017  EXPECT_EQ(env->getInitRevision(), 3);
1018  EXPECT_EQ(env->getCommandHistory().size(), 5);
1019 
1020  state = env->getState();
1021  EXPECT_TRUE(env->getJoint("prefix_subgraph_joint") != nullptr);
1022  EXPECT_TRUE(env->getLink("prefix_subgraph_base_link") != nullptr);
1023  EXPECT_TRUE(state.link_transforms.find(link_name1) != state.link_transforms.end());
1024  EXPECT_TRUE(state.joint_transforms.find("subgraph_joint") != state.joint_transforms.end());
1025  EXPECT_TRUE(state.joints.find("subgraph_joint") == state.joints.end());
1026  EXPECT_TRUE(state.link_transforms.find("prefix_subgraph_base_link") != state.link_transforms.end());
1027  EXPECT_TRUE(state.joint_transforms.find("prefix_subgraph_joint") != state.joint_transforms.end());
1028  EXPECT_TRUE(state.joints.find("prefix_subgraph_joint") == state.joints.end());
1029 
1030  // Add subgraph with prefix and joint
1031  joint_1.child_link_name = "prefix2_subgraph_base_link";
1032  {
1033  auto cmd = std::make_shared<AddSceneGraphCommand>(*subgraph, joint_1, "prefix2_");
1034  EXPECT_TRUE(cmd != nullptr);
1035  EXPECT_EQ(cmd->getType(), CommandType::ADD_SCENE_GRAPH);
1036  EXPECT_TRUE(cmd->getSceneGraph() != nullptr);
1037  EXPECT_TRUE(env->applyCommand(cmd));
1038  }
1039 
1040  EXPECT_EQ(env->getRevision(), 6);
1041  EXPECT_EQ(env->getInitRevision(), 3);
1042  EXPECT_EQ(env->getCommandHistory().size(), 6);
1043 
1044  state = env->getState();
1045  EXPECT_TRUE(env->getJoint("provided_subgraph_joint") != nullptr);
1046  EXPECT_TRUE(env->getLink("prefix2_subgraph_base_link") != nullptr);
1047  EXPECT_TRUE(state.link_transforms.find("prefix2_subgraph_base_link") != state.link_transforms.end());
1048  EXPECT_TRUE(state.joint_transforms.find("provided_subgraph_joint") != state.joint_transforms.end());
1049  EXPECT_TRUE(state.joints.find("provided_subgraph_joint") == state.joints.end());
1050 }
1051 
1052 TEST(TesseractEnvironmentUnit, EnvChangeJointLimitsCommandUnit) // NOLINT
1053 {
1054  // Get the environment
1055  auto env = getEnvironment();
1056  EXPECT_EQ(env->getRevision(), 3);
1057  EXPECT_EQ(env->getInitRevision(), 3);
1058  EXPECT_EQ(env->getCommandHistory().size(), 3);
1059 
1060  {
1061  JointLimits::ConstPtr limits = env->getJointLimits("not_in_graph");
1062  EXPECT_TRUE(limits == nullptr);
1063  }
1064 
1065  { // Note that this will fail artificially if the urdf is changed for some reason
1066  JointLimits::ConstPtr limits = env->getJointLimits("joint_a1");
1067  EXPECT_NEAR(limits->lower, -2.9668, 1e-5);
1068  EXPECT_NEAR(limits->upper, 2.9668, 1e-5);
1069  EXPECT_NEAR(limits->velocity, 1.4834, 1e-5);
1070  EXPECT_NEAR(limits->effort, 0, 1e-5);
1071  }
1072 
1073  {
1074  double new_lower = 1.0;
1075  double new_upper = 2.0;
1076  double new_velocity = 3.0;
1077  double new_acceleration = 4.0;
1078 
1079  int revision = env->getRevision();
1080  auto cmd_jpl = std::make_shared<ChangeJointPositionLimitsCommand>("joint_a1", new_lower, new_upper);
1081  EXPECT_EQ(cmd_jpl->getType(), CommandType::CHANGE_JOINT_POSITION_LIMITS);
1082  EXPECT_EQ(cmd_jpl->getLimits().size(), 1);
1083  auto it_jpl = cmd_jpl->getLimits().find("joint_a1");
1084  EXPECT_TRUE(it_jpl != cmd_jpl->getLimits().end());
1085  EXPECT_EQ(it_jpl->first, "joint_a1");
1086  EXPECT_NEAR(it_jpl->second.first, new_lower, 1e-6);
1087  EXPECT_NEAR(it_jpl->second.second, new_upper, 1e-6);
1088  EXPECT_TRUE(env->applyCommand(cmd_jpl));
1089  EXPECT_EQ(revision + 1, env->getRevision());
1090  EXPECT_EQ(revision + 1, env->getCommandHistory().size());
1091  EXPECT_EQ(env->getCommandHistory().back(), cmd_jpl);
1092 
1093  auto cmd_jvl = std::make_shared<ChangeJointVelocityLimitsCommand>("joint_a1", new_velocity);
1094  EXPECT_EQ(cmd_jvl->getType(), CommandType::CHANGE_JOINT_VELOCITY_LIMITS);
1095  EXPECT_EQ(cmd_jvl->getLimits().size(), 1);
1096  auto it_jvl = cmd_jvl->getLimits().find("joint_a1");
1097  EXPECT_TRUE(it_jvl != cmd_jvl->getLimits().end());
1098  EXPECT_EQ(it_jvl->first, "joint_a1");
1099  EXPECT_NEAR(it_jvl->second, new_velocity, 1e-6);
1100  EXPECT_TRUE(env->applyCommand(cmd_jvl));
1101  EXPECT_EQ(revision + 2, env->getRevision());
1102  EXPECT_EQ(revision + 2, env->getCommandHistory().size());
1103  EXPECT_EQ(env->getCommandHistory().back(), cmd_jvl);
1104 
1105  auto cmd_jal = std::make_shared<ChangeJointAccelerationLimitsCommand>("joint_a1", new_acceleration);
1106  EXPECT_EQ(cmd_jal->getType(), CommandType::CHANGE_JOINT_ACCELERATION_LIMITS);
1107  EXPECT_EQ(cmd_jal->getLimits().size(), 1);
1108  auto it_jal = cmd_jal->getLimits().find("joint_a1");
1109  EXPECT_TRUE(it_jal != cmd_jal->getLimits().end());
1110  EXPECT_EQ(it_jal->first, "joint_a1");
1111  EXPECT_NEAR(it_jal->second, new_acceleration, 1e-6);
1112  EXPECT_TRUE(env->applyCommand(cmd_jal));
1113  EXPECT_EQ(revision + 3, env->getRevision());
1114  EXPECT_EQ(revision + 3, env->getCommandHistory().size());
1115  EXPECT_EQ(env->getCommandHistory().back(), cmd_jal);
1116 
1117  // Check that the environment returns the correct limits
1118  JointLimits new_limits = *(env->getJointLimits("joint_a1"));
1119  EXPECT_NEAR(new_limits.lower, new_lower, 1e-5);
1120  EXPECT_NEAR(new_limits.upper, new_upper, 1e-5);
1121  EXPECT_NEAR(new_limits.velocity, new_velocity, 1e-5);
1122  EXPECT_NEAR(new_limits.acceleration, new_acceleration, 1e-5);
1123  }
1124  { // call map method
1125  double new_lower = 1.0;
1126  double new_upper = 2.0;
1127  double new_velocity = 3.0;
1128  double new_acceleration = 4.0;
1129 
1130  std::unordered_map<std::string, std::pair<double, double> > position_limit_map;
1131  position_limit_map["joint_a1"] = std::make_pair(new_lower, new_upper);
1132 
1133  std::unordered_map<std::string, double> velocity_limit_map;
1134  velocity_limit_map["joint_a1"] = new_velocity;
1135 
1136  std::unordered_map<std::string, double> acceleration_limit_map;
1137  acceleration_limit_map["joint_a1"] = new_acceleration;
1138 
1139  int revision = env->getRevision();
1140  auto cmd_jpl = std::make_shared<ChangeJointPositionLimitsCommand>(position_limit_map);
1141  EXPECT_EQ(cmd_jpl->getType(), CommandType::CHANGE_JOINT_POSITION_LIMITS);
1142  EXPECT_EQ(cmd_jpl->getLimits().size(), 1);
1143  auto it_jpl = cmd_jpl->getLimits().find("joint_a1");
1144  EXPECT_TRUE(it_jpl != cmd_jpl->getLimits().end());
1145  EXPECT_EQ(it_jpl->first, "joint_a1");
1146  EXPECT_NEAR(it_jpl->second.first, new_lower, 1e-6);
1147  EXPECT_NEAR(it_jpl->second.second, new_upper, 1e-6);
1148  EXPECT_TRUE(env->applyCommand(cmd_jpl));
1149  EXPECT_EQ(revision + 1, env->getRevision());
1150  EXPECT_EQ(revision + 1, env->getCommandHistory().size());
1151  EXPECT_EQ(env->getCommandHistory().back(), cmd_jpl);
1152 
1153  auto cmd_jvl = std::make_shared<ChangeJointVelocityLimitsCommand>(velocity_limit_map);
1154  EXPECT_EQ(cmd_jvl->getType(), CommandType::CHANGE_JOINT_VELOCITY_LIMITS);
1155  EXPECT_EQ(cmd_jvl->getLimits().size(), 1);
1156  auto it_jvl = cmd_jvl->getLimits().find("joint_a1");
1157  EXPECT_TRUE(it_jvl != cmd_jvl->getLimits().end());
1158  EXPECT_EQ(it_jvl->first, "joint_a1");
1159  EXPECT_NEAR(it_jvl->second, new_velocity, 1e-6);
1160  EXPECT_TRUE(env->applyCommand(cmd_jvl));
1161  EXPECT_EQ(revision + 2, env->getRevision());
1162  EXPECT_EQ(revision + 2, env->getCommandHistory().size());
1163  EXPECT_EQ(env->getCommandHistory().back(), cmd_jvl);
1164 
1165  auto cmd_jal = std::make_shared<ChangeJointAccelerationLimitsCommand>(acceleration_limit_map);
1166  EXPECT_EQ(cmd_jal->getType(), CommandType::CHANGE_JOINT_ACCELERATION_LIMITS);
1167  EXPECT_EQ(cmd_jal->getLimits().size(), 1);
1168  auto it_jal = cmd_jal->getLimits().find("joint_a1");
1169  EXPECT_TRUE(it_jal != cmd_jal->getLimits().end());
1170  EXPECT_EQ(it_jal->first, "joint_a1");
1171  EXPECT_NEAR(it_jal->second, new_acceleration, 1e-6);
1172  EXPECT_TRUE(env->applyCommand(cmd_jal));
1173  EXPECT_EQ(revision + 3, env->getRevision());
1174  EXPECT_EQ(revision + 3, env->getCommandHistory().size());
1175  EXPECT_EQ(env->getCommandHistory().back(), cmd_jal);
1176 
1177  // Check that the environment returns the correct limits
1178  JointLimits new_limits = *(env->getJointLimits("joint_a1"));
1179  EXPECT_NEAR(new_limits.lower, new_lower, 1e-5);
1180  EXPECT_NEAR(new_limits.upper, new_upper, 1e-5);
1181  EXPECT_NEAR(new_limits.velocity, new_velocity, 1e-5);
1182  EXPECT_NEAR(new_limits.acceleration, new_acceleration, 1e-5);
1183  }
1184 }
1185 
1186 TEST(TesseractEnvironmentUnit, EnvChangeJointOriginCommandUnit) // NOLINT
1187 {
1188  // Get the environment
1189  auto env = getEnvironment();
1190  EXPECT_EQ(env->getRevision(), 3);
1191  EXPECT_EQ(env->getInitRevision(), 3);
1192  EXPECT_EQ(env->getCommandHistory().size(), 3);
1193 
1194  const std::string link_name1 = "link_n1";
1195  const std::string joint_name1 = "joint_n1";
1196  Link link_1(link_name1);
1197 
1198  Joint joint_1(joint_name1);
1199  joint_1.parent_link_name = env->getRootLinkName();
1200  joint_1.child_link_name = link_name1;
1201  joint_1.type = JointType::FIXED;
1202 
1203  EXPECT_TRUE(env->applyCommand(std::make_shared<AddLinkCommand>(link_1, joint_1)));
1204  tesseract_scene_graph::SceneState state = env->getState();
1205  EXPECT_EQ(env->getRevision(), 4);
1206  EXPECT_EQ(env->getInitRevision(), 3);
1207  EXPECT_EQ(env->getCommandHistory().size(), 4);
1208  EXPECT_TRUE(state.link_transforms.find(link_name1) != state.link_transforms.end());
1209  EXPECT_TRUE(state.joint_transforms.find(joint_name1) != state.joint_transforms.end());
1210  EXPECT_TRUE(state.joints.find(joint_name1) == state.joints.end());
1211 
1212  env->getSceneGraph()->saveDOT(tesseract_common::getTempPath() + "before_change_joint_origin_unit.dot");
1213 
1214  Eigen::Isometry3d new_origin = Eigen::Isometry3d::Identity();
1215  new_origin.translation()(0) += 1.234;
1216 
1217  auto cmd = std::make_shared<ChangeJointOriginCommand>(joint_name1, new_origin);
1218  EXPECT_EQ(cmd->getType(), CommandType::CHANGE_JOINT_ORIGIN);
1219  EXPECT_EQ(cmd->getJointName(), joint_name1);
1220  EXPECT_TRUE(new_origin.isApprox(cmd->getOrigin()));
1221  EXPECT_TRUE(env->applyCommand(cmd));
1222  EXPECT_EQ(env->getCommandHistory().back(), cmd);
1223 
1224  EXPECT_EQ(env->getRevision(), 5);
1225  EXPECT_EQ(env->getInitRevision(), 3);
1226  EXPECT_EQ(env->getCommandHistory().size(), 5);
1227 
1228  // Check that the origin got updated
1229  state = env->getState();
1230  EXPECT_TRUE(env->getJoint(joint_name1)->parent_to_joint_origin_transform.isApprox(new_origin));
1231  EXPECT_TRUE(state.link_transforms.at(link_name1).isApprox(new_origin));
1232  EXPECT_TRUE(state.joint_transforms.at(joint_name1).isApprox(new_origin));
1233 
1234  env->getSceneGraph()->saveDOT(tesseract_common::getTempPath() + "after_change_joint_origin_unit.dot");
1235 }
1236 
1237 TEST(TesseractEnvironmentUnit, EnvChangeLinkOriginCommandUnit) // NOLINT
1238 {
1239  // Get the environment
1240  auto env = getEnvironment();
1241  EXPECT_EQ(env->getRevision(), 3);
1242  EXPECT_EQ(env->getInitRevision(), 3);
1243  EXPECT_EQ(env->getCommandHistory().size(), 3);
1244 
1245  std::string link_name = "base_link";
1246  Eigen::Isometry3d new_origin = Eigen::Isometry3d::Identity();
1247  new_origin.translation()(0) += 1.234;
1248 
1249  auto cmd = std::make_shared<ChangeLinkOriginCommand>(link_name, new_origin);
1250  EXPECT_EQ(cmd->getType(), CommandType::CHANGE_LINK_ORIGIN);
1251  EXPECT_EQ(cmd->getLinkName(), link_name);
1252  EXPECT_TRUE(new_origin.isApprox(cmd->getOrigin()));
1253  EXPECT_ANY_THROW(env->applyCommand(cmd)); // NOLINT
1254 }
1255 
1256 TEST(TesseractEnvironmentUnit, EnvChangeLinkCollisionEnabledCommandUnit) // NOLINT
1257 {
1258  // Get the environment
1260  auto env = getEnvironment();
1261  EXPECT_EQ(env->getRevision(), 3);
1262  EXPECT_EQ(env->getInitRevision(), 3);
1263  EXPECT_EQ(env->getCommandHistory().size(), 3);
1264 
1265  std::string link_name = "link_1";
1266  EXPECT_TRUE(env->getSceneGraph()->getLinkCollisionEnabled(link_name));
1267 
1268  { // Disable Link collision
1269  auto cmd = std::make_shared<ChangeLinkCollisionEnabledCommand>(link_name, false);
1270  EXPECT_TRUE(cmd != nullptr);
1271  EXPECT_EQ(cmd->getType(), CommandType::CHANGE_LINK_COLLISION_ENABLED);
1272  EXPECT_EQ(cmd->getEnabled(), false);
1273  EXPECT_EQ(cmd->getLinkName(), link_name);
1274  EXPECT_TRUE(env->applyCommand(cmd));
1275  EXPECT_EQ(env->getCommandHistory().back(), cmd);
1276  }
1277 
1278  EXPECT_EQ(env->getRevision(), 4);
1279  EXPECT_EQ(env->getInitRevision(), 3);
1280  EXPECT_EQ(env->getCommandHistory().size(), 4);
1281  EXPECT_FALSE(env->getSceneGraph()->getLinkCollisionEnabled(link_name));
1282 
1283  { // Enable Link collision
1284  auto cmd = std::make_shared<ChangeLinkCollisionEnabledCommand>(link_name, true);
1285  EXPECT_TRUE(cmd != nullptr);
1286  EXPECT_EQ(cmd->getType(), CommandType::CHANGE_LINK_COLLISION_ENABLED);
1287  EXPECT_EQ(cmd->getEnabled(), true);
1288  EXPECT_EQ(cmd->getLinkName(), link_name);
1289  EXPECT_TRUE(env->applyCommand(cmd));
1290  EXPECT_EQ(env->getCommandHistory().back(), cmd);
1291  }
1292 
1293  EXPECT_EQ(env->getRevision(), 5);
1294  EXPECT_EQ(env->getInitRevision(), 3);
1295  EXPECT_EQ(env->getCommandHistory().size(), 5);
1296  EXPECT_TRUE(env->getSceneGraph()->getLinkCollisionEnabled(link_name));
1297 }
1298 
1299 TEST(TesseractEnvironmentUnit, EnvChangeLinkVisibilityCommandUnit) // NOLINT
1300 {
1301  // Get the environment
1303  auto env = getEnvironment();
1304  EXPECT_EQ(env->getRevision(), 3);
1305  EXPECT_EQ(env->getInitRevision(), 3);
1306  EXPECT_EQ(env->getCommandHistory().size(), 3);
1307 
1308  std::string link_name = "link_1";
1309  EXPECT_TRUE(env->getSceneGraph()->getLinkVisibility(link_name));
1310 
1311  auto cmd = std::make_shared<ChangeLinkVisibilityCommand>(link_name, false);
1312  EXPECT_TRUE(cmd != nullptr);
1313  EXPECT_EQ(cmd->getType(), CommandType::CHANGE_LINK_VISIBILITY);
1314  EXPECT_EQ(cmd->getEnabled(), false);
1315  EXPECT_EQ(cmd->getLinkName(), link_name);
1316  EXPECT_TRUE(env->applyCommand(cmd));
1317  EXPECT_EQ(env->getCommandHistory().back(), cmd);
1318 
1319  EXPECT_EQ(env->getRevision(), 4);
1320  EXPECT_EQ(env->getInitRevision(), 3);
1321  EXPECT_EQ(env->getCommandHistory().size(), 4);
1322  EXPECT_FALSE(env->getSceneGraph()->getLinkVisibility(link_name));
1323 }
1324 
1325 TEST(TesseractEnvironmentUnit, EnvSetActiveContinuousContactManagerCommandUnit) // NOLINT
1326 {
1327  // Get the environment
1329  auto env = getEnvironment();
1330  EXPECT_EQ(env->getRevision(), 3);
1331  EXPECT_EQ(env->getInitRevision(), 3);
1332  EXPECT_EQ(env->getCommandHistory().size(), 3);
1333 
1334  auto cmd = std::make_shared<SetActiveContinuousContactManagerCommand>("BulletCastSimpleManager");
1335  EXPECT_TRUE(cmd != nullptr);
1336  EXPECT_EQ(cmd->getType(), CommandType::SET_ACTIVE_CONTINUOUS_CONTACT_MANAGER);
1337  EXPECT_EQ(cmd->getName(), "BulletCastSimpleManager");
1338  EXPECT_TRUE(env->applyCommand(cmd));
1339  EXPECT_EQ(env->getCommandHistory().back(), cmd);
1340 
1341  EXPECT_EQ(env->getRevision(), 4);
1342  EXPECT_EQ(env->getInitRevision(), 3);
1343  EXPECT_EQ(env->getCommandHistory().size(), 4);
1344  EXPECT_EQ(env->getContinuousContactManager()->getName(), "BulletCastSimpleManager");
1345 }
1346 
1347 TEST(TesseractEnvironmentUnit, EnvSetActiveDiscreteContactManagerCommandUnit) // NOLINT
1348 {
1349  // Get the environment
1351  auto env = getEnvironment();
1352  EXPECT_EQ(env->getRevision(), 3);
1353  EXPECT_EQ(env->getInitRevision(), 3);
1354  EXPECT_EQ(env->getCommandHistory().size(), 3);
1355 
1356  auto cmd = std::make_shared<SetActiveDiscreteContactManagerCommand>("BulletDiscreteSimpleManager");
1357  EXPECT_TRUE(cmd != nullptr);
1358  EXPECT_EQ(cmd->getType(), CommandType::SET_ACTIVE_DISCRETE_CONTACT_MANAGER);
1359  EXPECT_EQ(cmd->getName(), "BulletDiscreteSimpleManager");
1360  EXPECT_TRUE(env->applyCommand(cmd));
1361  EXPECT_EQ(env->getCommandHistory().back(), cmd);
1362 
1363  EXPECT_EQ(env->getRevision(), 4);
1364  EXPECT_EQ(env->getInitRevision(), 3);
1365  EXPECT_EQ(env->getCommandHistory().size(), 4);
1366  EXPECT_EQ(env->getDiscreteContactManager()->getName(), "BulletDiscreteSimpleManager");
1367 }
1368 
1369 TEST(TesseractEnvironmentUnit, EnvChangeCollisionMarginsCommandUnit) // NOLINT
1370 {
1371  { // MODIFY_PAIR_MARGIN and OVERRIDE_PAIR_MARGIN Unit Test
1372  std::string link_name1 = "link_1";
1373  std::string link_name2 = "link_2";
1374  double margin = 0.1;
1375 
1376  auto env = getEnvironment();
1377  EXPECT_EQ(env->getRevision(), 3);
1378  EXPECT_EQ(env->getInitRevision(), 3);
1379  EXPECT_EQ(env->getCommandHistory().size(), 3);
1380  EXPECT_NEAR(env->getDiscreteContactManager()->getCollisionMarginData().getCollisionMargin(link_name1, link_name2),
1381  0.0,
1382  1e-6);
1383  EXPECT_NEAR(env->getContinuousContactManager()->getCollisionMarginData().getCollisionMargin(link_name1, link_name2),
1384  0.0,
1385  1e-6);
1386 
1387  // Test MODIFY_PAIR_MARGIN
1389  pair_margin_data.setCollisionMargin(link_name1, link_name2, margin);
1392 
1393  auto cmd = std::make_shared<ChangeCollisionMarginsCommand>(pair_margin_data, overrid_type);
1394  EXPECT_TRUE(cmd != nullptr);
1395  EXPECT_EQ(cmd->getType(), CommandType::CHANGE_COLLISION_MARGINS);
1396  EXPECT_FALSE(cmd->getDefaultCollisionMargin().has_value());
1397  EXPECT_EQ(cmd->getCollisionMarginPairData(), pair_margin_data);
1398  EXPECT_EQ(cmd->getCollisionMarginPairOverrideType(), tesseract_common::CollisionMarginPairOverrideType::MODIFY);
1399  EXPECT_TRUE(env->applyCommand(cmd));
1400 
1401  EXPECT_EQ(env->getRevision(), 4);
1402  EXPECT_EQ(env->getInitRevision(), 3);
1403  EXPECT_EQ(env->getCommandHistory().size(), 4);
1404  EXPECT_EQ(env->getCommandHistory().back(), cmd);
1405  EXPECT_NEAR(env->getDiscreteContactManager()->getCollisionMarginData().getCollisionMargin(link_name1, link_name2),
1406  margin,
1407  1e-6);
1408  EXPECT_NEAR(env->getContinuousContactManager()->getCollisionMarginData().getCollisionMargin(link_name1, link_name2),
1409  margin,
1410  1e-6);
1411 
1412  // Test
1413  std::string link_name3 = "link_3";
1414  std::string link_name4 = "link_4";
1415  margin = 0.2;
1416  pair_margin_data = tesseract_common::CollisionMarginPairData();
1417  pair_margin_data.setCollisionMargin(link_name3, link_name4, margin);
1419 
1420  cmd = std::make_shared<ChangeCollisionMarginsCommand>(pair_margin_data, overrid_type);
1421  EXPECT_TRUE(cmd != nullptr);
1422  EXPECT_EQ(cmd->getType(), CommandType::CHANGE_COLLISION_MARGINS);
1423  EXPECT_FALSE(cmd->getDefaultCollisionMargin().has_value());
1424  EXPECT_EQ(cmd->getCollisionMarginPairData(), pair_margin_data);
1425  EXPECT_EQ(cmd->getCollisionMarginPairOverrideType(), tesseract_common::CollisionMarginPairOverrideType::REPLACE);
1426  EXPECT_TRUE(env->applyCommand(cmd));
1427 
1428  EXPECT_EQ(env->getRevision(), 5);
1429  EXPECT_EQ(env->getInitRevision(), 3);
1430  EXPECT_EQ(env->getCommandHistory().size(), 5);
1431  EXPECT_EQ(env->getCommandHistory().back(), cmd);
1432  // Link1 and Link2 should be reset
1433  EXPECT_NEAR(
1434  env->getDiscreteContactManager()->getCollisionMarginData().getCollisionMargin(link_name1, link_name2), 0, 1e-6);
1435  EXPECT_NEAR(env->getContinuousContactManager()->getCollisionMarginData().getCollisionMargin(link_name1, link_name2),
1436  0,
1437  1e-6);
1438  EXPECT_NEAR(env->getDiscreteContactManager()->getCollisionMarginData().getCollisionMargin(link_name3, link_name4),
1439  margin,
1440  1e-6);
1441  EXPECT_NEAR(env->getContinuousContactManager()->getCollisionMarginData().getCollisionMargin(link_name3, link_name4),
1442  margin,
1443  1e-6);
1444  }
1445 
1446  { // OVERRIDE_DEFAULT_MARGIN Unit Test
1447  auto env = getEnvironment();
1448  EXPECT_EQ(env->getRevision(), 3);
1449  EXPECT_EQ(env->getInitRevision(), 3);
1450  EXPECT_EQ(env->getCommandHistory().size(), 3);
1451  EXPECT_NEAR(env->getDiscreteContactManager()->getCollisionMarginData().getDefaultCollisionMargin(), 0.0, 1e-6);
1452  EXPECT_NEAR(env->getContinuousContactManager()->getCollisionMarginData().getDefaultCollisionMargin(), 0.0, 1e-6);
1453 
1454  const double defaut_margin{ 0.1 };
1455  auto cmd = std::make_shared<ChangeCollisionMarginsCommand>(defaut_margin);
1456  EXPECT_TRUE(cmd != nullptr);
1457  EXPECT_EQ(cmd->getType(), CommandType::CHANGE_COLLISION_MARGINS);
1458  EXPECT_TRUE(cmd->getDefaultCollisionMargin().has_value());
1459  EXPECT_NEAR(cmd->getDefaultCollisionMargin().value(), defaut_margin, 0.0001); // NOLINT
1460  EXPECT_TRUE(cmd->getCollisionMarginPairData().empty());
1461  EXPECT_EQ(cmd->getCollisionMarginPairOverrideType(), tesseract_common::CollisionMarginPairOverrideType::NONE);
1462  EXPECT_TRUE(env->applyCommand(cmd));
1463 
1464  EXPECT_EQ(env->getRevision(), 4);
1465  EXPECT_EQ(env->getInitRevision(), 3);
1466  EXPECT_EQ(env->getCommandHistory().size(), 4);
1467  EXPECT_EQ(env->getCommandHistory().back(), cmd);
1468  EXPECT_NEAR(env->getDiscreteContactManager()->getCollisionMarginData().getDefaultCollisionMargin(), 0.1, 1e-6);
1469  EXPECT_NEAR(env->getContinuousContactManager()->getCollisionMarginData().getDefaultCollisionMargin(), 0.1, 1e-6);
1470  }
1471 
1472  { // MODIFY_PAIR_MARGIN and OVERRIDE_PAIR_MARGIN Constructor Unit Test
1473  std::string link_name1 = "link_1";
1474  std::string link_name2 = "link_2";
1475  double margin = 0.1;
1476 
1477  auto env = getEnvironment();
1478  EXPECT_EQ(env->getRevision(), 3);
1479  EXPECT_EQ(env->getInitRevision(), 3);
1480  EXPECT_EQ(env->getCommandHistory().size(), 3);
1481  EXPECT_NEAR(env->getDiscreteContactManager()->getCollisionMarginData().getCollisionMargin(link_name1, link_name2),
1482  0.0,
1483  1e-6);
1484  EXPECT_NEAR(env->getContinuousContactManager()->getCollisionMarginData().getCollisionMargin(link_name1, link_name2),
1485  0.0,
1486  1e-6);
1487 
1488  // Test MODIFY_PAIR_MARGIN constructor
1490  pcmd.setCollisionMargin(link_name1, link_name2, margin);
1492 
1493  auto cmd = std::make_shared<ChangeCollisionMarginsCommand>(pcmd, overrid_type);
1494  EXPECT_TRUE(cmd != nullptr);
1495  EXPECT_EQ(cmd->getType(), CommandType::CHANGE_COLLISION_MARGINS);
1496  EXPECT_FALSE(cmd->getDefaultCollisionMargin().has_value());
1497  EXPECT_EQ(cmd->getCollisionMarginPairData(), pcmd);
1498  EXPECT_EQ(cmd->getCollisionMarginPairOverrideType(), overrid_type);
1499  EXPECT_TRUE(env->applyCommand(cmd));
1500 
1501  EXPECT_EQ(env->getRevision(), 4);
1502  EXPECT_EQ(env->getInitRevision(), 3);
1503  EXPECT_EQ(env->getCommandHistory().size(), 4);
1504  EXPECT_EQ(env->getCommandHistory().back(), cmd);
1505  EXPECT_NEAR(env->getDiscreteContactManager()->getCollisionMarginData().getCollisionMargin(link_name1, link_name2),
1506  margin,
1507  1e-6);
1508  EXPECT_NEAR(env->getContinuousContactManager()->getCollisionMarginData().getCollisionMargin(link_name1, link_name2),
1509  margin,
1510  1e-6);
1511 
1512  // Test
1513  std::string link_name3 = "link_3";
1514  std::string link_name4 = "link_4";
1515  margin = 0.2;
1516  pcmd.clear();
1517  pcmd.setCollisionMargin(link_name3, link_name4, margin);
1519 
1520  cmd = std::make_shared<ChangeCollisionMarginsCommand>(pcmd, overrid_type);
1521  EXPECT_TRUE(cmd != nullptr);
1522  EXPECT_EQ(cmd->getType(), CommandType::CHANGE_COLLISION_MARGINS);
1523  EXPECT_FALSE(cmd->getDefaultCollisionMargin().has_value());
1524  EXPECT_EQ(cmd->getCollisionMarginPairData(), pcmd);
1525  EXPECT_EQ(cmd->getCollisionMarginPairOverrideType(), overrid_type);
1526  EXPECT_TRUE(env->applyCommand(cmd));
1527 
1528  EXPECT_EQ(env->getRevision(), 5);
1529  EXPECT_EQ(env->getInitRevision(), 3);
1530  EXPECT_EQ(env->getCommandHistory().size(), 5);
1531  EXPECT_EQ(env->getCommandHistory().back(), cmd);
1532  // Link1 and Link2 should be reset
1533  EXPECT_NEAR(
1534  env->getDiscreteContactManager()->getCollisionMarginData().getCollisionMargin(link_name1, link_name2), 0, 1e-6);
1535  EXPECT_NEAR(env->getContinuousContactManager()->getCollisionMarginData().getCollisionMargin(link_name1, link_name2),
1536  0,
1537  1e-6);
1538  EXPECT_NEAR(env->getDiscreteContactManager()->getCollisionMarginData().getCollisionMargin(link_name3, link_name4),
1539  margin,
1540  1e-6);
1541  EXPECT_NEAR(env->getContinuousContactManager()->getCollisionMarginData().getCollisionMargin(link_name3, link_name4),
1542  margin,
1543  1e-6);
1544  }
1545 
1546  { // OVERRIDE_DEFAULT_MARGIN Constructor Unit Test
1547  auto env = getEnvironment();
1548  EXPECT_EQ(env->getRevision(), 3);
1549  EXPECT_EQ(env->getInitRevision(), 3);
1550  EXPECT_EQ(env->getCommandHistory().size(), 3);
1551  EXPECT_NEAR(env->getDiscreteContactManager()->getCollisionMarginData().getDefaultCollisionMargin(), 0.0, 1e-6);
1552  EXPECT_NEAR(env->getContinuousContactManager()->getCollisionMarginData().getDefaultCollisionMargin(), 0.0, 1e-6);
1553 
1554  auto cmd = std::make_shared<ChangeCollisionMarginsCommand>(0.1);
1555  EXPECT_TRUE(cmd != nullptr);
1556  EXPECT_EQ(cmd->getType(), CommandType::CHANGE_COLLISION_MARGINS);
1557  EXPECT_NEAR(cmd->getDefaultCollisionMargin().value(), 0.1, 0.00001); // NOLINT
1558  EXPECT_TRUE(cmd->getCollisionMarginPairData().empty());
1559  EXPECT_EQ(cmd->getCollisionMarginPairOverrideType(), tesseract_common::CollisionMarginPairOverrideType::NONE);
1560  EXPECT_TRUE(env->applyCommand(cmd));
1561 
1562  EXPECT_EQ(env->getRevision(), 4);
1563  EXPECT_EQ(env->getInitRevision(), 3);
1564  EXPECT_EQ(env->getCommandHistory().size(), 4);
1565  EXPECT_EQ(env->getCommandHistory().back(), cmd);
1566  EXPECT_NEAR(env->getDiscreteContactManager()->getCollisionMarginData().getDefaultCollisionMargin(), 0.1, 1e-6);
1567  EXPECT_NEAR(env->getContinuousContactManager()->getCollisionMarginData().getDefaultCollisionMargin(), 0.1, 1e-6);
1568  }
1569 }
1570 
1571 TEST(TesseractEnvironmentUnit, EnvMoveJointCommandUnit) // NOLINT
1572 {
1573  // Get the environment
1574  auto env = getEnvironment();
1575  EXPECT_EQ(env->getRevision(), 3);
1576  EXPECT_EQ(env->getInitRevision(), 3);
1577  EXPECT_EQ(env->getCommandHistory().size(), 3);
1578 
1579  const std::string link_name1 = "link_n1";
1580  const std::string link_name2 = "link_n2";
1581  const std::string joint_name1 = "joint_n1";
1582  const std::string joint_name2 = "joint_n2";
1583  Link link_1(link_name1);
1584  Link link_2(link_name2);
1585 
1586  Joint joint_1(joint_name1);
1587  joint_1.parent_link_name = env->getRootLinkName();
1588  joint_1.child_link_name = link_name1;
1589  joint_1.type = JointType::FIXED;
1590 
1591  Joint joint_2(joint_name2);
1592  joint_2.parent_to_joint_origin_transform.translation()(0) = 1.25;
1593  joint_2.parent_link_name = link_name1;
1594  joint_2.child_link_name = link_name2;
1595  joint_2.type = JointType::FIXED;
1596 
1597  env->applyCommand(std::make_shared<AddLinkCommand>(link_1, joint_1));
1598  tesseract_scene_graph::SceneState state = env->getState();
1599  EXPECT_EQ(env->getRevision(), 4);
1600  EXPECT_EQ(env->getInitRevision(), 3);
1601  EXPECT_EQ(env->getCommandHistory().size(), 4);
1602 
1603  EXPECT_TRUE(state.link_transforms.find(link_name1) != state.link_transforms.end());
1604  EXPECT_TRUE(state.joint_transforms.find(joint_name1) != state.joint_transforms.end());
1605  EXPECT_TRUE(state.joints.find(joint_name1) == state.joints.end());
1606 
1607  env->applyCommand(std::make_shared<AddLinkCommand>(link_2, joint_2));
1608  EXPECT_EQ(env->getRevision(), 5);
1609  EXPECT_EQ(env->getInitRevision(), 3);
1610  EXPECT_EQ(env->getCommandHistory().size(), 5);
1611 
1612  std::vector<std::string> link_names = env->getLinkNames();
1613  std::vector<std::string> joint_names = env->getJointNames();
1614  state = env->getState();
1615  EXPECT_TRUE(std::find(link_names.begin(), link_names.end(), link_name1) != link_names.end());
1616  EXPECT_TRUE(std::find(link_names.begin(), link_names.end(), link_name2) != link_names.end());
1617  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), joint_name1) != joint_names.end());
1618  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), joint_name2) != joint_names.end());
1619  EXPECT_TRUE(state.link_transforms.find(link_name1) != state.link_transforms.end());
1620  EXPECT_TRUE(state.joint_transforms.find(joint_name1) != state.joint_transforms.end());
1621  EXPECT_TRUE(state.joints.find(joint_name1) == state.joints.end());
1622  EXPECT_TRUE(state.link_transforms.find(link_name2) != state.link_transforms.end());
1623  EXPECT_TRUE(state.joint_transforms.find(joint_name2) != state.joint_transforms.end());
1624  EXPECT_TRUE(state.joints.find(joint_name2) == state.joints.end());
1625 
1626  env->getSceneGraph()->saveDOT(tesseract_common::getTempPath() + "before_move_joint_unit.dot");
1627 
1628  auto cmd = std::make_shared<MoveJointCommand>(joint_name1, "tool0");
1629  EXPECT_TRUE(cmd != nullptr);
1630  EXPECT_EQ(cmd->getType(), CommandType::MOVE_JOINT);
1631  EXPECT_EQ(cmd->getJointName(), joint_name1);
1632  EXPECT_EQ(cmd->getParentLink(), "tool0");
1633  EXPECT_TRUE(env->applyCommand(cmd));
1634  EXPECT_EQ(env->getCommandHistory().back(), cmd);
1635 
1636  link_names = env->getLinkNames();
1637  joint_names = env->getJointNames();
1638  state = env->getState();
1639  EXPECT_TRUE(env->getJoint(joint_name1)->parent_link_name == "tool0");
1640  EXPECT_TRUE(std::find(link_names.begin(), link_names.end(), link_name1) != link_names.end());
1641  EXPECT_TRUE(std::find(link_names.begin(), link_names.end(), link_name2) != link_names.end());
1642  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), joint_name1) != joint_names.end());
1643  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), joint_name2) != joint_names.end());
1644  EXPECT_TRUE(state.link_transforms.find(link_name1) != state.link_transforms.end());
1645  EXPECT_TRUE(state.joint_transforms.find(joint_name1) != state.joint_transforms.end());
1646  EXPECT_TRUE(state.joints.find(joint_name1) == state.joints.end());
1647  EXPECT_TRUE(state.link_transforms.find(link_name2) != state.link_transforms.end());
1648  EXPECT_TRUE(state.joint_transforms.find(joint_name2) != state.joint_transforms.end());
1649  EXPECT_TRUE(state.joints.find(joint_name2) == state.joints.end());
1650 
1651  env->getSceneGraph()->saveDOT(tesseract_common::getTempPath() + "after_move_joint_unit.dot");
1652 }
1653 
1654 TEST(TesseractEnvironmentUnit, EnvMoveLinkCommandUnit) // NOLINT
1655 {
1656  // Get the environment
1657  auto env = getEnvironment();
1658  EXPECT_EQ(env->getRevision(), 3);
1659  EXPECT_EQ(env->getInitRevision(), 3);
1660  EXPECT_EQ(env->getCommandHistory().size(), 3);
1661 
1662  const std::string link_name1 = "link_n1";
1663  const std::string link_name2 = "link_n2";
1664  const std::string joint_name1 = "joint_n1";
1665  const std::string joint_name2 = "joint_n2";
1666  Link link_1(link_name1);
1667  Link link_2(link_name2);
1668 
1669  Joint joint_1(joint_name1);
1670  joint_1.parent_link_name = env->getRootLinkName();
1671  joint_1.child_link_name = link_name1;
1672  joint_1.type = JointType::FIXED;
1673 
1674  Joint joint_2(joint_name2);
1675  joint_2.parent_to_joint_origin_transform.translation()(0) = 1.25;
1676  joint_2.parent_link_name = link_name1;
1677  joint_2.child_link_name = link_name2;
1678  joint_2.type = JointType::FIXED;
1679 
1680  env->applyCommand(std::make_shared<AddLinkCommand>(link_1, joint_1));
1681  tesseract_scene_graph::SceneState state = env->getState();
1682  EXPECT_EQ(env->getRevision(), 4);
1683  EXPECT_EQ(env->getInitRevision(), 3);
1684  EXPECT_EQ(env->getCommandHistory().size(), 4);
1685 
1686  EXPECT_TRUE(state.link_transforms.find(link_name1) != state.link_transforms.end());
1687  EXPECT_TRUE(state.joint_transforms.find(joint_name1) != state.joint_transforms.end());
1688  EXPECT_TRUE(state.joints.find(joint_name1) == state.joints.end());
1689 
1690  env->applyCommand(std::make_shared<AddLinkCommand>(link_2, joint_2));
1691  EXPECT_EQ(env->getRevision(), 5);
1692  EXPECT_EQ(env->getInitRevision(), 3);
1693  EXPECT_EQ(env->getCommandHistory().size(), 5);
1694 
1695  std::vector<std::string> link_names = env->getLinkNames();
1696  std::vector<std::string> joint_names = env->getJointNames();
1697  state = env->getState();
1698  EXPECT_TRUE(std::find(link_names.begin(), link_names.end(), link_name1) != link_names.end());
1699  EXPECT_TRUE(std::find(link_names.begin(), link_names.end(), link_name2) != link_names.end());
1700  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), joint_name1) != joint_names.end());
1701  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), joint_name2) != joint_names.end());
1702  EXPECT_TRUE(state.link_transforms.find(link_name1) != state.link_transforms.end());
1703  EXPECT_TRUE(state.joint_transforms.find(joint_name1) != state.joint_transforms.end());
1704  EXPECT_TRUE(state.joints.find(joint_name1) == state.joints.end());
1705  EXPECT_TRUE(state.link_transforms.find(link_name2) != state.link_transforms.end());
1706  EXPECT_TRUE(state.joint_transforms.find(joint_name2) != state.joint_transforms.end());
1707  EXPECT_TRUE(state.joints.find(joint_name2) == state.joints.end());
1708 
1709  env->getSceneGraph()->saveDOT(tesseract_common::getTempPath() + "before_move_link_unit.dot");
1710 
1711  std::string moved_joint_name = joint_name1 + "_moved";
1712  Joint move_link_joint = joint_1.clone(moved_joint_name);
1713  move_link_joint.parent_link_name = "tool0";
1714 
1715  auto cmd = std::make_shared<MoveLinkCommand>(move_link_joint);
1716  EXPECT_TRUE(cmd != nullptr);
1717  EXPECT_EQ(cmd->getType(), CommandType::MOVE_LINK);
1718  EXPECT_TRUE(cmd->getJoint() != nullptr);
1719  EXPECT_TRUE(env->applyCommand(cmd));
1720  EXPECT_EQ(env->getCommandHistory().back(), cmd);
1721 
1722  link_names = env->getLinkNames();
1723  joint_names = env->getJointNames();
1724  state = env->getState();
1725  EXPECT_TRUE(env->getJoint(moved_joint_name)->parent_link_name == "tool0");
1726  EXPECT_TRUE(std::find(link_names.begin(), link_names.end(), link_name1) != link_names.end());
1727  EXPECT_TRUE(std::find(link_names.begin(), link_names.end(), link_name2) != link_names.end());
1728  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), joint_name1) == joint_names.end());
1729  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), moved_joint_name) != joint_names.end());
1730  EXPECT_TRUE(std::find(joint_names.begin(), joint_names.end(), joint_name2) != joint_names.end());
1731 
1732  EXPECT_TRUE(state.link_transforms.find(link_name1) != state.link_transforms.end());
1733  EXPECT_TRUE(state.joint_transforms.find(joint_name1) == state.joint_transforms.end());
1734  EXPECT_TRUE(state.joint_transforms.find(moved_joint_name) != state.joint_transforms.end());
1735  EXPECT_TRUE(state.joints.find(joint_name1) == state.joints.end());
1736  EXPECT_TRUE(state.link_transforms.find(link_name2) != state.link_transforms.end());
1737  EXPECT_TRUE(state.joint_transforms.find(joint_name2) != state.joint_transforms.end());
1738  EXPECT_TRUE(state.joints.find(joint_name2) == state.joints.end());
1739 
1740  env->getSceneGraph()->saveDOT(tesseract_common::getTempPath() + "after_move_link_unit.dot");
1741 }
1742 
1743 TEST(TesseractEnvironmentUnit, EnvCurrentStatePreservedWhenEnvChanges) // NOLINT
1744 {
1745  // Get the environment
1746  auto env = getEnvironment();
1747  auto timestamp1 = env->getTimestamp();
1748 
1749  int callback_counter{ 0 };
1750  EventCallbackFn callback = [&callback_counter](const Event& /*event*/) { ++callback_counter; };
1751 
1752  env->addEventCallback(0, callback);
1753  EXPECT_FALSE(env->getEventCallbacks().empty());
1754  env->removeEventCallback(0);
1755  EXPECT_TRUE(env->getEventCallbacks().empty());
1756 
1757  env->addEventCallback(0, callback);
1758  EXPECT_FALSE(env->getEventCallbacks().empty());
1759  env->clearEventCallbacks();
1760  EXPECT_TRUE(env->getEventCallbacks().empty());
1761 
1762  env->addEventCallback(0, callback);
1763  EXPECT_FALSE(env->getEventCallbacks().empty());
1764  EXPECT_EQ(callback_counter, 0);
1765 
1766  // Check if visibility and collision enabled
1767  for (const auto& link_name : env->getLinkNames())
1768  {
1769  EXPECT_TRUE(env->getLinkCollisionEnabled(link_name));
1770  EXPECT_TRUE(env->getLinkVisibility(link_name));
1771  }
1772 
1773  // Get current timestamp
1774  auto current_state_timestamp1 = env->getCurrentStateTimestamp();
1775 
1776  // Set the initial state of the robot
1777  std::unordered_map<std::string, double> joint_states;
1778  joint_states["joint_a1"] = 0.0;
1779  joint_states["joint_a2"] = 0.0;
1780  joint_states["joint_a3"] = 0.0;
1781  joint_states["joint_a4"] = -1.57;
1782  joint_states["joint_a5"] = 0.0;
1783  joint_states["joint_a6"] = 0.0;
1784  joint_states["joint_a7"] = 0.0;
1785  env->setState(joint_states);
1786  EXPECT_EQ(callback_counter, 1);
1787 
1788  // Get new timestamp
1789  auto current_state_timestamp2 = env->getCurrentStateTimestamp();
1790  auto timestamp2 = env->getTimestamp();
1791 
1792  EXPECT_TRUE(current_state_timestamp2 > current_state_timestamp1);
1793  EXPECT_TRUE(timestamp2 > timestamp1);
1794 
1795  SceneState state = env->getState();
1796  for (auto& joint_state : joint_states)
1797  {
1798  EXPECT_NEAR(state.joints.at(joint_state.first), joint_state.second, 1e-5);
1799  }
1800 
1801  Link link("link_n1");
1802 
1803  Joint joint("joint_n1");
1804  joint.parent_link_name = env->getRootLinkName();
1805  joint.child_link_name = "link_n1";
1806  joint.type = JointType::FIXED;
1807 
1808  env->applyCommand(std::make_shared<AddLinkCommand>(link, joint));
1809 
1810  // Get new timestamp
1811  auto current_state_timestamp3 = env->getCurrentStateTimestamp();
1812  auto timestamp3 = env->getTimestamp();
1813 
1814  EXPECT_TRUE(current_state_timestamp3 > current_state_timestamp2);
1815  EXPECT_TRUE(timestamp3 > timestamp2);
1816 
1817  state = env->getState();
1818  for (auto& joint_state : joint_states)
1819  {
1820  EXPECT_NEAR(state.joints.at(joint_state.first), joint_state.second, 1e-5);
1821  }
1822 
1823  // Check if visibility and collision enabled
1824  for (const auto& link_name : env->getLinkNames())
1825  {
1826  EXPECT_TRUE(env->getLinkCollisionEnabled(link_name));
1827  EXPECT_TRUE(env->getLinkVisibility(link_name));
1828  }
1829 }
1830 
1831 TEST(TesseractEnvironmentUnit, EnvResetUnit) // NOLINT
1832 {
1833  // Get the environment
1834  auto env = getEnvironment();
1835 
1836  // Check if visibility and collision enabled
1837  for (const auto& link_name : env->getLinkNames())
1838  {
1839  EXPECT_TRUE(env->getLinkCollisionEnabled(link_name));
1840  EXPECT_TRUE(env->getLinkVisibility(link_name));
1841  }
1842 
1843  EXPECT_EQ(env->getRevision(), env->getInitRevision());
1844  int init_rev = env->getInitRevision();
1845 
1846  Link link("link_n1");
1847  Joint joint("joint_n1");
1848  joint.parent_link_name = env->getRootLinkName();
1849  joint.child_link_name = "link_n1";
1850  joint.type = JointType::FIXED;
1851 
1852  env->applyCommand(std::make_shared<AddLinkCommand>(link, joint));
1853  EXPECT_EQ(env->getRevision(), init_rev + 1);
1854  EXPECT_EQ(env->getInitRevision(), init_rev);
1855  EXPECT_EQ(env->getCommandHistory().size(), init_rev + 1);
1856 
1857  Commands commands = env->getCommandHistory();
1858 
1859  // Check reset
1860  EXPECT_TRUE(env->reset());
1861  EXPECT_EQ(env->getRevision(), init_rev);
1862  EXPECT_EQ(env->getInitRevision(), init_rev);
1863  EXPECT_EQ(env->getCommandHistory().size(), init_rev);
1864  EXPECT_TRUE(env->isInitialized());
1865 
1866  // Check if visibility and collision enabled
1867  for (const auto& link_name : env->getLinkNames())
1868  {
1869  EXPECT_TRUE(env->getLinkCollisionEnabled(link_name));
1870  EXPECT_TRUE(env->getLinkVisibility(link_name));
1871  }
1872 
1873  // Check reinit
1874  EXPECT_TRUE(env->init(commands));
1875  EXPECT_EQ(env->getRevision(), init_rev + 1);
1876  EXPECT_EQ(env->getInitRevision(), init_rev + 1);
1877  EXPECT_EQ(env->getCommandHistory().size(), init_rev + 1);
1878  EXPECT_TRUE(env->isInitialized());
1879 
1880  // Check if visibility and collision enabled
1881  for (const auto& link_name : env->getLinkNames())
1882  {
1883  EXPECT_TRUE(env->getLinkCollisionEnabled(link_name));
1884  EXPECT_TRUE(env->getLinkVisibility(link_name));
1885  }
1886 }
1887 
1888 TEST(TesseractEnvironmentUnit, EnvChangeNameUnit) // NOLINT
1889 {
1890  // Get the environment
1891  auto env = getEnvironment();
1892  EXPECT_EQ(env->getName(), "kuka_lbr_iiwa_14_r820");
1893 
1894  std::string env_changed_name = "env_unit_change_name";
1895  env->setName(env_changed_name);
1896  EXPECT_EQ(env->getName(), env_changed_name);
1897  EXPECT_EQ(env->getSceneGraph()->getName(), env_changed_name);
1898 }
1899 
1900 void runCompareSceneStates(const SceneState& base_state, const SceneState& compare_state)
1901 {
1902  EXPECT_EQ(base_state.joints.size(), compare_state.joints.size());
1903  EXPECT_EQ(base_state.joint_transforms.size(), compare_state.joint_transforms.size());
1904  EXPECT_EQ(base_state.link_transforms.size(), compare_state.link_transforms.size());
1905 
1906  for (const auto& pair : base_state.joints)
1907  {
1908  EXPECT_NEAR(pair.second, compare_state.joints.at(pair.first), 1e-6);
1909  }
1910 
1911  for (const auto& pair : base_state.joint_transforms)
1912  {
1913  EXPECT_TRUE(pair.second.isApprox(compare_state.joint_transforms.at(pair.first), 1e-6));
1914  }
1915 
1916  for (const auto& link_pair : base_state.link_transforms)
1917  {
1918  EXPECT_TRUE(link_pair.second.isApprox(compare_state.link_transforms.at(link_pair.first), 1e-6));
1919  }
1920 }
1921 
1922 void runCompareStateSolver(const StateSolver& base_solver, StateSolver& comp_solver)
1923 {
1924  EXPECT_EQ(base_solver.getBaseLinkName(), comp_solver.getBaseLinkName());
1925  EXPECT_TRUE(tesseract_common::isIdentical(base_solver.getJointNames(), comp_solver.getJointNames(), false));
1926  EXPECT_TRUE(
1927  tesseract_common::isIdentical(base_solver.getActiveJointNames(), comp_solver.getActiveJointNames(), false));
1928  EXPECT_TRUE(tesseract_common::isIdentical(base_solver.getLinkNames(), comp_solver.getLinkNames(), false));
1931 
1932  for (int i = 0; i < 10; ++i)
1933  {
1934  SceneState base_random_state = base_solver.getRandomState();
1935  SceneState comp_state_const = comp_solver.getState(base_random_state.joints);
1936  comp_solver.setState(base_random_state.joints);
1937  const SceneState& comp_state = comp_solver.getState();
1938 
1939  runCompareSceneStates(base_random_state, comp_state_const);
1940  runCompareSceneStates(base_random_state, comp_state);
1941  }
1942 }
1943 
1944 TEST(TesseractEnvironmentUnit, EnvApplyCommandsStateSolverCompareUnit) // NOLINT
1945 {
1946  // This is testing commands that modify the connectivity of scene graph
1947  // It checks that the state solver are updated correctly
1949  { // Add new link no joint
1950  // Get the environment
1951  auto compare_env = getEnvironment();
1952 
1953  Link link_1("link_n1");
1954  Commands commands{ std::make_shared<AddLinkCommand>(link_1) };
1955  EXPECT_TRUE(compare_env->applyCommands(commands));
1956 
1957  auto base_state_solver = std::make_unique<KDLStateSolver>(*compare_env->getSceneGraph());
1958  auto compare_state_solver = compare_env->getStateSolver();
1959  runCompareStateSolver(*base_state_solver, *compare_state_solver);
1960  runGetLinkTransformsTest(*compare_env);
1961  }
1962 
1963  { // Add new link with joint
1964  // Get the environment
1965  auto compare_env = getEnvironment();
1966 
1967  Link link_1("link_n1");
1968  Joint joint_1("joint_link_n1");
1969  joint_1.parent_to_joint_origin_transform.translation()(0) = 1.25;
1970  joint_1.parent_link_name = "base_link";
1971  joint_1.child_link_name = "link_n1";
1972  joint_1.type = JointType::FIXED;
1973 
1974  Commands commands{ std::make_shared<AddLinkCommand>(link_1, joint_1) };
1975  EXPECT_TRUE(compare_env->applyCommands(commands));
1976 
1977  auto base_state_solver = std::make_unique<KDLStateSolver>(*compare_env->getSceneGraph());
1978  auto compare_state_solver = compare_env->getStateSolver();
1979  runCompareStateSolver(*base_state_solver, *compare_state_solver);
1980  runGetLinkTransformsTest(*compare_env);
1981  }
1982 
1983  { // Replace link
1984  // Get the environment
1985  auto compare_env = getEnvironment();
1986 
1987  Link link_1("link_1");
1988 
1989  Commands commands{ std::make_shared<AddLinkCommand>(link_1, true) };
1990  EXPECT_TRUE(compare_env->applyCommands(commands));
1991  auto base_state_solver = std::make_unique<KDLStateSolver>(*compare_env->getSceneGraph());
1992  auto compare_state_solver = compare_env->getStateSolver();
1993 
1994  runCompareStateSolver(*base_state_solver, *compare_state_solver);
1995  runGetLinkTransformsTest(*compare_env);
1996  }
1997  { // Replace link and joint which is allowed
1998  // Get the environment
1999  auto compare_env = getEnvironment();
2000 
2001  Link link_1("link_1");
2002  Joint joint_1("joint_a1");
2003  joint_1.parent_to_joint_origin_transform.translation()(0) = 1.25;
2004  joint_1.parent_link_name = "base_link";
2005  joint_1.child_link_name = "link_1";
2006  joint_1.type = JointType::FIXED;
2007 
2008  Commands commands{ std::make_shared<AddLinkCommand>(link_1, joint_1, true) };
2009  EXPECT_TRUE(compare_env->applyCommands(commands));
2010 
2011  auto base_state_solver = std::make_unique<KDLStateSolver>(*compare_env->getSceneGraph());
2012  auto compare_state_solver = compare_env->getStateSolver();
2013  runCompareStateSolver(*base_state_solver, *compare_state_solver);
2014  runGetLinkTransformsTest(*compare_env);
2015  }
2016 
2017  { // Replace link and joint which is not allowed
2018  // Get the environment
2019  auto compare_env = getEnvironment();
2020 
2021  Link link_1("link_1");
2022  Joint joint_1("joint_a1");
2023  joint_1.parent_to_joint_origin_transform.translation()(0) = 1.25;
2024  joint_1.parent_link_name = "base_link";
2025  joint_1.child_link_name = "link_1";
2026  joint_1.type = JointType::FIXED;
2027 
2028  Commands commands{ std::make_shared<AddLinkCommand>(link_1, joint_1, false) };
2029  EXPECT_FALSE(compare_env->applyCommands(commands));
2030 
2031  auto base_state_solver = std::make_unique<KDLStateSolver>(*compare_env->getSceneGraph());
2032  auto compare_state_solver = compare_env->getStateSolver();
2033  runCompareStateSolver(*base_state_solver, *compare_state_solver);
2034  runGetLinkTransformsTest(*compare_env);
2035  }
2036 
2037  { // Replace joint which exist but the link does not which should fail
2038  // Get the environment
2039  auto compare_env = getEnvironment();
2040 
2041  Link link_1("link_2_does_not_exist");
2042  Joint joint_1("joint_a1");
2043  joint_1.parent_to_joint_origin_transform.translation()(0) = 1.25;
2044  joint_1.parent_link_name = "base_link";
2045  joint_1.child_link_name = "link_2_does_not_exist";
2046  joint_1.type = JointType::FIXED;
2047 
2048  Commands commands{ std::make_shared<AddLinkCommand>(link_1, joint_1, true) };
2049  EXPECT_FALSE(compare_env->applyCommands(commands));
2050 
2051  auto base_state_solver = std::make_unique<KDLStateSolver>(*compare_env->getSceneGraph());
2052  auto compare_state_solver = compare_env->getStateSolver();
2053  runCompareStateSolver(*base_state_solver, *compare_state_solver);
2054  runGetLinkTransformsTest(*compare_env);
2055  }
2056 
2057  { // Replace link and joint which is not allowed but they are not currently linked
2058  // Get the environment
2059  auto compare_env = getEnvironment();
2060 
2061  Link link_1("link_2");
2062  Joint joint_1("joint_a1");
2063  joint_1.parent_to_joint_origin_transform.translation()(0) = 1.25;
2064  joint_1.parent_link_name = "base_link";
2065  joint_1.child_link_name = "link_2";
2066  joint_1.type = JointType::FIXED;
2067 
2068  Commands commands{ std::make_shared<AddLinkCommand>(link_1, joint_1, false) };
2069  EXPECT_FALSE(compare_env->applyCommands(commands));
2070 
2071  auto base_state_solver = std::make_unique<KDLStateSolver>(*compare_env->getSceneGraph());
2072  auto compare_state_solver = compare_env->getStateSolver();
2073  runCompareStateSolver(*base_state_solver, *compare_state_solver);
2074  runGetLinkTransformsTest(*compare_env);
2075  }
2076 
2077  { // Replace link which is not allowed
2078  // Get the environment
2079  auto compare_env = getEnvironment();
2080 
2081  Link link_1("link_1");
2082 
2083  Commands commands{ std::make_shared<AddLinkCommand>(link_1, false) };
2084  EXPECT_FALSE(compare_env->applyCommands(commands));
2085 
2086  auto base_state_solver = std::make_unique<KDLStateSolver>(*compare_env->getSceneGraph());
2087  auto compare_state_solver = compare_env->getStateSolver();
2088  runCompareStateSolver(*base_state_solver, *compare_state_solver);
2089  runGetLinkTransformsTest(*compare_env);
2090  }
2091 
2092  { // Replace joint but not move and same type
2093  // Get the environment
2094  auto compare_env = getEnvironment();
2095 
2096  Joint new_joint_a1 = compare_env->getJoint("joint_a1")->clone();
2097  new_joint_a1.parent_to_joint_origin_transform.translation()(0) = 1.25;
2098 
2099  Commands commands{ std::make_shared<ReplaceJointCommand>(new_joint_a1) };
2100  EXPECT_TRUE(compare_env->applyCommands(commands));
2101 
2102  auto base_state_solver = std::make_unique<KDLStateSolver>(*compare_env->getSceneGraph());
2103  auto compare_state_solver = compare_env->getStateSolver();
2104  runCompareStateSolver(*base_state_solver, *compare_state_solver);
2105  runGetLinkTransformsTest(*compare_env);
2106  }
2107 
2108  { // Replace joint but not move with different type (Fixed)
2109  // Get the environment
2110  auto compare_env = getEnvironment();
2111 
2112  Joint new_joint_a1 = compare_env->getJoint("joint_a1")->clone();
2113  new_joint_a1.parent_to_joint_origin_transform.translation()(0) = 1.25;
2114  new_joint_a1.type = JointType::FIXED;
2115 
2116  Commands commands{ std::make_shared<ReplaceJointCommand>(new_joint_a1) };
2117  EXPECT_TRUE(compare_env->applyCommands(commands));
2118 
2119  auto base_state_solver = std::make_unique<KDLStateSolver>(*compare_env->getSceneGraph());
2120  auto compare_state_solver = compare_env->getStateSolver();
2121  runCompareStateSolver(*base_state_solver, *compare_state_solver);
2122  runGetLinkTransformsTest(*compare_env);
2123  }
2124 
2125  { // Replace joint but not move with different type (Continuous)
2126  // Get the environment
2127  auto compare_env = getEnvironment();
2128 
2129  Joint new_joint_a1 = compare_env->getJoint("joint_a1")->clone();
2130  new_joint_a1.parent_to_joint_origin_transform.translation()(0) = 1.25;
2131  new_joint_a1.type = JointType::CONTINUOUS;
2132 
2133  Commands commands{ std::make_shared<ReplaceJointCommand>(new_joint_a1) };
2134  EXPECT_TRUE(compare_env->applyCommands(commands));
2135 
2136  auto base_state_solver = std::make_unique<KDLStateSolver>(*compare_env->getSceneGraph());
2137  auto compare_state_solver = compare_env->getStateSolver();
2138  runCompareStateSolver(*base_state_solver, *compare_state_solver);
2139  runGetLinkTransformsTest(*compare_env);
2140  }
2141 
2142  { // Replace joint and move with same type
2143  // Get the environment
2144  auto compare_env = getEnvironment();
2145 
2146  Joint new_joint_a3 = compare_env->getJoint("joint_a3")->clone();
2147  new_joint_a3.parent_link_name = "base_link";
2148 
2149  Commands commands{ std::make_shared<ReplaceJointCommand>(new_joint_a3) };
2150  EXPECT_TRUE(compare_env->applyCommands(commands));
2151 
2152  auto base_state_solver = std::make_unique<KDLStateSolver>(*compare_env->getSceneGraph());
2153  auto compare_state_solver = compare_env->getStateSolver();
2154  runCompareStateSolver(*base_state_solver, *compare_state_solver);
2155  runGetLinkTransformsTest(*compare_env);
2156  }
2157 
2158  { // Replace joint and move with different type (Fixed)
2159  // Get the environment
2160  auto compare_env = getEnvironment();
2161 
2162  Joint new_joint_a3 = compare_env->getJoint("joint_a3")->clone();
2163  new_joint_a3.parent_link_name = "base_link";
2164  new_joint_a3.type = JointType::FIXED;
2165 
2166  Commands commands{ std::make_shared<ReplaceJointCommand>(new_joint_a3) };
2167  EXPECT_TRUE(compare_env->applyCommands(commands));
2168 
2169  auto base_state_solver = std::make_unique<KDLStateSolver>(*compare_env->getSceneGraph());
2170  auto compare_state_solver = compare_env->getStateSolver();
2171  runCompareStateSolver(*base_state_solver, *compare_state_solver);
2172  runGetLinkTransformsTest(*compare_env);
2173  }
2174 
2175  { // Replace joint and move with different type (Prismatic)
2176  // Get the environment
2177  auto compare_env = getEnvironment();
2178 
2179  Joint new_joint_a3 = compare_env->getJoint("joint_a3")->clone();
2180  new_joint_a3.parent_link_name = "base_link";
2181  new_joint_a3.type = JointType::PRISMATIC;
2182 
2183  Commands commands{ std::make_shared<ReplaceJointCommand>(new_joint_a3) };
2184  EXPECT_TRUE(compare_env->applyCommands(commands));
2185 
2186  auto base_state_solver = std::make_unique<KDLStateSolver>(*compare_env->getSceneGraph());
2187  auto compare_state_solver = compare_env->getStateSolver();
2188  runCompareStateSolver(*base_state_solver, *compare_state_solver);
2189  runGetLinkTransformsTest(*compare_env);
2190  }
2191 
2192  { // move link
2193  auto compare_env = getEnvironment();
2194 
2195  Joint new_joint_a3 = compare_env->getJoint("joint_a3")->clone();
2196  new_joint_a3.parent_link_name = "base_link";
2197  new_joint_a3.type = JointType::FIXED;
2198 
2199  Commands commands{ std::make_shared<MoveLinkCommand>(new_joint_a3) };
2200  EXPECT_TRUE(compare_env->applyCommands(commands));
2201 
2202  auto base_state_solver = std::make_unique<KDLStateSolver>(*compare_env->getSceneGraph());
2203  auto compare_state_solver = compare_env->getStateSolver();
2204  runCompareStateSolver(*base_state_solver, *compare_state_solver);
2205  runGetLinkTransformsTest(*compare_env);
2206  }
2207 
2208  { // move joint
2209  auto compare_env = getEnvironment();
2210 
2211  Commands commands{ std::make_shared<MoveJointCommand>("joint_a3", "base_link") };
2212  EXPECT_TRUE(compare_env->applyCommands(commands));
2213 
2214  auto base_state_solver = std::make_unique<KDLStateSolver>(*compare_env->getSceneGraph());
2215  auto compare_state_solver = compare_env->getStateSolver();
2216  runCompareStateSolver(*base_state_solver, *compare_state_solver);
2217  runGetLinkTransformsTest(*compare_env);
2218  }
2219 
2220  { // remove link
2221  auto compare_env = getEnvironment();
2222 
2223  Commands commands{ std::make_shared<RemoveLinkCommand>("link_4") };
2224  EXPECT_TRUE(compare_env->applyCommands(commands));
2225 
2226  auto base_state_solver = std::make_unique<KDLStateSolver>(*compare_env->getSceneGraph());
2227  auto compare_state_solver = compare_env->getStateSolver();
2228  runCompareStateSolver(*base_state_solver, *compare_state_solver);
2229  runGetLinkTransformsTest(*compare_env);
2230  }
2231 
2232  { // remove link
2233  auto compare_env = getEnvironment();
2234 
2235  Commands commands{ std::make_shared<RemoveJointCommand>("joint_a3") };
2236  EXPECT_TRUE(compare_env->applyCommands(commands));
2237 
2238  auto base_state_solver = std::make_unique<KDLStateSolver>(*compare_env->getSceneGraph());
2239  auto compare_state_solver = compare_env->getStateSolver();
2240  runCompareStateSolver(*base_state_solver, *compare_state_solver);
2241  runGetLinkTransformsTest(*compare_env);
2242  }
2243 
2244  { // Change Joint Origin
2245  auto compare_env = getEnvironment();
2246 
2247  Eigen::Isometry3d joint_origin = compare_env->getJoint("joint_a3")->parent_to_joint_origin_transform;
2248  joint_origin.translation() = joint_origin.translation() + Eigen::Vector3d(0, 0, 1);
2249  Commands commands{ std::make_shared<ChangeJointOriginCommand>("joint_a3", joint_origin) };
2250  EXPECT_TRUE(compare_env->applyCommands(commands));
2251 
2252  auto base_state_solver = std::make_unique<KDLStateSolver>(*compare_env->getSceneGraph());
2253  auto compare_state_solver = compare_env->getStateSolver();
2254  runCompareStateSolver(*base_state_solver, *compare_state_solver);
2255  runGetLinkTransformsTest(*compare_env);
2256  }
2257 
2258  { // Add SceneGraph case 1
2259  auto compare_env = getEnvironment();
2260 
2261  auto subgraph = getSubSceneGraph();
2262 
2263  Commands commands{ std::make_shared<AddSceneGraphCommand>(*subgraph) };
2264  EXPECT_TRUE(compare_env->applyCommands(commands));
2265 
2266  auto base_state_solver = std::make_unique<KDLStateSolver>(*compare_env->getSceneGraph());
2267  auto compare_state_solver = compare_env->getStateSolver();
2268  runCompareStateSolver(*base_state_solver, *compare_state_solver);
2269  runGetLinkTransformsTest(*compare_env);
2270  }
2271 
2272  { // Add SceneGraph case 2
2273  auto compare_env = getEnvironment();
2274 
2275  auto subgraph = getSceneGraph(locator);
2276  Commands commands{ std::make_shared<AddSceneGraphCommand>(*subgraph, "prefix_") };
2277  EXPECT_TRUE(compare_env->applyCommands(commands));
2278 
2279  auto base_state_solver = std::make_unique<KDLStateSolver>(*compare_env->getSceneGraph());
2280  auto compare_state_solver = compare_env->getStateSolver();
2281  runCompareStateSolver(*base_state_solver, *compare_state_solver);
2282  runGetLinkTransformsTest(*compare_env);
2283  }
2284 
2285  { // Add SceneGraph case 3
2286  auto compare_env = getEnvironment();
2287 
2288  auto subgraph = getSceneGraph(locator);
2289  Joint attach_joint("prefix_base_link_joint");
2290  attach_joint.parent_link_name = "tool0";
2291  attach_joint.child_link_name = "prefix_base_link";
2292  attach_joint.type = JointType::FIXED;
2293 
2294  Commands commands{ std::make_shared<AddSceneGraphCommand>(*subgraph, attach_joint, "prefix_") };
2295  EXPECT_TRUE(compare_env->applyCommands(commands));
2296 
2297  auto base_state_solver = std::make_unique<KDLStateSolver>(*compare_env->getSceneGraph());
2298  auto compare_state_solver = compare_env->getStateSolver();
2299  runCompareStateSolver(*base_state_solver, *compare_state_solver);
2300  runGetLinkTransformsTest(*compare_env);
2301  }
2302 }
2303 
2304 TEST(TesseractEnvironmentUnit, EnvMultithreadedApplyCommandsTest) // NOLINT
2305 {
2306  // Get the environment
2307  auto env = getEnvironment();
2308 
2309 #pragma omp parallel for num_threads(10) shared(env)
2310  for (long i = 0; i < 10; ++i) // NOLINT
2311  {
2312  // NOLINTNEXTLINE(cppcoreguidelines-init-variables)
2313  const int tn = omp_get_thread_num();
2314  CONSOLE_BRIDGE_logDebug("Thread (ID: %i): %i of %i", tn, i, 10);
2315 
2316  auto visual = std::make_shared<Visual>();
2317  visual->geometry = std::make_shared<tesseract_geometry::Box>(1, 1, 1);
2318  auto collision = std::make_shared<Collision>();
2319  collision->geometry = std::make_shared<tesseract_geometry::Box>(1, 1, 1);
2320 
2321  const std::string link_name1 = "link_n" + std::to_string(i);
2322  Link link_1(link_name1);
2323  link_1.visual.push_back(visual);
2324  link_1.collision.push_back(collision);
2325 
2326  for (int idx = 0; idx < 10; idx++)
2327  {
2328  // addLink
2329  EXPECT_TRUE(env->applyCommand(std::make_shared<AddLinkCommand>(link_1)));
2330 
2331  // removeLink
2332  EXPECT_TRUE(env->applyCommand(std::make_shared<RemoveLinkCommand>(link_1.getName())));
2333  }
2334  }
2335 }
2336 
2337 TEST(TesseractEnvironmentUnit, EnvClone) // NOLINT
2338 {
2339  // Get the environment
2340  auto env = getEnvironment();
2341 
2342  int callback_counter{ 0 };
2343  EventCallbackFn callback = [&callback_counter](const Event& /*event*/) { ++callback_counter; };
2344 
2345  env->addEventCallback(0, callback);
2346  EXPECT_FALSE(env->getEventCallbacks().empty());
2347 
2348  // Modifying collision margin from default
2350  pair_margin_data.setCollisionMargin("link_1", "link_2", 0.1);
2352 
2353  auto cmd = std::make_shared<ChangeCollisionMarginsCommand>(0.1, pair_margin_data, overrid_type);
2354  env->applyCommand(cmd);
2355  auto timestamp = env->getTimestamp();
2356  auto current_state_timestamp = env->getCurrentStateTimestamp();
2357 
2358  // Clone the environment
2359  auto clone = env->clone();
2360  EXPECT_TRUE(clone->getEventCallbacks().empty());
2361 
2362  // Timestamp should be identical after clone
2363  EXPECT_TRUE(timestamp == clone->getTimestamp());
2364  EXPECT_TRUE(current_state_timestamp == clone->getCurrentStateTimestamp());
2365 
2366  // Check the basics
2367  EXPECT_EQ(clone->getName(), env->getName());
2368  EXPECT_EQ(clone->getRevision(), env->getRevision());
2369  EXPECT_EQ(clone->getInitRevision(), env->getInitRevision());
2370 
2371  // Check that all links got cloned
2372  std::vector<std::string> link_names = env->getLinkNames();
2373  std::vector<std::string> clone_link_names = clone->getLinkNames();
2374  for (const auto& name : link_names)
2375  EXPECT_TRUE(std::find(clone_link_names.begin(), clone_link_names.end(), name) != clone_link_names.end());
2376 
2377  // Check that all joints got cloned
2378  std::vector<std::string> joint_names = env->getJointNames();
2379  std::vector<std::string> clone_joint_names = clone->getJointNames();
2380  for (const auto& name : joint_names)
2381  EXPECT_TRUE(std::find(clone_joint_names.begin(), clone_joint_names.end(), name) != clone_joint_names.end());
2382 
2383  // Check that the command history is preserved
2384  auto history = env->getCommandHistory();
2385  auto clone_history = clone->getCommandHistory();
2386  ASSERT_EQ(history.size(), clone_history.size());
2387  for (std::size_t i = 0; i < history.size(); i++)
2388  {
2389  EXPECT_EQ(history[i]->getType(), clone_history[i]->getType());
2390  }
2391 
2392  {
2393  // Check active links
2394  std::vector<std::string> active_link_names = env->getActiveLinkNames();
2395  std::vector<std::string> clone_active_link_names = clone->getActiveLinkNames();
2396  EXPECT_EQ(active_link_names.size(), clone_active_link_names.size());
2397  for (const auto& name : active_link_names)
2398  EXPECT_TRUE(std::find(clone_active_link_names.begin(), clone_active_link_names.end(), name) !=
2399  clone_active_link_names.end());
2400 
2401  // Check static links
2402  std::vector<std::string> static_link_names = env->getStaticLinkNames();
2403  std::vector<std::string> clone_static_link_names = clone->getStaticLinkNames();
2404  EXPECT_EQ(static_link_names.size(), clone_static_link_names.size());
2405  for (const auto& name : static_link_names)
2406  EXPECT_TRUE(std::find(clone_static_link_names.begin(), clone_static_link_names.end(), name) !=
2407  clone_static_link_names.end());
2408  }
2409  {
2410  // Check active links with joint names
2411  std::vector<std::string> active_link_names = env->getActiveLinkNames(env->getActiveJointNames());
2412  EXPECT_TRUE(tesseract_common::isIdentical(active_link_names, env->getActiveLinkNames(), false));
2413 
2414  std::vector<std::string> clone_active_link_names = clone->getActiveLinkNames(env->getActiveJointNames());
2415  EXPECT_TRUE(tesseract_common::isIdentical(clone_active_link_names, clone->getActiveLinkNames(), false));
2416 
2417  EXPECT_EQ(active_link_names.size(), clone_active_link_names.size());
2418  for (const auto& name : active_link_names)
2419  EXPECT_TRUE(std::find(clone_active_link_names.begin(), clone_active_link_names.end(), name) !=
2420  clone_active_link_names.end());
2421 
2422  // Check static links with joint names
2423  std::vector<std::string> static_link_names = env->getStaticLinkNames(env->getActiveJointNames());
2424  EXPECT_TRUE(tesseract_common::isIdentical(static_link_names, env->getStaticLinkNames(), false));
2425 
2426  std::vector<std::string> clone_static_link_names = clone->getStaticLinkNames(env->getActiveJointNames());
2427  EXPECT_TRUE(tesseract_common::isIdentical(clone_static_link_names, clone->getStaticLinkNames(), false));
2428 
2429  EXPECT_EQ(static_link_names.size(), clone_static_link_names.size());
2430  for (const auto& name : static_link_names)
2431  EXPECT_TRUE(std::find(clone_static_link_names.begin(), clone_static_link_names.end(), name) !=
2432  clone_static_link_names.end());
2433  }
2434 
2435  // Check active joints
2436  std::vector<std::string> active_joint_names = env->getActiveJointNames();
2437  std::vector<std::string> clone_active_joint_names = clone->getActiveJointNames();
2438  for (const auto& name : active_joint_names)
2439  EXPECT_TRUE(std::find(clone_active_joint_names.begin(), clone_active_joint_names.end(), name) !=
2440  clone_active_joint_names.end());
2441 
2442  // Check that the state is preserved
2443  Eigen::VectorXd joint_vals = env->getState().getJointValues(active_joint_names);
2444  Eigen::VectorXd clone_joint_vals = clone->getState().getJointValues(active_joint_names);
2445  EXPECT_TRUE(joint_vals.isApprox(clone_joint_vals));
2446 
2447  // Check that the collision margin data is preserved
2448  EXPECT_EQ(env->getCollisionMarginData(), clone->getCollisionMarginData());
2449 }
2450 
2451 TEST(TesseractEnvironmentUnit, EnvSetState) // NOLINT
2452 {
2453  // Get the environment
2454  auto env = getEnvironment();
2455 
2456  int callback_counter{ 0 };
2457  EventCallbackFn callback = [&callback_counter](const Event& /*event*/) { ++callback_counter; };
2458 
2459  env->addEventCallback(0, callback);
2460  EXPECT_FALSE(env->getEventCallbacks().empty());
2461  env->removeEventCallback(0);
2462  EXPECT_TRUE(env->getEventCallbacks().empty());
2463 
2464  env->addEventCallback(0, callback);
2465  EXPECT_FALSE(env->getEventCallbacks().empty());
2466  env->clearEventCallbacks();
2467  EXPECT_TRUE(env->getEventCallbacks().empty());
2468 
2469  env->addEventCallback(0, callback);
2470  EXPECT_FALSE(env->getEventCallbacks().empty());
2471  EXPECT_EQ(callback_counter, 0);
2472 
2474  // Test forward kinematics when tip link is the base of the chain
2476  Eigen::Isometry3d pose;
2477  std::vector<double> std_jvals = { 0, 0, 0, 0, 0, 0, 0 };
2478  std::unordered_map<std::string, double> map_jvals;
2479  Eigen::VectorXd jvals;
2480  jvals.resize(7);
2481  jvals.setZero();
2482 
2483  // Check current joint values
2484  Eigen::VectorXd cjv = env->getCurrentJointValues();
2485  EXPECT_TRUE(cjv.isApprox(jvals, 1e-6));
2486 
2487  std::vector<std::string> joint_names = { "base_link-base", "joint_a1", "joint_a2", "joint_a3", "joint_a4",
2488  "joint_a5", "joint_a6", "joint_a7", "joint_a7-tool0" };
2489  std::vector<std::string> link_names = { "base", "base_link", "link_1", "link_2", "link_3",
2490  "link_4", "link_5", "link_6", "link_7", "tool0" };
2491  std::vector<std::string> active_joint_names = { "joint_a1", "joint_a2", "joint_a3", "joint_a4",
2492  "joint_a5", "joint_a6", "joint_a7" };
2493 
2494  for (const auto& jn : active_joint_names)
2495  map_jvals[jn] = 0;
2496 
2497  std::vector<SceneState> states;
2498 
2499  env->setState(active_joint_names, jvals);
2500  states.push_back(env->getState());
2501  EXPECT_EQ(callback_counter, 1);
2502 
2503  // Set the environment to a random state
2504  env->setState(env->getStateSolver()->getRandomState().joints);
2505  cjv = env->getCurrentJointValues(active_joint_names);
2506  EXPECT_FALSE(cjv.isApprox(jvals, 1e-6));
2507  EXPECT_EQ(callback_counter, 2);
2508 
2509  states.push_back(env->getState(active_joint_names, jvals));
2510  states.push_back(env->getState(map_jvals));
2511 
2512  env->setState(env->getStateSolver()->getRandomState().joints);
2513  cjv = env->getCurrentJointValues(active_joint_names);
2514  EXPECT_FALSE(cjv.isApprox(jvals, 1e-6));
2515  EXPECT_EQ(callback_counter, 3);
2516 
2517  env->setState(active_joint_names, jvals);
2518  cjv = env->getCurrentJointValues();
2519  EXPECT_TRUE(cjv.isApprox(jvals, 1e-6));
2520  states.push_back(env->getState());
2521  EXPECT_EQ(callback_counter, 4);
2522 
2523  env->setState(env->getStateSolver()->getRandomState().joints);
2524  cjv = env->getCurrentJointValues();
2525  EXPECT_FALSE(cjv.isApprox(jvals, 1e-6));
2526  EXPECT_EQ(callback_counter, 5);
2527 
2528  env->setState(active_joint_names, jvals);
2529  cjv = env->getCurrentJointValues(active_joint_names);
2530  EXPECT_TRUE(cjv.isApprox(jvals, 1e-6));
2531  states.push_back(env->getState());
2532  EXPECT_EQ(callback_counter, 6);
2533 
2534  env->setState(env->getStateSolver()->getRandomState().joints);
2535  cjv = env->getCurrentJointValues(active_joint_names);
2536  EXPECT_FALSE(cjv.isApprox(jvals, 1e-6));
2537  EXPECT_EQ(callback_counter, 7);
2538 
2539  env->setState(map_jvals);
2540  cjv = env->getCurrentJointValues();
2541  EXPECT_TRUE(cjv.isApprox(jvals, 1e-6));
2542  states.push_back(env->getState());
2543  EXPECT_EQ(callback_counter, 8);
2544 
2545  for (auto& current_state : states)
2546  {
2547  // Check joints and links size
2548  EXPECT_EQ(current_state.joint_transforms.size(), 9);
2549  EXPECT_EQ(current_state.link_transforms.size(), 10);
2550  EXPECT_EQ(current_state.joints.size(), 7);
2551 
2552  // Check joints and links names
2553  for (const auto& joint_name : joint_names)
2554  {
2555  EXPECT_TRUE(current_state.joint_transforms.find(joint_name) != current_state.joint_transforms.end());
2556  }
2557 
2558  for (const auto& link_name : link_names)
2559  {
2560  EXPECT_TRUE(current_state.link_transforms.find(link_name) != current_state.link_transforms.end());
2561  }
2562 
2563  for (const auto& joint_name : active_joint_names)
2564  {
2565  EXPECT_TRUE(current_state.joints.find(joint_name) != current_state.joints.end());
2566  }
2567 
2568  EXPECT_TRUE(current_state.link_transforms.at("base_link").isApprox(Eigen::Isometry3d::Identity()));
2569 
2570  {
2571  Eigen::Isometry3d result = Eigen::Isometry3d::Identity();
2572  EXPECT_TRUE(current_state.link_transforms.at("link_1").isApprox(result));
2573  }
2574 
2575  {
2576  Eigen::Isometry3d result = Eigen::Isometry3d::Identity() * Eigen::Translation3d(-0.00043624, 0, 0.36);
2577  EXPECT_TRUE(current_state.link_transforms.at("link_2").isApprox(result));
2578  }
2579 
2580  {
2581  Eigen::Isometry3d result = Eigen::Isometry3d::Identity() * Eigen::Translation3d(-0.00043624, 0, 0.36);
2582  EXPECT_TRUE(current_state.link_transforms.at("link_3").isApprox(result));
2583  }
2584 
2585  {
2586  Eigen::Isometry3d result = Eigen::Isometry3d::Identity() * Eigen::Translation3d(0, 0, 0.36 + 0.42);
2587  EXPECT_TRUE(current_state.link_transforms.at("link_4").isApprox(result));
2588  }
2589 
2590  {
2591  Eigen::Isometry3d result = Eigen::Isometry3d::Identity() * Eigen::Translation3d(0, 0, 0.36 + 0.42);
2592  EXPECT_TRUE(current_state.link_transforms.at("link_5").isApprox(result));
2593  }
2594 
2595  {
2596  Eigen::Isometry3d result = Eigen::Isometry3d::Identity() * Eigen::Translation3d(0, 0, 0.36 + 0.42 + 0.4);
2597  EXPECT_TRUE(current_state.link_transforms.at("link_6").isApprox(result));
2598  }
2599 
2600  {
2601  Eigen::Isometry3d result = Eigen::Isometry3d::Identity() * Eigen::Translation3d(0, 0, 0.36 + 0.42 + 0.4);
2602  EXPECT_TRUE(current_state.link_transforms.at("link_7").isApprox(result));
2603  }
2604 
2605  {
2606  Eigen::Isometry3d result = Eigen::Isometry3d::Identity() * Eigen::Translation3d(0, 0, 1.306);
2607  EXPECT_TRUE(current_state.link_transforms.at("tool0").isApprox(result));
2608  }
2609  }
2610 }
2611 
2612 TEST(TesseractEnvironmentUnit, EnvSetState2) // NOLINT
2613 {
2614  // Get the environment
2615  auto env = getEnvironment();
2616 
2618  // Test forward kinematics when tip link is the base of the chain
2620  Eigen::Isometry3d pose;
2621  Eigen::VectorXd jvals;
2622  jvals.resize(7);
2623  jvals.setZero();
2624  std::vector<std::string> joint_names = { "base_link-base", "joint_a1", "joint_a2", "joint_a3", "joint_a4",
2625  "joint_a5", "joint_a6", "joint_a7", "joint_a7-tool0" };
2626  std::vector<std::string> link_names = { "base", "base_link", "link_1", "link_2", "link_3",
2627  "link_4", "link_5", "link_6", "link_7", "tool0" };
2628  std::vector<std::string> active_joint_names = { "joint_a1", "joint_a2", "joint_a3", "joint_a4",
2629  "joint_a5", "joint_a6", "joint_a7" };
2630 
2631  Eigen::Vector3d axis(0, 1, 0);
2632  jvals(1) = M_PI_2;
2633  std::vector<SceneState> states;
2634 
2635  env->setState(active_joint_names, jvals);
2636  states.push_back(env->getState());
2637  states.push_back(env->getState(active_joint_names, jvals));
2638 
2639  for (auto& current_state : states)
2640  {
2641  // Check joints and links size
2642  EXPECT_EQ(current_state.joint_transforms.size(), 9);
2643  EXPECT_EQ(current_state.link_transforms.size(), 10);
2644  EXPECT_EQ(current_state.joints.size(), 7);
2645 
2646  // Check joints and links names
2647  for (const auto& joint_name : joint_names)
2648  {
2649  EXPECT_TRUE(current_state.joint_transforms.find(joint_name) != current_state.joint_transforms.end());
2650  }
2651 
2652  for (const auto& link_name : link_names)
2653  {
2654  EXPECT_TRUE(current_state.link_transforms.find(link_name) != current_state.link_transforms.end());
2655  }
2656 
2657  int cnt = 0;
2658  for (const auto& joint_name : active_joint_names)
2659  {
2660  EXPECT_TRUE(current_state.joints.find(joint_name) != current_state.joints.end());
2661  EXPECT_NEAR(current_state.joints[joint_name], jvals(cnt++), 1e-5);
2662  }
2663 
2664  EXPECT_TRUE(current_state.link_transforms["base_link"].isApprox(Eigen::Isometry3d::Identity()));
2665  EXPECT_TRUE(current_state.link_transforms["base"].isApprox(Eigen::Isometry3d::Identity()));
2666 
2667  {
2668  Eigen::Isometry3d result = Eigen::Isometry3d::Identity();
2669  EXPECT_TRUE(current_state.link_transforms["link_1"].isApprox(result));
2670  }
2671 
2672  {
2673  Eigen::Isometry3d result = Eigen::Translation3d(-0.00043624, 0, 0.36) * Eigen::AngleAxisd(M_PI_2, axis);
2674  EXPECT_TRUE(current_state.link_transforms["link_2"].isApprox(result, 1e-4));
2675  }
2676 
2677  {
2678  Eigen::Isometry3d result = Eigen::Translation3d(-0.00043624, 0, 0.36) * Eigen::AngleAxisd(M_PI_2, axis);
2679  EXPECT_TRUE(current_state.link_transforms["link_3"].isApprox(result, 1e-4));
2680  }
2681 
2682  {
2683  Eigen::Isometry3d result =
2684  Eigen::Translation3d(0.42 - 0.00043624, 0, 0.36 - 0.00043624) * Eigen::AngleAxisd(M_PI_2, axis);
2685  EXPECT_TRUE(current_state.link_transforms["link_4"].isApprox(result, 1e-4));
2686  }
2687 
2688  {
2689  Eigen::Isometry3d result =
2690  Eigen::Translation3d(0.42 - 0.00043624, 0, 0.36 - 0.00043624) * Eigen::AngleAxisd(M_PI_2, axis);
2691  EXPECT_TRUE(current_state.link_transforms["link_5"].isApprox(result, 1e-4));
2692  }
2693 
2694  {
2695  Eigen::Isometry3d result =
2696  Eigen::Translation3d(0.42 + 0.4 - 0.00043624, 0, 0.36 - 0.00043624) * Eigen::AngleAxisd(M_PI_2, axis);
2697  EXPECT_TRUE(current_state.link_transforms["link_6"].isApprox(result, 1e-4));
2698  }
2699 
2700  {
2701  Eigen::Isometry3d result =
2702  Eigen::Translation3d(0.42 + 0.4 - 0.00043624, 0, 0.36 - 0.00043624) * Eigen::AngleAxisd(M_PI_2, axis);
2703  EXPECT_TRUE(current_state.link_transforms["link_7"].isApprox(result, 1e-4));
2704  }
2705 
2706  {
2707  Eigen::Isometry3d result =
2708  Eigen::Translation3d(1.306 - 0.36 - 0.00043624, 0, 0.36 - 0.00043624) * Eigen::AngleAxisd(M_PI_2, axis);
2709  EXPECT_TRUE(current_state.link_transforms["tool0"].isApprox(result, 1e-4));
2710  }
2711  }
2712 }
2713 
2714 TEST(TesseractEnvironmentUnit, EnvFindTCPUnit) // NOLINT
2715 {
2716  // Get the environment
2717  auto env = getEnvironment();
2718 
2719  { // Should return the solution form the provided callback
2720  Eigen::Isometry3d tcp = Eigen::Isometry3d::Identity();
2721  tcp.translation() = Eigen::Vector3d(0, 0, 0.1);
2722  tesseract_common::ManipulatorInfo manip_info("manipulator", "unknown", "unknown", tcp);
2723  Eigen::Isometry3d found_tcp = env->findTCPOffset(manip_info);
2724  EXPECT_TRUE(std::get<Eigen::Isometry3d>(manip_info.tcp_offset).isApprox(found_tcp, 1e-6));
2725  }
2726 
2727  { // If the manipulator has a tcp transform then it should be returned
2728  Eigen::Isometry3d tcp = Eigen::Isometry3d::Identity();
2729  tcp.translation() = Eigen::Vector3d(0, 0, 0.25);
2730  tesseract_common::ManipulatorInfo manip_info("manipulator", "", "");
2731  manip_info.tcp_offset = "laser_callback";
2732  Eigen::Isometry3d found_tcp = env->findTCPOffset(manip_info);
2733  EXPECT_TRUE(found_tcp.isApprox(Eigen::Isometry3d::Identity() * Eigen::Translation3d(0, 0, 0.1), 1e-6));
2734  }
2735 
2736  { // The tcp offset name is a link in the environment so it should throw an exception
2737  tesseract_common::ManipulatorInfo manip_info("manipulator", "unknown", "unknown");
2738  manip_info.tcp_offset = "tool0";
2739  EXPECT_ANY_THROW(env->findTCPOffset(manip_info)); // NOLINT
2740  }
2741 
2742  { // If the tcp offset name does not exist it should throw an exception
2743  tesseract_common::ManipulatorInfo manip_info("manipulator", "unknown", "unknown");
2744  manip_info.tcp_offset = "unknown";
2745  EXPECT_ANY_THROW(env->findTCPOffset(manip_info)); // NOLINT
2746  }
2747 }
2748 
2749 TEST(TesseractEnvironmentUnit, getActiveLinkNamesRecursiveUnit) // NOLINT
2750 {
2751  // Get the environment
2752  auto env = getEnvironment();
2753 
2754  std::vector<std::string> active_links;
2755  getActiveLinkNamesRecursive(active_links, *env->getSceneGraph(), env->getRootLinkName(), false);
2756  std::vector<std::string> target_active_links = env->getActiveLinkNames();
2757  EXPECT_TRUE(tesseract_common::isIdentical(active_links, target_active_links, false));
2758 }
2759 
2760 void checkProcessInterpolatedResults(const std::vector<tesseract_collision::ContactResultMap>& contacts)
2761 {
2762  for (const auto& c : contacts)
2763  {
2764  for (const auto& pair : c)
2765  {
2766  for (const auto& r : pair.second)
2767  {
2768  for (std::size_t j = 0; j < 2; ++j)
2769  {
2770  if (!(r.cc_time[j] < 0))
2771  {
2772  if (tesseract_common::almostEqualRelativeAndAbs(r.cc_time[j], 0.0))
2774  else if (tesseract_common::almostEqualRelativeAndAbs(r.cc_time[j], 1.0))
2776  else
2778  }
2779  else
2780  {
2782  }
2783  }
2784 
2787  }
2788  }
2789  }
2790 }
2791 
2797 {
2798  for (const auto& pair : contacts)
2799  {
2800  for (const auto& r : pair.second)
2801  {
2804  }
2805  }
2806 }
2807 
2813 {
2814  for (const auto& pair : contacts)
2815  {
2816  for (const auto& r : pair.second)
2817  {
2820  }
2821  }
2822 }
2823 
2829 {
2830  for (const auto& pair : contacts)
2831  {
2832  for (const auto& r : pair.second)
2833  {
2835  return true;
2836 
2838  return true;
2839  }
2840  }
2841  return false;
2842 }
2843 
2849 {
2850  for (const auto& pair : contacts)
2851  {
2852  for (const auto& r : pair.second)
2853  {
2855  return true;
2856 
2858  return true;
2859  }
2860  }
2861  return false;
2862 }
2863 
2865 long getContactCount(const std::vector<tesseract_collision::ContactResultMap>& contacts)
2866 {
2867  long total{ 0 };
2868  for (const auto& c : contacts)
2869  total += c.count();
2870 
2871  return total;
2872 }
2873 
2874 TEST(TesseractEnvironmentUnit, checkTrajectoryUnit) // NOLINT
2875 {
2876  // Get the environment
2877  auto env = getEnvironment();
2878 
2879  // Add sphere to environment
2880  Link link_sphere("sphere_attached");
2881 
2882  Visual::Ptr visual = std::make_shared<Visual>();
2883  visual->origin = Eigen::Isometry3d::Identity();
2884  visual->origin.translation() = Eigen::Vector3d(0.5, 0, 0.55);
2885  visual->geometry = std::make_shared<tesseract_geometry::Sphere>(0.15);
2886  link_sphere.visual.push_back(visual);
2887 
2888  Collision::Ptr collision = std::make_shared<Collision>();
2889  collision->origin = visual->origin;
2890  collision->geometry = visual->geometry;
2891  link_sphere.collision.push_back(collision);
2892 
2893  Joint joint_sphere("joint_sphere_attached");
2894  joint_sphere.parent_link_name = "base_link";
2895  joint_sphere.child_link_name = link_sphere.getName();
2896  joint_sphere.type = JointType::FIXED;
2897 
2898  auto cmd = std::make_shared<tesseract_environment::AddLinkCommand>(link_sphere, joint_sphere);
2899 
2900  EXPECT_TRUE(env->applyCommand(cmd));
2901 
2902  // Set the robot initial state
2903  std::vector<std::string> joint_names;
2904  joint_names.emplace_back("joint_a1");
2905  joint_names.emplace_back("joint_a2");
2906  joint_names.emplace_back("joint_a3");
2907  joint_names.emplace_back("joint_a4");
2908  joint_names.emplace_back("joint_a5");
2909  joint_names.emplace_back("joint_a6");
2910  joint_names.emplace_back("joint_a7");
2911 
2912  Eigen::VectorXd joint_start_pos(7);
2913  joint_start_pos(0) = -0.4;
2914  joint_start_pos(1) = 0.2762;
2915  joint_start_pos(2) = 0.0;
2916  joint_start_pos(3) = -1.3348;
2917  joint_start_pos(4) = 0.0;
2918  joint_start_pos(5) = 1.4959;
2919  joint_start_pos(6) = 0.0;
2920 
2921  Eigen::VectorXd joint_end_pos(7);
2922  joint_end_pos(0) = 0.4;
2923  joint_end_pos(1) = 0.2762;
2924  joint_end_pos(2) = 0.0;
2925  joint_end_pos(3) = -1.3348;
2926  joint_end_pos(4) = 0.0;
2927  joint_end_pos(5) = 1.4959;
2928  joint_end_pos(6) = 0.0;
2929 
2930  Eigen::VectorXd joint_pos_collision(7);
2931  joint_pos_collision(0) = 0.0;
2932  joint_pos_collision(1) = 0.2762;
2933  joint_pos_collision(2) = 0.0;
2934  joint_pos_collision(3) = -1.3348;
2935  joint_pos_collision(4) = 0.0;
2936  joint_pos_collision(5) = 1.4959;
2937  joint_pos_collision(6) = 0.0;
2938 
2939  // Only intermediat states are in collision
2940  tesseract_common::TrajArray traj(5, joint_start_pos.size());
2941  for (int i = 0; i < joint_start_pos.size(); ++i)
2942  traj.col(i) = Eigen::VectorXd::LinSpaced(5, joint_start_pos(i), joint_end_pos(i));
2943 
2944  // Only start state is not in collision
2945  tesseract_common::TrajArray traj2(3, joint_start_pos.size());
2946  for (int i = 0; i < joint_start_pos.size(); ++i)
2947  traj2.col(i) = Eigen::VectorXd::LinSpaced(3, joint_start_pos(i), joint_pos_collision(i));
2948 
2949  // Only start state is not in collision
2950  tesseract_common::TrajArray traj3(3, joint_start_pos.size());
2951  for (int i = 0; i < joint_start_pos.size(); ++i)
2952  traj3.col(i) = Eigen::VectorXd::LinSpaced(3, joint_pos_collision(i), joint_end_pos(i));
2953 
2954  // Only two states
2955  tesseract_common::TrajArray traj4(2, joint_start_pos.size());
2956  traj4.row(0) = joint_pos_collision;
2957  traj4.row(1) = joint_end_pos;
2958 
2959  tesseract_common::TrajArray traj5(2, joint_start_pos.size());
2960  traj5.row(0) = joint_start_pos;
2961  traj5.row(1) = joint_pos_collision;
2962 
2963  auto discrete_manager = env->getDiscreteContactManager();
2964  auto continuous_manager = env->getContinuousContactManager();
2965  auto state_solver = env->getStateSolver();
2966  auto joint_group = env->getJointGroup("manipulator");
2967 
2969 
2970  { // CollisionEvaluatorType::DISCRETE && CollisionCheckProgramType::ALL
2972  config.type = CollisionEvaluatorType::DISCRETE;
2973  config.check_program_mode = CollisionCheckProgramType::ALL;
2974  std::vector<tesseract_collision::ContactResultMap> contacts;
2975  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj, config));
2976  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows()));
2977  EXPECT_EQ(contacts.at(0).size(), 0);
2978  EXPECT_EQ(contacts.at(1).size(), 2);
2979  EXPECT_EQ(contacts.at(2).size(), 2);
2980  EXPECT_EQ(contacts.at(3).size(), 2);
2981  EXPECT_EQ(contacts.at(4).size(), 0);
2982  EXPECT_EQ(getContactCount(contacts), static_cast<int>(6));
2984 
2985  contacts.clear();
2986  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj2, config));
2987  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows()));
2988  EXPECT_EQ(contacts.at(0).size(), 0);
2989  EXPECT_EQ(contacts.at(1).size(), 2);
2990  EXPECT_EQ(contacts.at(2).size(), 2);
2991  EXPECT_EQ(getContactCount(contacts), static_cast<int>(4));
2995 
2996  contacts.clear();
2997  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj3, config));
2998  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows()));
2999  EXPECT_EQ(contacts.at(0).size(), 2);
3000  EXPECT_EQ(contacts.at(1).size(), 2);
3001  EXPECT_EQ(contacts.at(2).size(), 0);
3002  EXPECT_EQ(getContactCount(contacts), static_cast<int>(4));
3006  }
3007 
3008  { // CollisionEvaluatorType::DISCRETE && CollisionCheckProgramType::ALL_EXCEPT_END
3010  config.type = CollisionEvaluatorType::DISCRETE;
3011  config.check_program_mode = CollisionCheckProgramType::ALL_EXCEPT_END;
3012  std::vector<tesseract_collision::ContactResultMap> contacts;
3013  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj, config));
3014  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 1));
3015  EXPECT_EQ(contacts.at(0).size(), 0);
3016  EXPECT_EQ(contacts.at(1).size(), 2);
3017  EXPECT_EQ(contacts.at(2).size(), 2);
3018  EXPECT_EQ(contacts.at(3).size(), 2);
3019  EXPECT_EQ(getContactCount(contacts), static_cast<int>(6));
3024 
3025  contacts.clear();
3026  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj2, config));
3027  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 1));
3028  EXPECT_EQ(contacts.at(0).size(), 0);
3029  EXPECT_EQ(contacts.at(1).size(), 2);
3030  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
3033 
3034  contacts.clear();
3035  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj3, config));
3036  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 1));
3037  EXPECT_EQ(contacts.at(0).size(), 2);
3038  EXPECT_EQ(contacts.at(1).size(), 2);
3039  EXPECT_EQ(getContactCount(contacts), static_cast<int>(4));
3043  }
3044 
3045  { // CollisionEvaluatorType::DISCRETE && CollisionCheckProgramType::ALL_EXCEPT_START
3047  config.type = CollisionEvaluatorType::DISCRETE;
3048  config.check_program_mode = CollisionCheckProgramType::ALL_EXCEPT_START;
3049  std::vector<tesseract_collision::ContactResultMap> contacts;
3050  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj, config));
3051  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows()));
3052  EXPECT_EQ(contacts.at(0).size(), 0);
3053  EXPECT_EQ(contacts.at(1).size(), 2);
3054  EXPECT_EQ(contacts.at(2).size(), 2);
3055  EXPECT_EQ(contacts.at(3).size(), 2);
3056  EXPECT_EQ(contacts.at(4).size(), 0);
3057  EXPECT_EQ(getContactCount(contacts), static_cast<int>(6));
3062 
3063  contacts.clear();
3064  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj2, config));
3065  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows()));
3066  EXPECT_EQ(contacts.at(0).size(), 0);
3067  EXPECT_EQ(contacts.at(1).size(), 2);
3068  EXPECT_EQ(contacts.at(2).size(), 2);
3069  EXPECT_EQ(getContactCount(contacts), static_cast<int>(4));
3073 
3074  contacts.clear();
3075  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj3, config));
3076  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows()));
3077  EXPECT_EQ(contacts.at(0).size(), 0);
3078  EXPECT_EQ(contacts.at(1).size(), 2);
3079  EXPECT_EQ(contacts.at(2).size(), 0);
3080  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
3083  }
3084 
3085  { // CollisionEvaluatorType::DISCRETE && CollisionCheckProgramType::INTERMEDIATE_ONLY
3087  config.type = CollisionEvaluatorType::DISCRETE;
3088  config.check_program_mode = CollisionCheckProgramType::INTERMEDIATE_ONLY;
3089  std::vector<tesseract_collision::ContactResultMap> contacts;
3090  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj, config));
3091  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 1));
3092  EXPECT_EQ(contacts.at(0).size(), 0);
3093  EXPECT_EQ(contacts.at(1).size(), 2);
3094  EXPECT_EQ(contacts.at(2).size(), 2);
3095  EXPECT_EQ(contacts.at(3).size(), 2);
3096  EXPECT_EQ(getContactCount(contacts), static_cast<int>(6));
3101 
3102  contacts.clear();
3103  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj2, config));
3104  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 1));
3105  EXPECT_EQ(contacts.at(0).size(), 0);
3106  EXPECT_EQ(contacts.at(1).size(), 2);
3107  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
3110 
3111  contacts.clear();
3112  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj3, config));
3113  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 1));
3114  EXPECT_EQ(contacts.at(0).size(), 0);
3115  EXPECT_EQ(contacts.at(1).size(), 2);
3116  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
3119  }
3120 
3121  { // CollisionEvaluatorType::DISCRETE && CollisionCheckProgramType::END_ONLY
3123  config.type = CollisionEvaluatorType::DISCRETE;
3124  config.check_program_mode = CollisionCheckProgramType::END_ONLY;
3125  std::vector<tesseract_collision::ContactResultMap> contacts;
3126  EXPECT_FALSE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj, config));
3127  EXPECT_EQ(contacts.size(), 1);
3128  EXPECT_EQ(contacts.at(0).size(), 0);
3129  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
3130 
3131  contacts.clear();
3132  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj2, config));
3133  EXPECT_EQ(contacts.size(), 1);
3134  EXPECT_EQ(contacts.at(0).size(), 2);
3135  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
3138 
3139  contacts.clear();
3140  EXPECT_FALSE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj3, config));
3141  EXPECT_EQ(contacts.size(), 1);
3142  EXPECT_EQ(contacts.at(0).size(), 0);
3143  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
3144  }
3145 
3146  { // CollisionEvaluatorType::DISCRETE && CollisionCheckProgramType::START_ONLY
3148  config.type = CollisionEvaluatorType::DISCRETE;
3149  config.check_program_mode = CollisionCheckProgramType::START_ONLY;
3150  std::vector<tesseract_collision::ContactResultMap> contacts;
3151  EXPECT_FALSE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj, config));
3152  EXPECT_EQ(contacts.size(), 1);
3153  EXPECT_EQ(contacts.at(0).size(), 0);
3154  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
3155 
3156  contacts.clear();
3157  EXPECT_FALSE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj2, config));
3158  EXPECT_EQ(contacts.size(), 1);
3159  EXPECT_EQ(contacts.at(0).size(), 0);
3160  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
3161 
3162  contacts.clear();
3163  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj3, config));
3164  EXPECT_EQ(contacts.size(), 1);
3165  EXPECT_EQ(contacts.at(0).size(), 2);
3166  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
3169  }
3170 
3171  {
3173  config.type = CollisionEvaluatorType::DISCRETE;
3175  std::vector<tesseract_collision::ContactResultMap> contacts;
3176  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj, config));
3177  EXPECT_EQ(contacts.size(), 2);
3178  EXPECT_EQ(contacts.at(0).size(), 0);
3179  EXPECT_EQ(contacts.at(1).size(), 1);
3180  EXPECT_EQ(getContactCount(contacts), static_cast<int>(1));
3182 
3183  contacts.clear();
3184  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj2, config));
3185  EXPECT_EQ(contacts.size(), 2);
3186  EXPECT_EQ(contacts.at(0).size(), 0);
3187  EXPECT_EQ(contacts.at(1).size(), 1);
3188  EXPECT_EQ(getContactCount(contacts), static_cast<int>(1));
3190  }
3191 
3192  {
3194  config.type = CollisionEvaluatorType::DISCRETE;
3195  std::vector<tesseract_collision::ContactResultMap> contacts;
3196  EXPECT_FALSE(
3197  checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, joint_start_pos.transpose(), config));
3198  EXPECT_EQ(contacts.size(), 1);
3199  EXPECT_EQ(contacts.at(0).size(), 0);
3200  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
3202  }
3203 
3204  { // CollisionEvaluatorType::LVS_DISCRETE && CollisionCheckProgramType::ALL
3206  config.type = CollisionEvaluatorType::LVS_DISCRETE;
3207  config.longest_valid_segment_length = std::numeric_limits<double>::max();
3208  config.check_program_mode = CollisionCheckProgramType::ALL;
3209  std::vector<tesseract_collision::ContactResultMap> contacts;
3210  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj, config));
3211  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 1));
3212  EXPECT_EQ(contacts.at(0).size(), 0);
3213  EXPECT_EQ(contacts.at(1).size(), 2);
3214  EXPECT_EQ(contacts.at(2).size(), 2);
3215  EXPECT_EQ(contacts.at(3).size(), 2);
3216  EXPECT_EQ(getContactCount(contacts), static_cast<int>(6));
3222 
3223  contacts.clear();
3224  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj2, config));
3225  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 1));
3226  EXPECT_EQ(contacts.at(0).size(), 0);
3227  EXPECT_EQ(contacts.at(1).size(), 2);
3228  EXPECT_EQ(getContactCount(contacts), static_cast<int>(4));
3232 
3233  contacts.clear();
3234  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj3, config));
3235  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj3.rows() - 1));
3236  EXPECT_EQ(contacts.at(0).size(), 2);
3237  EXPECT_EQ(contacts.at(1).size(), 2);
3238  EXPECT_EQ(getContactCount(contacts), static_cast<int>(4));
3244 
3245  contacts.clear();
3246  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj4, config));
3247  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj4.rows() - 1));
3248  EXPECT_EQ(contacts.at(0).size(), 2);
3249  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
3253 
3254  contacts.clear();
3255  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj5, config));
3256  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj5.rows() - 1));
3257  EXPECT_EQ(contacts.at(0).size(), 2);
3258  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
3262  }
3263 
3264  { // CollisionEvaluatorType::LVS_DISCRETE && CollisionCheckProgramType::ALL_EXCEPT_END
3266  config.type = CollisionEvaluatorType::LVS_DISCRETE;
3267  config.longest_valid_segment_length = std::numeric_limits<double>::max();
3268  config.check_program_mode = CollisionCheckProgramType::ALL_EXCEPT_END;
3269  std::vector<tesseract_collision::ContactResultMap> contacts;
3270  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj, config));
3271  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 1));
3272  EXPECT_EQ(contacts.at(0).size(), 0);
3273  EXPECT_EQ(contacts.at(1).size(), 2);
3274  EXPECT_EQ(contacts.at(2).size(), 2);
3275  EXPECT_EQ(contacts.at(3).size(), 2);
3276  EXPECT_EQ(getContactCount(contacts), static_cast<int>(6));
3282 
3283  contacts.clear();
3284  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj2, config));
3285  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 1));
3286  EXPECT_EQ(contacts.at(0).size(), 0);
3287  EXPECT_EQ(contacts.at(1).size(), 2);
3288  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
3292 
3293  contacts.clear();
3294  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj3, config));
3295  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj3.rows() - 1));
3296  EXPECT_EQ(contacts.at(0).size(), 2);
3297  EXPECT_EQ(contacts.at(1).size(), 2);
3298  EXPECT_EQ(getContactCount(contacts), static_cast<int>(4));
3304 
3305  contacts.clear();
3306  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj4, config));
3307  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj4.rows() - 1));
3308  EXPECT_EQ(contacts.at(0).size(), 2);
3309  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
3313 
3314  contacts.clear();
3315  EXPECT_FALSE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj5, config));
3316  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj5.rows() - 1));
3317  EXPECT_EQ(contacts.at(0).size(), 0);
3318  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
3319  }
3320 
3321  { // CollisionEvaluatorType::LVS_DISCRETE && CollisionCheckProgramType::ALL_EXCEPT_START
3323  config.type = CollisionEvaluatorType::LVS_DISCRETE;
3324  config.longest_valid_segment_length = std::numeric_limits<double>::max();
3325  config.check_program_mode = CollisionCheckProgramType::ALL_EXCEPT_START;
3326  std::vector<tesseract_collision::ContactResultMap> contacts;
3327  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj, config));
3328  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 1));
3329  EXPECT_EQ(contacts.at(0).size(), 0);
3330  EXPECT_EQ(contacts.at(1).size(), 2);
3331  EXPECT_EQ(contacts.at(2).size(), 2);
3332  EXPECT_EQ(contacts.at(3).size(), 2);
3333  EXPECT_EQ(getContactCount(contacts), static_cast<int>(6));
3339 
3340  contacts.clear();
3341  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj2, config));
3342  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 1));
3343  EXPECT_EQ(contacts.at(0).size(), 0);
3344  EXPECT_EQ(contacts.at(1).size(), 2);
3345  EXPECT_EQ(getContactCount(contacts), static_cast<int>(4));
3349 
3350  contacts.clear();
3351  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj3, config));
3352  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj3.rows() - 1));
3353  EXPECT_EQ(contacts.at(0).size(), 0);
3354  EXPECT_EQ(contacts.at(1).size(), 2);
3355  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
3359 
3360  contacts.clear();
3361  EXPECT_FALSE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj4, config));
3362  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj4.rows() - 1));
3363  EXPECT_EQ(contacts.at(0).size(), 0);
3364  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
3365 
3366  contacts.clear();
3367  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj5, config));
3368  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj5.rows() - 1));
3369  EXPECT_EQ(contacts.at(0).size(), 2);
3370  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
3374  }
3375 
3376  { // CollisionEvaluatorType::LVS_DISCRETE && CollisionCheckProgramType::INTERMEDIATE_ONLY
3378  config.type = CollisionEvaluatorType::LVS_DISCRETE;
3379  config.longest_valid_segment_length = std::numeric_limits<double>::max();
3380  config.check_program_mode = CollisionCheckProgramType::INTERMEDIATE_ONLY;
3381  std::vector<tesseract_collision::ContactResultMap> contacts;
3382  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj, config));
3383  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 1));
3384  EXPECT_EQ(contacts.at(0).size(), 0);
3385  EXPECT_EQ(contacts.at(1).size(), 2);
3386  EXPECT_EQ(contacts.at(2).size(), 2);
3387  EXPECT_EQ(contacts.at(3).size(), 2);
3388  EXPECT_EQ(getContactCount(contacts), static_cast<int>(6));
3394 
3395  contacts.clear();
3396  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj2, config));
3397  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 1));
3398  EXPECT_EQ(contacts.at(0).size(), 0);
3399  EXPECT_EQ(contacts.at(1).size(), 2);
3400  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
3404 
3405  contacts.clear();
3406  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj3, config));
3407  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj3.rows() - 1));
3408  EXPECT_EQ(contacts.at(0).size(), 0);
3409  EXPECT_EQ(contacts.at(1).size(), 2);
3410  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
3414 
3415  contacts.clear();
3416  EXPECT_FALSE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj4, config));
3417  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj4.rows() - 1));
3418  EXPECT_EQ(contacts.at(0).size(), 0);
3419  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
3420 
3421  contacts.clear();
3422  EXPECT_FALSE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj5, config));
3423  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj5.rows() - 1));
3424  EXPECT_EQ(contacts.at(0).size(), 0);
3425  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
3426  }
3427 
3428  { // CollisionEvaluatorType::LVS_DISCRETE && CollisionCheckProgramType::END_ONLY
3430  config.type = CollisionEvaluatorType::LVS_DISCRETE;
3431  config.longest_valid_segment_length = std::numeric_limits<double>::max();
3432  config.check_program_mode = CollisionCheckProgramType::END_ONLY;
3433  std::vector<tesseract_collision::ContactResultMap> contacts;
3434  EXPECT_FALSE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj, config));
3435  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(1));
3436  EXPECT_EQ(contacts.at(0).size(), 0);
3437  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
3438 
3439  contacts.clear();
3440  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj2, config));
3441  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(1));
3442  EXPECT_EQ(contacts.at(0).size(), 2);
3443  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
3447 
3448  contacts.clear();
3449  EXPECT_FALSE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj3, config));
3450  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(1));
3451  EXPECT_EQ(contacts.at(0).size(), 0);
3452  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
3453  }
3454 
3455  { // CollisionEvaluatorType::LVS_DISCRETE && CollisionCheckProgramType::START_ONLY
3457  config.type = CollisionEvaluatorType::LVS_DISCRETE;
3458  config.longest_valid_segment_length = std::numeric_limits<double>::max();
3459  config.check_program_mode = CollisionCheckProgramType::START_ONLY;
3460  std::vector<tesseract_collision::ContactResultMap> contacts;
3461  EXPECT_FALSE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj, config));
3462  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(1));
3463  EXPECT_EQ(contacts.at(0).size(), 0);
3464  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
3465 
3466  contacts.clear();
3467  EXPECT_FALSE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj2, config));
3468  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(1));
3469  EXPECT_EQ(contacts.at(0).size(), 0);
3470  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
3471 
3472  contacts.clear();
3473  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj3, config));
3474  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(1));
3475  EXPECT_EQ(contacts.at(0).size(), 2);
3476  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
3480  }
3481 
3482  {
3484  config.type = CollisionEvaluatorType::LVS_DISCRETE;
3486  config.longest_valid_segment_length = std::numeric_limits<double>::max();
3487  std::vector<tesseract_collision::ContactResultMap> contacts;
3488  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj, config));
3489  EXPECT_EQ(contacts.size(), 2);
3490  EXPECT_EQ(contacts.at(0).size(), 0);
3491  EXPECT_EQ(contacts.at(1).size(), 1);
3492  EXPECT_EQ(getContactCount(contacts), static_cast<int>(1));
3494 
3495  contacts.clear();
3496  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj2, config));
3497  EXPECT_EQ(contacts.size(), 2);
3498  EXPECT_EQ(contacts.at(0).size(), 0);
3499  EXPECT_EQ(contacts.at(1).size(), 1);
3500  EXPECT_EQ(getContactCount(contacts), static_cast<int>(1));
3502  }
3503 
3504  { // CollisionEvaluatorType::LVS_DISCRETE && CollisionCheckProgramType::ALL
3506  config.type = CollisionEvaluatorType::LVS_DISCRETE;
3507  config.check_program_mode = CollisionCheckProgramType::ALL;
3508  std::vector<tesseract_collision::ContactResultMap> contacts;
3509  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj, config));
3510  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 1));
3511  EXPECT_EQ(contacts.at(0).size(), 2);
3512  EXPECT_EQ(contacts.at(1).size(), 2);
3513  EXPECT_EQ(contacts.at(2).size(), 3);
3514  EXPECT_EQ(contacts.at(3).size(), 2);
3515  EXPECT_EQ(getContactCount(contacts), static_cast<int>(285));
3522 
3523  contacts.clear();
3524  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj2, config));
3525  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 1));
3526  EXPECT_EQ(contacts.at(0).size(), 2);
3527  EXPECT_EQ(contacts.at(1).size(), 2);
3528  EXPECT_EQ(getContactCount(contacts), static_cast<int>(125));
3533 
3534  contacts.clear();
3535  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj3, config));
3536  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj3.rows() - 1));
3537  EXPECT_EQ(contacts.at(0).size(), 3);
3538  EXPECT_EQ(contacts.at(1).size(), 2);
3539  EXPECT_EQ(getContactCount(contacts), static_cast<int>(160));
3544  }
3545 
3546  { // CollisionEvaluatorType::LVS_DISCRETE && CollisionCheckProgramType::ALL_EXCEPT_END
3548  config.type = CollisionEvaluatorType::LVS_DISCRETE;
3549  config.check_program_mode = CollisionCheckProgramType::ALL_EXCEPT_END;
3550  std::vector<tesseract_collision::ContactResultMap> contacts;
3551  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj, config));
3552  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 1));
3553  EXPECT_EQ(contacts.at(0).size(), 2);
3554  EXPECT_EQ(contacts.at(1).size(), 2);
3555  EXPECT_EQ(contacts.at(2).size(), 3);
3556  EXPECT_EQ(contacts.at(3).size(), 2);
3557  EXPECT_EQ(getContactCount(contacts), static_cast<int>(285));
3564 
3565  contacts.clear();
3566  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj2, config));
3567  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 1));
3568  EXPECT_EQ(contacts.at(0).size(), 2);
3569  EXPECT_EQ(contacts.at(1).size(), 2);
3570  EXPECT_EQ(getContactCount(contacts), static_cast<int>(123));
3575 
3576  contacts.clear();
3577  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj3, config));
3578  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj3.rows() - 1));
3579  EXPECT_EQ(contacts.at(0).size(), 3);
3580  EXPECT_EQ(contacts.at(1).size(), 2);
3581  EXPECT_EQ(getContactCount(contacts), static_cast<int>(160));
3586  }
3587 
3588  { // CollisionEvaluatorType::LVS_DISCRETE && CollisionCheckProgramType::ALL_EXCEPT_START
3590  config.type = CollisionEvaluatorType::LVS_DISCRETE;
3591  config.check_program_mode = CollisionCheckProgramType::ALL_EXCEPT_START;
3592  std::vector<tesseract_collision::ContactResultMap> contacts;
3593  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj, config));
3594  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 1));
3595  EXPECT_EQ(contacts.at(0).size(), 2);
3596  EXPECT_EQ(contacts.at(1).size(), 2);
3597  EXPECT_EQ(contacts.at(2).size(), 3);
3598  EXPECT_EQ(contacts.at(3).size(), 2);
3599  EXPECT_EQ(getContactCount(contacts), static_cast<int>(285));
3606 
3607  contacts.clear();
3608  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj2, config));
3609  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 1));
3610  EXPECT_EQ(contacts.at(0).size(), 2);
3611  EXPECT_EQ(contacts.at(1).size(), 2);
3612  EXPECT_EQ(getContactCount(contacts), static_cast<int>(125));
3617 
3618  contacts.clear();
3619  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj3, config));
3620  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj3.rows() - 1));
3621  EXPECT_EQ(contacts.at(0).size(), 3);
3622  EXPECT_EQ(contacts.at(1).size(), 2);
3623  EXPECT_EQ(getContactCount(contacts), static_cast<int>(158));
3628  }
3629 
3630  { // CollisionEvaluatorType::LVS_DISCRETE && CollisionCheckProgramType::INTERMEDIATE_ONLY
3632  config.type = CollisionEvaluatorType::LVS_DISCRETE;
3633  config.check_program_mode = CollisionCheckProgramType::INTERMEDIATE_ONLY;
3634  std::vector<tesseract_collision::ContactResultMap> contacts;
3635  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj, config));
3636  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 1));
3637  EXPECT_EQ(contacts.at(0).size(), 2);
3638  EXPECT_EQ(contacts.at(1).size(), 2);
3639  EXPECT_EQ(contacts.at(2).size(), 3);
3640  EXPECT_EQ(contacts.at(3).size(), 2);
3641  EXPECT_EQ(getContactCount(contacts), static_cast<int>(285));
3648 
3649  contacts.clear();
3650  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj2, config));
3651  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 1));
3652  EXPECT_EQ(contacts.at(0).size(), 2);
3653  EXPECT_EQ(contacts.at(1).size(), 2);
3654  EXPECT_EQ(getContactCount(contacts), static_cast<int>(123));
3659 
3660  contacts.clear();
3661  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj3, config));
3662  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj3.rows() - 1));
3663  EXPECT_EQ(contacts.at(0).size(), 3);
3664  EXPECT_EQ(contacts.at(1).size(), 2);
3665  EXPECT_EQ(getContactCount(contacts), static_cast<int>(158));
3670  }
3671 
3672  { // CollisionEvaluatorType::LVS_DISCRETE && CollisionCheckProgramType::END_ONLY
3674  config.type = CollisionEvaluatorType::LVS_DISCRETE;
3675  config.check_program_mode = CollisionCheckProgramType::END_ONLY;
3676  std::vector<tesseract_collision::ContactResultMap> contacts;
3677  EXPECT_FALSE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj, config));
3678  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(1));
3679  EXPECT_EQ(contacts.at(0).size(), 0);
3680  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
3681 
3682  contacts.clear();
3683  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj2, config));
3684  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(1));
3685  EXPECT_EQ(contacts.at(0).size(), 2);
3686  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
3690 
3691  contacts.clear();
3692  EXPECT_FALSE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj3, config));
3693  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(1));
3694  EXPECT_EQ(contacts.at(0).size(), 0);
3695  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
3696  }
3697 
3698  { // CollisionEvaluatorType::LVS_DISCRETE && CollisionCheckProgramType::START_ONLY
3700  config.type = CollisionEvaluatorType::LVS_DISCRETE;
3701  config.check_program_mode = CollisionCheckProgramType::START_ONLY;
3702  std::vector<tesseract_collision::ContactResultMap> contacts;
3703  EXPECT_FALSE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj, config));
3704  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(1));
3705  EXPECT_EQ(contacts.at(0).size(), 0);
3706  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
3707 
3708  contacts.clear();
3709  EXPECT_FALSE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj2, config));
3710  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(1));
3711  EXPECT_EQ(contacts.at(0).size(), 0);
3712  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
3713 
3714  contacts.clear();
3715  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj3, config));
3716  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(1));
3717  EXPECT_EQ(contacts.at(0).size(), 2);
3718  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
3721  }
3722 
3723  {
3725  config.type = CollisionEvaluatorType::DISCRETE;
3726  std::vector<tesseract_collision::ContactResultMap> contacts;
3727  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *joint_group, traj, config));
3728  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows()));
3729  EXPECT_EQ(contacts.at(0).size(), 0);
3730  EXPECT_EQ(contacts.at(1).size(), 2);
3731  EXPECT_EQ(contacts.at(2).size(), 2);
3732  EXPECT_EQ(contacts.at(3).size(), 2);
3733  EXPECT_EQ(contacts.at(4).size(), 0);
3734  EXPECT_EQ(getContactCount(contacts), static_cast<int>(6));
3736 
3737  contacts.clear();
3738  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *joint_group, traj2, config));
3739  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows()));
3740  EXPECT_EQ(contacts.at(0).size(), 0);
3741  EXPECT_EQ(contacts.at(1).size(), 2);
3742  EXPECT_EQ(contacts.at(2).size(), 2);
3743  EXPECT_EQ(getContactCount(contacts), static_cast<int>(4));
3747  }
3748 
3749  {
3751  config.type = CollisionEvaluatorType::DISCRETE;
3753  std::vector<tesseract_collision::ContactResultMap> contacts;
3754  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *joint_group, traj, config));
3755  EXPECT_EQ(contacts.size(), 2);
3756  EXPECT_EQ(contacts.at(0).size(), 0);
3757  EXPECT_EQ(contacts.at(1).size(), 1);
3758  EXPECT_EQ(getContactCount(contacts), static_cast<int>(1));
3760 
3761  contacts.clear();
3762  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *joint_group, traj2, config));
3763  EXPECT_EQ(contacts.size(), 2);
3764  EXPECT_EQ(contacts.at(0).size(), 0);
3765  EXPECT_EQ(contacts.at(1).size(), 1);
3766  EXPECT_EQ(getContactCount(contacts), static_cast<int>(1));
3768  }
3769 
3770  {
3772  config.type = CollisionEvaluatorType::DISCRETE;
3773  std::vector<tesseract_collision::ContactResultMap> contacts;
3774  EXPECT_FALSE(checkTrajectory(contacts, *discrete_manager, *joint_group, joint_start_pos.transpose(), config));
3775  EXPECT_EQ(contacts.size(), 1);
3776  EXPECT_EQ(contacts.at(0).size(), 0);
3777  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
3779  }
3780 
3781  {
3783  config.type = CollisionEvaluatorType::LVS_DISCRETE;
3784  config.longest_valid_segment_length = std::numeric_limits<double>::max();
3785  std::vector<tesseract_collision::ContactResultMap> contacts;
3786  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *joint_group, traj, config));
3787  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 1));
3788  EXPECT_EQ(contacts.at(0).size(), 0);
3789  EXPECT_EQ(contacts.at(1).size(), 2);
3790  EXPECT_EQ(contacts.at(2).size(), 2);
3791  EXPECT_EQ(contacts.at(3).size(), 2);
3792  EXPECT_EQ(getContactCount(contacts), static_cast<int>(6));
3794 
3795  contacts.clear();
3796  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *joint_group, traj2, config));
3797  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 1));
3798  EXPECT_EQ(contacts.at(0).size(), 0);
3799  EXPECT_EQ(contacts.at(1).size(), 2);
3800  EXPECT_EQ(getContactCount(contacts), static_cast<int>(4));
3804  }
3805 
3806  {
3808  config.type = CollisionEvaluatorType::LVS_DISCRETE;
3810  config.longest_valid_segment_length = std::numeric_limits<double>::max();
3811  std::vector<tesseract_collision::ContactResultMap> contacts;
3812  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *joint_group, traj, config));
3813  EXPECT_EQ(contacts.size(), 2);
3814  EXPECT_EQ(contacts.at(0).size(), 0);
3815  EXPECT_EQ(contacts.at(1).size(), 1);
3816  EXPECT_EQ(getContactCount(contacts), static_cast<int>(1));
3818 
3819  contacts.clear();
3820  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *joint_group, traj2, config));
3821  EXPECT_EQ(contacts.size(), 2);
3822  EXPECT_EQ(contacts.at(0).size(), 0);
3823  EXPECT_EQ(contacts.at(1).size(), 1);
3824  EXPECT_EQ(getContactCount(contacts), static_cast<int>(1));
3826  }
3827 
3828  {
3830  config.type = CollisionEvaluatorType::LVS_DISCRETE;
3831  std::vector<tesseract_collision::ContactResultMap> contacts;
3832  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *joint_group, traj, config));
3833  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 1));
3834  EXPECT_EQ(contacts.at(0).size(), 2);
3835  EXPECT_EQ(contacts.at(1).size(), 2);
3836  EXPECT_EQ(contacts.at(2).size(), 3);
3837  EXPECT_EQ(contacts.at(3).size(), 2);
3838  EXPECT_EQ(getContactCount(contacts), static_cast<int>(285));
3842 
3843  contacts.clear();
3844  EXPECT_TRUE(checkTrajectory(contacts, *discrete_manager, *joint_group, traj2, config));
3845  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 1));
3846  EXPECT_EQ(contacts.at(0).size(), 2);
3847  EXPECT_EQ(contacts.at(1).size(), 2);
3848  EXPECT_EQ(getContactCount(contacts), static_cast<int>(125));
3853  }
3854 
3855  { // CollisionEvaluatorType::CONTINUOUS && CollisionCheckProgramType::ALL
3857  config.type = CollisionEvaluatorType::CONTINUOUS;
3858  config.check_program_mode = CollisionCheckProgramType::ALL;
3859  std::vector<tesseract_collision::ContactResultMap> contacts;
3860  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj, config));
3861  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 1));
3862  EXPECT_EQ(contacts.at(0).size(), 2);
3863  EXPECT_EQ(contacts.at(1).size(), 2);
3864  EXPECT_EQ(contacts.at(2).size(), 3);
3865  EXPECT_EQ(contacts.at(3).size(), 2);
3867  EXPECT_EQ(getContactCount(contacts), static_cast<int>(9));
3871 
3872  contacts.clear();
3873  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj2, config));
3874  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 1));
3875  EXPECT_EQ(contacts.at(0).size(), 2);
3876  EXPECT_EQ(contacts.at(1).size(), 2);
3877  EXPECT_EQ(getContactCount(contacts), static_cast<int>(4));
3881 
3882  contacts.clear();
3883  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj3, config));
3884  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj3.rows() - 1));
3885  EXPECT_EQ(contacts.at(0).size(), 3);
3886  EXPECT_EQ(contacts.at(1).size(), 2);
3887  EXPECT_EQ(getContactCount(contacts), static_cast<int>(5));
3891  }
3892 
3893  { // CollisionEvaluatorType::CONTINUOUS && CollisionCheckProgramType::ALL_EXCEPT_END
3895  config.type = CollisionEvaluatorType::CONTINUOUS;
3896  config.check_program_mode = CollisionCheckProgramType::ALL_EXCEPT_END;
3897  std::vector<tesseract_collision::ContactResultMap> contacts;
3898  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj, config));
3899  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 2));
3900  EXPECT_EQ(contacts.at(0).size(), 2);
3901  EXPECT_EQ(contacts.at(1).size(), 2);
3902  EXPECT_EQ(contacts.at(2).size(), 3);
3904  EXPECT_EQ(getContactCount(contacts), static_cast<int>(7));
3908 
3909  contacts.clear();
3910  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj2, config));
3911  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 2));
3912  EXPECT_EQ(contacts.at(0).size(), 2);
3913  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
3917 
3918  contacts.clear();
3919  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj3, config));
3920  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj3.rows() - 2));
3921  EXPECT_EQ(contacts.at(0).size(), 3);
3922  EXPECT_EQ(getContactCount(contacts), static_cast<int>(3));
3926  }
3927 
3928  { // CollisionEvaluatorType::CONTINUOUS && CollisionCheckProgramType::ALL_EXCEPT_START
3930  config.type = CollisionEvaluatorType::CONTINUOUS;
3931  config.check_program_mode = CollisionCheckProgramType::ALL_EXCEPT_START;
3932  std::vector<tesseract_collision::ContactResultMap> contacts;
3933  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj, config));
3934  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 1));
3935  EXPECT_EQ(contacts.at(0).size(), 0);
3936  EXPECT_EQ(contacts.at(1).size(), 2);
3937  EXPECT_EQ(contacts.at(2).size(), 3);
3938  EXPECT_EQ(contacts.at(3).size(), 2);
3940  EXPECT_EQ(getContactCount(contacts), static_cast<int>(7));
3943 
3944  contacts.clear();
3945  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj2, config));
3946  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 1));
3947  EXPECT_EQ(contacts.at(0).size(), 0);
3948  EXPECT_EQ(contacts.at(1).size(), 2);
3949  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
3953 
3954  contacts.clear();
3955  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj3, config));
3956  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj3.rows() - 1));
3957  EXPECT_EQ(contacts.at(0).size(), 0);
3958  EXPECT_EQ(contacts.at(1).size(), 2);
3959  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
3962  }
3963 
3964  { // CollisionEvaluatorType::CONTINUOUS && CollisionCheckProgramType::INTERMEDIATE_ONLY
3966  config.type = CollisionEvaluatorType::CONTINUOUS;
3967  config.check_program_mode = CollisionCheckProgramType::INTERMEDIATE_ONLY;
3968  std::vector<tesseract_collision::ContactResultMap> contacts;
3969  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj, config));
3970  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 2));
3971  EXPECT_EQ(contacts.at(0).size(), 0);
3972  EXPECT_EQ(contacts.at(1).size(), 2);
3973  EXPECT_EQ(contacts.at(2).size(), 3);
3974  EXPECT_EQ(getContactCount(contacts), static_cast<int>(5));
3978 
3979  contacts.clear();
3980  EXPECT_FALSE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj2, config));
3981  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 2));
3982  EXPECT_EQ(contacts.at(0).size(), 0);
3983  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
3984 
3985  contacts.clear();
3986  EXPECT_FALSE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj3, config));
3987  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj3.rows() - 2));
3988  EXPECT_EQ(contacts.at(0).size(), 0);
3989  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
3990  }
3991 
3992  { // CollisionEvaluatorType::CONTINUOUS && CollisionCheckProgramType::END_ONLY
3994  config.type = CollisionEvaluatorType::CONTINUOUS;
3995  config.check_program_mode = CollisionCheckProgramType::END_ONLY;
3996  std::vector<tesseract_collision::ContactResultMap> contacts;
3997  EXPECT_FALSE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj, config));
3998  EXPECT_EQ(contacts.size(), 1);
3999  EXPECT_EQ(contacts.at(0).size(), 0);
4000  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
4001 
4002  contacts.clear();
4003  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj2, config));
4004  EXPECT_EQ(contacts.size(), 1);
4005  EXPECT_EQ(contacts.at(0).size(), 2);
4006  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
4007 
4008  contacts.clear();
4009  EXPECT_FALSE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj3, config));
4010  EXPECT_EQ(contacts.size(), 1);
4011  EXPECT_EQ(contacts.at(0).size(), 0);
4012  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
4013  }
4014 
4015  { // CollisionEvaluatorType::CONTINUOUS && CollisionCheckProgramType::START_ONLY
4017  config.type = CollisionEvaluatorType::CONTINUOUS;
4018  config.check_program_mode = CollisionCheckProgramType::START_ONLY;
4019  std::vector<tesseract_collision::ContactResultMap> contacts;
4020  EXPECT_FALSE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj, config));
4021  EXPECT_EQ(contacts.size(), 1);
4022  EXPECT_EQ(contacts.at(0).size(), 0);
4023  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
4024 
4025  contacts.clear();
4026  EXPECT_FALSE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj2, config));
4027  EXPECT_EQ(contacts.size(), 1);
4028  EXPECT_EQ(contacts.at(0).size(), 0);
4029  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
4030 
4031  contacts.clear();
4032  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj3, config));
4033  EXPECT_EQ(contacts.size(), 1);
4034  EXPECT_EQ(contacts.at(0).size(), 2);
4035  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
4036  }
4037 
4038  {
4040  config.type = CollisionEvaluatorType::CONTINUOUS;
4042  std::vector<tesseract_collision::ContactResultMap> contacts;
4043  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj, config));
4044  EXPECT_EQ(contacts.size(), 1);
4045  EXPECT_EQ(contacts.at(0).size(), 1);
4046  EXPECT_EQ(getContactCount(contacts), static_cast<int>(1));
4049 
4050  contacts.clear();
4051  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj2, config));
4052  EXPECT_EQ(contacts.size(), 1);
4053  EXPECT_EQ(contacts.at(0).size(), 1);
4054  EXPECT_EQ(getContactCount(contacts), static_cast<int>(1));
4057  }
4058 
4059  { // CollisionEvaluatorType::LVS_CONTINUOUS && CollisionCheckProgramType::ALL
4061  config.type = CollisionEvaluatorType::LVS_CONTINUOUS;
4062  config.longest_valid_segment_length = std::numeric_limits<double>::max();
4063  config.check_program_mode = CollisionCheckProgramType::ALL;
4064  std::vector<tesseract_collision::ContactResultMap> contacts;
4065  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj, config));
4066  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 1));
4067  EXPECT_EQ(contacts.at(0).size(), 2);
4068  EXPECT_EQ(contacts.at(1).size(), 2);
4069  EXPECT_EQ(contacts.at(2).size(), 3);
4070  EXPECT_EQ(contacts.at(3).size(), 2);
4072  EXPECT_EQ(getContactCount(contacts), static_cast<int>(9));
4076 
4077  contacts.clear();
4078  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj2, config));
4079  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 1));
4080  EXPECT_EQ(contacts.at(0).size(), 2);
4081  EXPECT_EQ(contacts.at(1).size(), 2);
4082  EXPECT_EQ(getContactCount(contacts), static_cast<int>(4));
4086 
4087  contacts.clear();
4088  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj3, config));
4089  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj3.rows() - 1));
4090  EXPECT_EQ(contacts.at(0).size(), 3);
4091  EXPECT_EQ(contacts.at(1).size(), 2);
4092  EXPECT_EQ(getContactCount(contacts), static_cast<int>(5));
4096  }
4097 
4098  { // CollisionEvaluatorType::LVS_CONTINUOUS && CollisionCheckProgramType::ALL_EXCEPT_END
4100  config.type = CollisionEvaluatorType::LVS_CONTINUOUS;
4101  config.longest_valid_segment_length = std::numeric_limits<double>::max();
4102  config.check_program_mode = CollisionCheckProgramType::ALL_EXCEPT_END;
4103  std::vector<tesseract_collision::ContactResultMap> contacts;
4104  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj, config));
4105  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 2));
4106  EXPECT_EQ(contacts.at(0).size(), 2);
4107  EXPECT_EQ(contacts.at(1).size(), 2);
4108  EXPECT_EQ(contacts.at(2).size(), 3);
4110  EXPECT_EQ(getContactCount(contacts), static_cast<int>(7));
4114 
4115  contacts.clear();
4116  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj2, config));
4117  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 2));
4118  EXPECT_EQ(contacts.at(0).size(), 2);
4119  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
4123 
4124  contacts.clear();
4125  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj3, config));
4126  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj3.rows() - 2));
4127  EXPECT_EQ(contacts.at(0).size(), 3);
4128  EXPECT_EQ(getContactCount(contacts), static_cast<int>(3));
4132  }
4133 
4134  { // CollisionEvaluatorType::LVS_CONTINUOUS && CollisionCheckProgramType::ALL_EXCEPT_START
4136  config.type = CollisionEvaluatorType::LVS_CONTINUOUS;
4137  config.longest_valid_segment_length = std::numeric_limits<double>::max();
4138  config.check_program_mode = CollisionCheckProgramType::ALL_EXCEPT_START;
4139  std::vector<tesseract_collision::ContactResultMap> contacts;
4140  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj, config));
4141  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 1));
4142  EXPECT_EQ(contacts.at(0).size(), 0);
4143  EXPECT_EQ(contacts.at(1).size(), 2);
4144  EXPECT_EQ(contacts.at(2).size(), 3);
4145  EXPECT_EQ(contacts.at(3).size(), 2);
4147  EXPECT_EQ(getContactCount(contacts), static_cast<int>(7));
4150 
4151  contacts.clear();
4152  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj2, config));
4153  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 1));
4154  EXPECT_EQ(contacts.at(0).size(), 0);
4155  EXPECT_EQ(contacts.at(1).size(), 2);
4156  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
4160 
4161  contacts.clear();
4162  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj3, config));
4163  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj3.rows() - 1));
4164  EXPECT_EQ(contacts.at(0).size(), 0);
4165  EXPECT_EQ(contacts.at(1).size(), 2);
4166  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
4169  }
4170 
4171  { // CollisionEvaluatorType::LVS_CONTINUOUS && CollisionCheckProgramType::INTERMEDIATE_ONLY
4173  config.type = CollisionEvaluatorType::LVS_CONTINUOUS;
4174  config.longest_valid_segment_length = std::numeric_limits<double>::max();
4175  config.check_program_mode = CollisionCheckProgramType::INTERMEDIATE_ONLY;
4176  std::vector<tesseract_collision::ContactResultMap> contacts;
4177  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj, config));
4178  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 2));
4179  EXPECT_EQ(contacts.at(0).size(), 0);
4180  EXPECT_EQ(contacts.at(1).size(), 2);
4181  EXPECT_EQ(contacts.at(2).size(), 3);
4182  EXPECT_EQ(getContactCount(contacts), static_cast<int>(5));
4186 
4187  contacts.clear();
4188  EXPECT_FALSE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj2, config));
4189  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 2));
4190  EXPECT_EQ(contacts.at(0).size(), 0);
4191  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
4192 
4193  contacts.clear();
4194  EXPECT_FALSE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj3, config));
4195  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj3.rows() - 2));
4196  EXPECT_EQ(contacts.at(0).size(), 0);
4197  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
4198  }
4199 
4200  { // CollisionEvaluatorType::LVS_CONTINUOUS && CollisionCheckProgramType::END_ONLY
4202  config.type = CollisionEvaluatorType::LVS_CONTINUOUS;
4203  config.longest_valid_segment_length = std::numeric_limits<double>::max();
4204  config.check_program_mode = CollisionCheckProgramType::END_ONLY;
4205  std::vector<tesseract_collision::ContactResultMap> contacts;
4206  EXPECT_FALSE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj, config));
4207  EXPECT_EQ(contacts.size(), 1);
4208  EXPECT_EQ(contacts.at(0).size(), 0);
4209  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
4210 
4211  contacts.clear();
4212  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj2, config));
4213  EXPECT_EQ(contacts.size(), 1);
4214  EXPECT_EQ(contacts.at(0).size(), 2);
4215  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
4216 
4217  contacts.clear();
4218  EXPECT_FALSE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj3, config));
4219  EXPECT_EQ(contacts.size(), 1);
4220  EXPECT_EQ(contacts.at(0).size(), 0);
4221  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
4222  }
4223 
4224  { // CollisionEvaluatorType::LVS_CONTINUOUS && CollisionCheckProgramType::START_ONLY
4226  config.type = CollisionEvaluatorType::LVS_CONTINUOUS;
4227  config.longest_valid_segment_length = std::numeric_limits<double>::max();
4228  config.check_program_mode = CollisionCheckProgramType::START_ONLY;
4229  std::vector<tesseract_collision::ContactResultMap> contacts;
4230  EXPECT_FALSE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj, config));
4231  EXPECT_EQ(contacts.size(), 1);
4232  EXPECT_EQ(contacts.at(0).size(), 0);
4233  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
4234 
4235  contacts.clear();
4236  EXPECT_FALSE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj2, config));
4237  EXPECT_EQ(contacts.size(), 1);
4238  EXPECT_EQ(contacts.at(0).size(), 0);
4239  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
4240 
4241  contacts.clear();
4242  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj3, config));
4243  EXPECT_EQ(contacts.size(), 1);
4244  EXPECT_EQ(contacts.at(0).size(), 2);
4245  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
4246  }
4247 
4248  {
4250  config.type = CollisionEvaluatorType::LVS_CONTINUOUS;
4252  config.longest_valid_segment_length = std::numeric_limits<double>::max();
4253  std::vector<tesseract_collision::ContactResultMap> contacts;
4254  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj, config));
4255  EXPECT_EQ(contacts.size(), 1);
4256  EXPECT_EQ(contacts.at(0).size(), 1);
4257  EXPECT_EQ(getContactCount(contacts), static_cast<int>(1));
4260 
4261  contacts.clear();
4262  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj2, config));
4263  EXPECT_EQ(contacts.size(), 1);
4264  EXPECT_EQ(contacts.at(0).size(), 1);
4265  EXPECT_EQ(getContactCount(contacts), static_cast<int>(1));
4268  }
4269 
4270  { // CollisionEvaluatorType::LVS_CONTINUOUS && CollisionCheckProgramType::ALL
4272  config.type = CollisionEvaluatorType::LVS_CONTINUOUS;
4273  config.check_program_mode = CollisionCheckProgramType::ALL;
4274  std::vector<tesseract_collision::ContactResultMap> contacts;
4275  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj, config));
4276  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 1));
4277  EXPECT_EQ(contacts.at(0).size(), 2);
4278  EXPECT_EQ(contacts.at(1).size(), 2);
4279  EXPECT_EQ(contacts.at(2).size(), 3);
4280  EXPECT_EQ(contacts.at(3).size(), 2);
4282  EXPECT_EQ(getContactCount(contacts), static_cast<int>(288));
4286 
4287  contacts.clear();
4288  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj2, config));
4289  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 1));
4290  EXPECT_EQ(contacts.at(0).size(), 2);
4291  EXPECT_EQ(contacts.at(1).size(), 2);
4292  EXPECT_EQ(getContactCount(contacts), static_cast<int>(125));
4295 
4296  contacts.clear();
4297  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj3, config));
4298  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj3.rows() - 1));
4299  EXPECT_EQ(contacts.at(0).size(), 3);
4300  EXPECT_EQ(contacts.at(1).size(), 2);
4301  EXPECT_EQ(getContactCount(contacts), static_cast<int>(161));
4305  }
4306 
4307  { // CollisionEvaluatorType::LVS_CONTINUOUS && CollisionCheckProgramType::ALL_EXCEPT_END
4309  config.type = CollisionEvaluatorType::LVS_CONTINUOUS;
4310  config.check_program_mode = CollisionCheckProgramType::ALL_EXCEPT_END;
4311  std::vector<tesseract_collision::ContactResultMap> contacts;
4312  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj, config));
4313  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 1));
4314  EXPECT_EQ(contacts.at(0).size(), 2);
4315  EXPECT_EQ(contacts.at(1).size(), 2);
4316  EXPECT_EQ(contacts.at(2).size(), 3);
4317  EXPECT_EQ(contacts.at(3).size(), 2);
4319  EXPECT_EQ(getContactCount(contacts), static_cast<int>(288));
4323 
4324  contacts.clear();
4325  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj2, config));
4326  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 1));
4327  EXPECT_EQ(contacts.at(0).size(), 2);
4328  EXPECT_EQ(getContactCount(contacts), static_cast<int>(123));
4332 
4333  contacts.clear();
4334  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj3, config));
4335  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj3.rows() - 1));
4336  EXPECT_EQ(contacts.at(0).size(), 3);
4337  EXPECT_EQ(getContactCount(contacts), static_cast<int>(161));
4341  }
4342 
4343  { // CollisionEvaluatorType::LVS_CONTINUOUS && CollisionCheckProgramType::ALL_EXCEPT_START
4345  config.type = CollisionEvaluatorType::LVS_CONTINUOUS;
4346  config.check_program_mode = CollisionCheckProgramType::ALL_EXCEPT_START;
4347  std::vector<tesseract_collision::ContactResultMap> contacts;
4348  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj, config));
4349  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 1));
4350  EXPECT_EQ(contacts.at(0).size(), 2);
4351  EXPECT_EQ(contacts.at(1).size(), 2);
4352  EXPECT_EQ(contacts.at(2).size(), 3);
4353  EXPECT_EQ(contacts.at(3).size(), 2);
4355  EXPECT_EQ(getContactCount(contacts), static_cast<int>(288));
4359 
4360  contacts.clear();
4361  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj2, config));
4362  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 1));
4363  EXPECT_EQ(contacts.at(0).size(), 2);
4364  EXPECT_EQ(contacts.at(1).size(), 2);
4365  EXPECT_EQ(getContactCount(contacts), static_cast<int>(125));
4369 
4370  contacts.clear();
4371  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj3, config));
4372  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj3.rows() - 1));
4373  EXPECT_EQ(contacts.at(0).size(), 3);
4374  EXPECT_EQ(contacts.at(1).size(), 2);
4375  EXPECT_EQ(getContactCount(contacts), static_cast<int>(159));
4379  }
4380 
4381  { // CollisionEvaluatorType::LVS_CONTINUOUS && CollisionCheckProgramType::INTERMEDIATE_ONLY
4383  config.type = CollisionEvaluatorType::LVS_CONTINUOUS;
4384  config.check_program_mode = CollisionCheckProgramType::INTERMEDIATE_ONLY;
4385  std::vector<tesseract_collision::ContactResultMap> contacts;
4386  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj, config));
4387  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 1));
4388  EXPECT_EQ(contacts.at(0).size(), 2);
4389  EXPECT_EQ(contacts.at(1).size(), 2);
4390  EXPECT_EQ(contacts.at(2).size(), 3);
4391  EXPECT_EQ(contacts.at(3).size(), 2);
4392  EXPECT_EQ(getContactCount(contacts), static_cast<int>(288));
4396 
4397  contacts.clear();
4398  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj2, config));
4399  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 1));
4400  EXPECT_EQ(contacts.at(0).size(), 2);
4401  EXPECT_EQ(contacts.at(1).size(), 2);
4402  EXPECT_EQ(getContactCount(contacts), static_cast<int>(123));
4406 
4407  contacts.clear();
4408  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj3, config));
4409  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj3.rows() - 1));
4410  EXPECT_EQ(contacts.at(0).size(), 3);
4411  EXPECT_EQ(contacts.at(1).size(), 2);
4412  EXPECT_EQ(getContactCount(contacts), static_cast<int>(159));
4416  }
4417 
4418  { // CollisionEvaluatorType::LVS_CONTINUOUS && CollisionCheckProgramType::END_ONLY
4420  config.type = CollisionEvaluatorType::LVS_CONTINUOUS;
4421  config.check_program_mode = CollisionCheckProgramType::END_ONLY;
4422  std::vector<tesseract_collision::ContactResultMap> contacts;
4423  EXPECT_FALSE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj, config));
4424  EXPECT_EQ(contacts.size(), 1);
4425  EXPECT_EQ(contacts.at(0).size(), 0);
4426  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
4427 
4428  contacts.clear();
4429  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj2, config));
4430  EXPECT_EQ(contacts.size(), 1);
4431  EXPECT_EQ(contacts.at(0).size(), 2);
4432  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
4433 
4434  contacts.clear();
4435  EXPECT_FALSE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj3, config));
4436  EXPECT_EQ(contacts.size(), 1);
4437  EXPECT_EQ(contacts.at(0).size(), 0);
4438  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
4439  }
4440 
4441  { // CollisionEvaluatorType::LVS_CONTINUOUS && CollisionCheckProgramType::START_ONLY
4443  config.type = CollisionEvaluatorType::LVS_CONTINUOUS;
4444  config.check_program_mode = CollisionCheckProgramType::START_ONLY;
4445  std::vector<tesseract_collision::ContactResultMap> contacts;
4446  EXPECT_FALSE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj, config));
4447  EXPECT_EQ(contacts.size(), 1);
4448  EXPECT_EQ(contacts.at(0).size(), 0);
4449  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
4450 
4451  contacts.clear();
4452  EXPECT_FALSE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj2, config));
4453  EXPECT_EQ(contacts.size(), 1);
4454  EXPECT_EQ(contacts.at(0).size(), 0);
4455  EXPECT_EQ(getContactCount(contacts), static_cast<int>(0));
4456 
4457  contacts.clear();
4458  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj3, config));
4459  EXPECT_EQ(contacts.size(), 1);
4460  EXPECT_EQ(contacts.at(0).size(), 2);
4461  EXPECT_EQ(getContactCount(contacts), static_cast<int>(2));
4462  }
4463 
4464  {
4466  config.type = CollisionEvaluatorType::CONTINUOUS;
4467  std::vector<tesseract_collision::ContactResultMap> contacts;
4468  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *joint_group, traj, config));
4469  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 1));
4470  EXPECT_EQ(contacts.at(0).size(), 2);
4471  EXPECT_EQ(contacts.at(1).size(), 2);
4472  EXPECT_EQ(contacts.at(2).size(), 3);
4473  EXPECT_EQ(contacts.at(3).size(), 2);
4475  EXPECT_EQ(getContactCount(contacts), static_cast<int>(9));
4479 
4480  contacts.clear();
4481  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *joint_group, traj2, config));
4482  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 1));
4483  EXPECT_EQ(contacts.at(0).size(), 2);
4484  EXPECT_EQ(contacts.at(1).size(), 2);
4485  EXPECT_EQ(getContactCount(contacts), static_cast<int>(4));
4488  }
4489 
4490  {
4492  config.type = CollisionEvaluatorType::CONTINUOUS;
4494  std::vector<tesseract_collision::ContactResultMap> contacts;
4495  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *joint_group, traj, config));
4496  EXPECT_EQ(contacts.size(), 1);
4497  EXPECT_EQ(contacts.at(0).size(), 1);
4498  EXPECT_EQ(getContactCount(contacts), static_cast<int>(1));
4501 
4502  contacts.clear();
4503  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *joint_group, traj2, config));
4504  EXPECT_EQ(contacts.size(), 1);
4505  EXPECT_EQ(contacts.at(0).size(), 1);
4506  EXPECT_EQ(getContactCount(contacts), static_cast<int>(1));
4509  }
4510 
4511  {
4513  config.type = CollisionEvaluatorType::LVS_CONTINUOUS;
4514  config.longest_valid_segment_length = std::numeric_limits<double>::max();
4515  std::vector<tesseract_collision::ContactResultMap> contacts;
4516  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *joint_group, traj, config));
4517  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 1));
4518  EXPECT_EQ(contacts.at(0).size(), 2);
4519  EXPECT_EQ(contacts.at(1).size(), 2);
4520  EXPECT_EQ(contacts.at(2).size(), 3);
4521  EXPECT_EQ(contacts.at(3).size(), 2);
4523  EXPECT_EQ(getContactCount(contacts), static_cast<int>(9));
4527 
4528  contacts.clear();
4529  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *joint_group, traj2, config));
4530  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 1));
4531  EXPECT_EQ(contacts.at(0).size(), 2);
4532  EXPECT_EQ(contacts.at(1).size(), 2);
4533  EXPECT_EQ(getContactCount(contacts), static_cast<int>(4));
4536  }
4537 
4538  {
4540  config.type = CollisionEvaluatorType::LVS_CONTINUOUS;
4542  config.longest_valid_segment_length = std::numeric_limits<double>::max();
4543  std::vector<tesseract_collision::ContactResultMap> contacts;
4544  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *joint_group, traj, config));
4545  EXPECT_EQ(contacts.size(), 1);
4546  EXPECT_EQ(contacts.at(0).size(), 1);
4547  EXPECT_EQ(getContactCount(contacts), static_cast<int>(1));
4550 
4551  contacts.clear();
4552  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *joint_group, traj2, config));
4553  EXPECT_EQ(contacts.size(), 1);
4554  EXPECT_EQ(contacts.at(0).size(), 1);
4555  EXPECT_EQ(getContactCount(contacts), static_cast<int>(1));
4558  }
4559 
4560  {
4562  config.type = CollisionEvaluatorType::LVS_CONTINUOUS;
4563  std::vector<tesseract_collision::ContactResultMap> contacts;
4564  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *joint_group, traj, config));
4565  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj.rows() - 1));
4566  EXPECT_EQ(contacts.at(0).size(), 2);
4567  EXPECT_EQ(contacts.at(1).size(), 2);
4568  EXPECT_EQ(contacts.at(2).size(), 3);
4569  EXPECT_EQ(contacts.at(3).size(), 2);
4571  EXPECT_EQ(getContactCount(contacts), static_cast<int>(288));
4575 
4576  contacts.clear();
4577  EXPECT_TRUE(checkTrajectory(contacts, *continuous_manager, *joint_group, traj2, config));
4578  EXPECT_EQ(contacts.size(), static_cast<std::size_t>(traj2.rows() - 1));
4579  EXPECT_EQ(contacts.at(0).size(), 2);
4580  EXPECT_EQ(contacts.at(1).size(), 2);
4581  EXPECT_EQ(getContactCount(contacts), static_cast<int>(125));
4584  }
4585 
4586  // Failures
4587  {
4589  config.type = CollisionEvaluatorType::CONTINUOUS;
4590  std::vector<tesseract_collision::ContactResultMap> contacts;
4591  // NOLINTNEXTLINE
4592  EXPECT_ANY_THROW(checkTrajectory(contacts, *discrete_manager, *state_solver, joint_names, traj, config));
4593  }
4594  {
4596  config.type = CollisionEvaluatorType::CONTINUOUS;
4597  std::vector<tesseract_collision::ContactResultMap> contacts;
4598  // NOLINTNEXTLINE
4599  EXPECT_ANY_THROW(checkTrajectory(contacts, *discrete_manager, *joint_group, traj, config));
4600  }
4601  {
4603  config.type = CollisionEvaluatorType::DISCRETE;
4604  std::vector<tesseract_collision::ContactResultMap> contacts;
4605  // NOLINTNEXTLINE
4606  EXPECT_ANY_THROW(checkTrajectory(
4607  contacts, *discrete_manager, *state_solver, joint_names, tesseract_common::TrajArray(), config));
4608  }
4609  {
4611  config.type = CollisionEvaluatorType::DISCRETE;
4612  std::vector<tesseract_collision::ContactResultMap> contacts;
4613  // NOLINTNEXTLINE
4614  EXPECT_ANY_THROW(checkTrajectory(contacts, *discrete_manager, *joint_group, tesseract_common::TrajArray(), config));
4615  }
4616  {
4618  config.type = CollisionEvaluatorType::DISCRETE;
4619  std::vector<tesseract_collision::ContactResultMap> contacts;
4620  // NOLINTNEXTLINE
4621  EXPECT_ANY_THROW(checkTrajectory(contacts, *continuous_manager, *state_solver, joint_names, traj, config));
4622  }
4623  {
4625  config.type = CollisionEvaluatorType::DISCRETE;
4626  std::vector<tesseract_collision::ContactResultMap> contacts;
4627  // NOLINTNEXTLINE
4628  EXPECT_ANY_THROW(checkTrajectory(contacts, *continuous_manager, *joint_group, traj, config));
4629  }
4630  {
4632  config.type = CollisionEvaluatorType::CONTINUOUS;
4633  std::vector<tesseract_collision::ContactResultMap> contacts;
4634  // NOLINTNEXTLINE
4635  EXPECT_ANY_THROW(checkTrajectory(
4636  contacts, *continuous_manager, *state_solver, joint_names, tesseract_common::TrajArray(), config));
4637  }
4638  {
4640  config.type = CollisionEvaluatorType::CONTINUOUS;
4641  std::vector<tesseract_collision::ContactResultMap> contacts;
4642  // NOLINTNEXTLINE
4643  EXPECT_ANY_THROW(
4644  checkTrajectory(contacts, *continuous_manager, *joint_group, tesseract_common::TrajArray(), config));
4645  }
4646 }
4647 
4648 int main(int argc, char** argv)
4649 {
4650  testing::InitGoogleTest(&argc, argv);
4651 
4652  // Set to debug to also exercies debug code
4653  console_bridge::setLogLevel(console_bridge::LogLevel::CONSOLE_BRIDGE_LOG_DEBUG);
4654 
4655  return RUN_ALL_TESTS();
4656 }
tesseract_common::VectorIsometry3d
AlignedVector< Eigen::Isometry3d > VectorIsometry3d
getSceneGraph
SceneGraph::Ptr getSceneGraph(const tesseract_common::ResourceLocator &locator)
Definition: tesseract_environment_unit.cpp:57
graph.h
EnvironmentInitType
EnvironmentInitType
Definition: tesseract_environment_unit.cpp:158
tesseract_scene_graph::StateSolver::getJointNames
virtual std::vector< std::string > getJointNames() const=0
tesseract_srdf::SRDFModel::Ptr
std::shared_ptr< SRDFModel > Ptr
tesseract_srdf
tesseract_common::getTempPath
std::string getTempPath()
tesseract_environment
Definition: command.h:45
tesseract_collision::ContinuousContactManager::Ptr
std::shared_ptr< ContinuousContactManager > Ptr
tesseract_common::JointTrajectory::push_back
void push_back(const value_type &&x)
tesseract_scene_graph::StateSolver::getActiveJointNames
virtual std::vector< std::string > getActiveJointNames() const=0
getSRDFModelString
std::string getSRDFModelString(const tesseract_common::ResourceLocator &locator)
Definition: tesseract_environment_unit.cpp:83
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;})
kdl_state_solver.h
tesseract_scene_graph::Joint::clone
Joint clone() const
getEnvironment
Environment::Ptr getEnvironment(EnvironmentInitType init_type=EnvironmentInitType::OBJECT)
Definition: tesseract_environment_unit.cpp:165
tesseract_common::CollisionMarginPairOverrideType::REPLACE
@ REPLACE
manipulator_info.h
utils.h
runCompareStateSolver
void runCompareStateSolver(const StateSolver &base_solver, StateSolver &comp_solver)
Definition: tesseract_environment_unit.cpp:1922
tesseract_environment::Environment::Ptr
std::shared_ptr< Environment > Ptr
Definition: environment.h:78
tesseract_common::CollisionMarginPairOverrideType::MODIFY
@ MODIFY
getSubSceneGraph
SceneGraph::Ptr getSubSceneGraph()
Definition: tesseract_environment_unit.cpp:93
tesseract_scene_graph::JointLimits::ConstPtr
std::shared_ptr< const JointLimits > ConstPtr
resource_locator.h
tesseract_environment::Environment::getLinkTransform
Eigen::Isometry3d getLinkTransform(const std::string &link_name) const
Get the transform corresponding to the link.
Definition: environment.cpp:2656
tesseract_common::almostEqualRelativeAndAbs
bool almostEqualRelativeAndAbs(const Eigen::Ref< const Eigen::VectorXd > &v1, const Eigen::Ref< const Eigen::VectorXd > &v2, const Eigen::Ref< const Eigen::VectorXd > &max_diff, const Eigen::Ref< const Eigen::VectorXd > &max_rel_diff)
tesseract_common::ManipulatorInfo
getEnvironmentURDFOnly
Environment::Ptr getEnvironmentURDFOnly(EnvironmentInitType init_type)
Definition: tesseract_environment_unit.cpp:352
tesseract_collision::ContactRequest::type
ContactTestType type
tesseract_collision::ContinuousCollisionType::CCType_Time1
@ CCType_Time1
tesseract_scene_graph::StateSolver::getBaseLinkName
virtual std::string getBaseLinkName() const=0
tesseract_common::ResourceLocator::locateResource
virtual std::shared_ptr< Resource > locateResource(const std::string &url) const=0
joint.h
tesseract_scene_graph::Joint::parent_to_joint_origin_transform
Eigen::Isometry3d parent_to_joint_origin_transform
tesseract_scene_graph::StateSolver
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
#define TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
runCompareSceneStates
void runCompareSceneStates(const SceneState &base_state, const SceneState &compare_state)
Definition: tesseract_environment_unit.cpp:1900
hasProcessInterpolatedResultsTime0
bool hasProcessInterpolatedResultsTime0(const tesseract_collision::ContactResultMap &contacts)
Verify that the results contain Time0.
Definition: tesseract_environment_unit.cpp:2828
getSRDFModel
SRDFModel::Ptr getSRDFModel(const SceneGraph &scene_graph, const tesseract_common::ResourceLocator &locator)
Definition: tesseract_environment_unit.cpp:63
tesseract_scene_graph::SceneGraph
tesseract_environment::getActiveLinkNamesRecursive
void getActiveLinkNamesRecursive(std::vector< std::string > &active_links, const tesseract_scene_graph::SceneGraph &scene_graph, const std::string &current_link, bool active)
Get the active Link Names Recursively.
Definition: utils.cpp:54
tesseract_common::ContactManagersPluginInfo::discrete_plugin_infos
tesseract_common::PluginInfoContainer discrete_plugin_infos
tesseract_environment::Environment::getLinkTransforms
tesseract_common::VectorIsometry3d getLinkTransforms() const
Get all of the links transforms.
Definition: environment.cpp:2650
tesseract_collision::CollisionCheckConfig::type
CollisionEvaluatorType type
getSceneGraphString
std::string getSceneGraphString(const tesseract_common::ResourceLocator &locator)
Definition: tesseract_environment_unit.cpp:73
EXPECT_TRUE
#define EXPECT_TRUE(args)
tesseract_environment::Environment::getStateSolver
std::unique_ptr< tesseract_scene_graph::StateSolver > getStateSolver() const
Returns a clone of the environments state solver.
Definition: environment.cpp:2669
tesseract_scene_graph::StateSolver::getState
virtual SceneState getState() const=0
tesseract_common::CollisionMarginPairData::setCollisionMargin
void setCollisionMargin(const std::string &obj1, const std::string &obj2, double margin)
urdf_parser.h
tesseract_common::ContactManagersPluginInfo::continuous_plugin_infos
tesseract_common::PluginInfoContainer continuous_plugin_infos
tesseract_collision::CollisionCheckConfig::check_program_mode
CollisionCheckProgramType check_program_mode
tesseract_scene_graph::SceneState
tesseract_collision::ContinuousCollisionType::CCType_Between
@ CCType_Between
tesseract_common::JointState
command.h
This contains classes for recording operations applied to the environment for tracking changes....
tesseract_common::ManipulatorInfo::tcp_offset
std::variant< std::string, Eigen::Isometry3d > tcp_offset
discrete_contact_manager.h
tesseract_common::TrajArray
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > TrajArray
utils.h
Tesseract Environment Utility Functions.
tesseract_scene_graph::JointLimits::upper
double upper
tesseract_srdf::KinematicsInformation::link_groups
LinkGroups link_groups
main
int main(int argc, char **argv)
Definition: tesseract_environment_unit.cpp:4648
name
std::string name
tesseract_urdf::parseURDFFile
std::unique_ptr< tesseract_scene_graph::SceneGraph > parseURDFFile(const std::string &path, const tesseract_common::ResourceLocator &locator)
tesseract_common::AllowedCollisionMatrix::ConstPtr
std::shared_ptr< const AllowedCollisionMatrix > ConstPtr
tesseract_scene_graph::Joint::child_link_name
std::string child_link_name
tesseract_scene_graph::StateSolver::getRandomState
virtual SceneState getRandomState() const=0
tesseract_collision::ContactResultMap
tesseract_srdf::KinematicsInformation::group_names
EIGEN_MAKE_ALIGNED_OPERATOR_NEW GroupNames group_names
hasProcessInterpolatedResultsTime1
bool hasProcessInterpolatedResultsTime1(const tesseract_collision::ContactResultMap &contacts)
Verify that the results contain Time1.
Definition: tesseract_environment_unit.cpp:2848
tesseract_common::CollisionMarginPairOverrideType
CollisionMarginPairOverrideType
EXPECT_NEAR
#define EXPECT_NEAR(a, b, prec)
tesseract_collision::CollisionCheckConfig::contact_request
ContactRequest contact_request
tesseract_environment::Environment::ConstPtr
std::shared_ptr< const Environment > ConstPtr
Definition: environment.h:79
tesseract_collision::CollisionCheckConfig
M_PI_2
#define M_PI_2
tesseract_collision::ContinuousCollisionType::CCType_None
@ CCType_None
tesseract_common::JointTrajectory
tesseract_common::ContactManagersPluginInfo
getContactCount
long getContactCount(const std::vector< tesseract_collision::ContactResultMap > &contacts)
Get the total number of contacts.
Definition: tesseract_environment_unit.cpp:2865
tesseract_scene_graph::JointType::PRISMATIC
@ PRISMATIC
tesseract_scene_graph::Collision::Ptr
std::shared_ptr< Collision > Ptr
tesseract_scene_graph::SceneState::joints
std::unordered_map< std::string, double > joints
tesseract_common::ResourceLocator
kinematic_group.h
tesseract_environment::Environment::getState
tesseract_scene_graph::SceneState getState(const std::unordered_map< std::string, double > &joints, const tesseract_common::TransformMap &floating_joints={}) const
Get the state of the environment for a given set or subset of joint values.
Definition: environment.cpp:2500
tesseract_srdf::KinematicsInformation
tesseract_common::PluginInfoContainer::default_plugin
std::string default_plugin
tesseract_scene_graph::JointLimits::acceleration
double acceleration
sphere.h
tesseract_scene_graph::StateSolver::getStaticLinkNames
virtual std::vector< std::string > getStaticLinkNames() const=0
tesseract_environment::Environment
Definition: environment.h:71
tesseract_environment::Environment::getLinkNames
std::vector< std::string > getLinkNames() const
Get a vector of link names in the environment.
Definition: environment.cpp:2620
r
S r
TESSERACT_COMMON_IGNORE_WARNINGS_POP
state_solver.h
checkProcessInterpolatedResults
void checkProcessInterpolatedResults(const std::vector< tesseract_collision::ContactResultMap > &contacts)
Definition: tesseract_environment_unit.cpp:2760
tesseract_scene_graph::JointLimits
tesseract_collision::ContinuousCollisionType::CCType_Time0
@ CCType_Time0
continuous_contact_manager.h
tesseract_srdf::GroupNames
std::set< std::string > GroupNames
tesseract_scene_graph::JointType::CONTINUOUS
@ CONTINUOUS
tesseract_scene_graph::Joint
tesseract_scene_graph::StateSolver::getLinkNames
virtual std::vector< std::string > getLinkNames() const=0
tesseract_common::CollisionMarginPairData
tesseract_common::GeneralResourceLocator::locateResource
std::shared_ptr< Resource > locateResource(const std::string &url) const override
srdf_model.h
tesseract_srdf::KinematicsInformation::joint_groups
JointGroups joint_groups
tesseract_environment::EventCallbackFn
std::function< void(const Event &event)> EventCallbackFn
Definition: environment.h:69
tesseract_scene_graph::SceneState::joint_transforms
tesseract_common::TransformMap joint_transforms
tesseract_collision::ContactTestType::FIRST
@ FIRST
checkProcessInterpolatedResultsNoTime0
void checkProcessInterpolatedResultsNoTime0(const tesseract_collision::ContactResultMap &contacts)
Verify that no contact results is at Time0.
Definition: tesseract_environment_unit.cpp:2796
scene_state.h
tesseract_environment::Event
The event base class.
Definition: events.h:48
tesseract_common::AllowedCollisionMatrix
tesseract_scene_graph::StateSolver::Ptr
std::shared_ptr< StateSolver > Ptr
tesseract_scene_graph::Visual::Ptr
std::shared_ptr< Visual > Ptr
tcpCallback
Eigen::Isometry3d tcpCallback(const tesseract_common::ManipulatorInfo &mi)
Definition: tesseract_environment_unit.cpp:48
environment.h
tesseract_common::GeneralResourceLocator
tesseract_common::AllowedCollisionMatrix::addAllowedCollision
virtual void addAllowedCollision(const std::string &link_name1, const std::string &link_name2, const std::string &reason)
tesseract_common::CollisionMarginPairData::clear
void clear()
tesseract_scene_graph::Joint::type
JointType type
tesseract_environment::Environment::getRelativeLinkTransform
Eigen::Isometry3d getRelativeLinkTransform(const std::string &from_link_name, const std::string &to_link_name) const
Get transform between two links using the current state.
Definition: environment.cpp:2662
commands.h
This contains classes for recording operations applied to the environment for tracking changes....
tesseract_scene_graph::JointLimits::velocity
double velocity
tesseract_scene_graph::StateSolver::getActiveLinkNames
virtual std::vector< std::string > getActiveLinkNames() const=0
tesseract_collision
joint_group.h
tesseract_scene_graph::SceneState::link_transforms
tesseract_common::TransformMap link_transforms
types.h
macros.h
checkProcessInterpolatedResultsNoTime1
void checkProcessInterpolatedResultsNoTime1(const tesseract_collision::ContactResultMap &contacts)
Verify that no contact results is at Time1.
Definition: tesseract_environment_unit.cpp:2812
tesseract_scene_graph::SceneGraph::Ptr
std::shared_ptr< SceneGraph > Ptr
EnvironmentInitType::OBJECT
@ OBJECT
tesseract_scene_graph::JointLimits::lower
double lower
box.h
tesseract_environment::Environment::setState
void setState(const std::unordered_map< std::string, double > &joints, const tesseract_common::TransformMap &floating_joints={})
Set the current state of the environment.
Definition: environment.cpp:2464
tesseract_srdf::KinematicsInformation::chain_groups
ChainGroups chain_groups
tesseract_scene_graph
runGetLinkTransformsTest
void runGetLinkTransformsTest(Environment &env)
Definition: tesseract_environment_unit.cpp:125
tesseract_srdf::KinematicsInformation::group_states
GroupJointStates group_states
tesseract_collision::DiscreteContactManager::Ptr
std::shared_ptr< DiscreteContactManager > Ptr
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
EXPECT_EQ
#define EXPECT_EQ(a, b)
EnvironmentInitType::FILEPATH
@ FILEPATH
tesseract_environment::Commands
std::vector< std::shared_ptr< const Command > > Commands
Definition: command.h:110
EXPECT_FALSE
#define EXPECT_FALSE(args)
tesseract_scene_graph::JointType::FIXED
@ FIXED
EnvironmentInitType::STRING
@ STRING
TEST
TEST(TesseractEnvironmentUnit, EnvInitURDFOnlyUnit)
Definition: tesseract_environment_unit.cpp:422
tesseract_collision::CollisionCheckConfig::longest_valid_segment_length
double longest_valid_segment_length
tesseract_environment::checkTrajectory
bool checkTrajectory(std::vector< tesseract_collision::ContactResultMap > &contacts, tesseract_collision::ContinuousContactManager &manager, const tesseract_scene_graph::StateSolver &state_solver, const std::vector< std::string > &joint_names, const tesseract_common::TrajArray &traj, const tesseract_collision::CollisionCheckConfig &config)
Should perform a continuous collision check over the trajectory and stop on first collision.
Definition: utils.cpp:437
tesseract_common::CollisionMarginPairOverrideType::NONE
@ NONE


tesseract_environment
Author(s): Levi Armstrong
autogenerated on Sun May 18 2025 03:02:21