3 #include <gtest/gtest.h>
6 #include <yaml-cpp/yaml.h>
39 auto g = std::make_shared<SceneGraph>();
41 g->setName(
"abb_irb2400");
43 Link base_link(
"base_link");
44 Link link_1(
"link_1");
45 Link link_2(
"link_2");
46 Link link_3(
"link_3");
47 Link link_4(
"link_4");
48 Link link_5(
"link_5");
49 Link link_6(
"link_6");
52 EXPECT_TRUE(g->addLink(base_link));
53 EXPECT_TRUE(g->addLink(link_1));
54 EXPECT_TRUE(g->addLink(link_2));
55 EXPECT_TRUE(g->addLink(link_3));
56 EXPECT_TRUE(g->addLink(link_4));
57 EXPECT_TRUE(g->addLink(link_5));
58 EXPECT_TRUE(g->addLink(link_6));
59 EXPECT_TRUE(g->addLink(tool0));
63 EXPECT_TRUE(g->addLink(
Link(
"world")));
64 EXPECT_TRUE(g->addLink(
Link(
"axis_1")));
65 EXPECT_TRUE(g->addLink(
Link(
"axis_2")));
67 Joint joint_a(
"joint_axis_1");
68 joint_a.
axis = Eigen::Vector3d(0, 1, 0);
72 joint_a.
limits = std::make_shared<JointLimits>(-10, 10, 0, 5, 10, 20);
73 EXPECT_TRUE(g->addJoint(joint_a));
75 Joint joint_b(
"joint_axis_2");
76 joint_b.
axis = Eigen::Vector3d(1, 0, 0);
80 joint_b.
limits = std::make_shared<JointLimits>(-10, 10, 0, 5, 10, 20);
81 EXPECT_TRUE(g->addJoint(joint_b));
83 Joint joint_c(
"joint_base_link");
84 joint_c.
axis = Eigen::Vector3d(0, 1, 0);
88 EXPECT_TRUE(g->addJoint(joint_c));
92 EXPECT_TRUE(g->addLink(
Link(
"world")));
93 EXPECT_TRUE(g->addLink(
Link(
"axis_1")));
94 EXPECT_TRUE(g->addLink(
Link(
"axis_2")));
96 Joint joint_a(
"joint_axis_1");
98 joint_a.
axis = Eigen::Vector3d(0, 1, 0);
102 joint_a.
limits = std::make_shared<JointLimits>(-10, 10, 0, 5, 10, 20);
103 EXPECT_TRUE(g->addJoint(joint_a));
105 Joint joint_b(
"joint_axis_2");
107 joint_b.
axis = Eigen::Vector3d(1, 0, 0);
111 joint_b.
limits = std::make_shared<JointLimits>(-10, 10, 0, 5, 10, 20);
112 EXPECT_TRUE(g->addJoint(joint_b));
114 Joint joint_c(
"joint_base_link");
118 EXPECT_TRUE(g->addJoint(joint_c));
121 Joint joint_1(
"joint_1");
125 EXPECT_TRUE(g->addJoint(joint_1));
127 Joint joint_2(
"joint_2");
131 joint_2.
limits = std::make_shared<JointLimits>(-7, 7, 0, 5, 10, 20);
132 EXPECT_TRUE(g->addJoint(joint_2));
134 Joint joint_3(
"joint_3");
139 joint_3.
limits = std::make_shared<JointLimits>(-7, 7, 0, 5, 10, 20);
140 EXPECT_TRUE(g->addJoint(joint_3));
142 Joint joint_4(
"joint_4");
147 joint_4.
limits = std::make_shared<JointLimits>(-7, 7, 0, 5, 10, 20);
148 EXPECT_TRUE(g->addJoint(joint_4));
150 Joint joint_5(
"joint_5");
155 joint_5.
limits = std::make_shared<JointLimits>(-7, 7, 0, 5, 10, 20);
156 EXPECT_TRUE(g->addJoint(joint_5));
158 Joint joint_6(
"joint_6");
163 joint_6.
limits = std::make_shared<JointLimits>(-7, 7, 0, 5, 10, 20);
164 EXPECT_TRUE(g->addJoint(joint_6));
166 Joint joint_tool0(
"joint_tool0");
170 EXPECT_TRUE(g->addJoint(joint_tool0));
180 Link base_link(
"base_link");
181 Link link_1(
"link_1");
182 Link link_2(
"link_2");
183 Link link_3(
"link_3");
184 Link link_4(
"link_4");
185 Link link_5(
"link_5");
187 EXPECT_TRUE(g.
addLink(base_link));
188 EXPECT_TRUE(g.
addLink(link_1));
189 EXPECT_TRUE(g.
addLink(link_2));
190 EXPECT_TRUE(g.
addLink(link_3));
191 EXPECT_TRUE(g.
addLink(link_4));
192 EXPECT_TRUE(g.
addLink(link_5));
194 Joint base_joint(
"base_joint");
198 EXPECT_TRUE(g.
addJoint(base_joint));
200 Joint joint_1(
"joint_1");
204 joint_1.
limits = std::make_shared<JointLimits>(-7, 7, 0, 5, 10, 20);
207 Joint joint_2(
"joint_2");
212 joint_2.
limits = std::make_shared<JointLimits>(-7, 7, 0, 5, 10, 20);
215 Joint joint_3(
"joint_3");
220 joint_3.
limits = std::make_shared<JointLimits>(-7, 7, 0, 5, 10, 20);
223 Joint joint_4(
"joint_4");
228 joint_4.
limits = std::make_shared<JointLimits>(-7, 7, 0, 5, 10, 20);
234 TEST(TesseractSRDFUnit, LoadSRDFFileUnit)
241 std::string srdf_file =
242 locator.
locateResource(
"package://tesseract_support/urdf/lbr_iiwa_14_r820.srdf")->getFilePath();
246 g.
setName(
"kuka_lbr_iiwa_14_r820");
248 Link base_link(
"base_link");
249 Link link_1(
"link_1");
250 Link link_2(
"link_2");
251 Link link_3(
"link_3");
252 Link link_4(
"link_4");
253 Link link_5(
"link_5");
254 Link link_6(
"link_6");
255 Link link_7(
"link_7");
258 EXPECT_TRUE(g.
addLink(base_link));
259 EXPECT_TRUE(g.
addLink(link_1));
260 EXPECT_TRUE(g.
addLink(link_2));
261 EXPECT_TRUE(g.
addLink(link_3));
262 EXPECT_TRUE(g.
addLink(link_4));
263 EXPECT_TRUE(g.
addLink(link_5));
264 EXPECT_TRUE(g.
addLink(link_6));
265 EXPECT_TRUE(g.
addLink(link_7));
268 Joint joint_1(
"joint_a1");
274 Joint joint_2(
"joint_a2");
278 joint_2.
limits = std::make_shared<JointLimits>(-7, 7, 0, 5, 10, 20);
281 Joint joint_3(
"joint_a3");
286 joint_3.
limits = std::make_shared<JointLimits>(-7, 7, 0, 5, 10, 20);
289 Joint joint_4(
"joint_a4");
294 joint_4.
limits = std::make_shared<JointLimits>(-7, 7, 0, 5, 10, 20);
297 Joint joint_5(
"joint_a5");
302 joint_5.
limits = std::make_shared<JointLimits>(-7, 7, 0, 5, 10, 20);
305 Joint joint_6(
"joint_a6");
310 joint_6.
limits = std::make_shared<JointLimits>(-7, 7, 0, 5, 10, 20);
313 Joint joint_7(
"joint_a7");
318 joint_7.
limits = std::make_shared<JointLimits>(-7, 7, 0, 5, 10, 20);
321 Joint joint_tool0(
"joint_tool0");
325 EXPECT_TRUE(g.
addJoint(joint_tool0));
328 srdf.
initFile(g, srdf_file, locator);
329 EXPECT_EQ(srdf.
name,
"kuka_lbr_iiwa_14_r820");
339 EXPECT_TRUE(acm->isCollisionAllowed(
"link_1",
"link_2"));
342 EXPECT_FALSE(acm->isCollisionAllowed(
"base_link",
"link_5"));
346 EXPECT_FALSE(acm->isCollisionAllowed(
"link_1",
"link_2"));
349 EXPECT_EQ(acm->getAllAllowedCollisions().size(), 0);
352 TEST(TesseractSRDFUnit, TesseractSRDFModelUnit)
362 srdf.
name =
"test_srdf";
363 EXPECT_TRUE(srdf.
name ==
"test_srdf");
367 EXPECT_TRUE(chain_groups.empty());
369 chain_groups[
"manipulator_chain"] = { std::make_pair(
"base_link",
"link_5") };
374 EXPECT_TRUE(joint_groups.empty());
376 joint_groups[
"manipulator_joint"] = {
"joint_1",
"joint_2",
"joint_3",
"joint_4" };
381 EXPECT_TRUE(link_groups.empty());
382 link_groups[
"manipulator_link"] = {
"base_link",
"link_1",
"link_2",
"link_3",
"link_4",
"link_5" };
387 EXPECT_TRUE(group_state.empty());
389 joint_state[
"joint_1"] = 0;
390 joint_state[
"joint_2"] = 0;
391 joint_state[
"joint_3"] = 0;
392 joint_state[
"joint_4"] = 0;
393 group_state[
"manipulator_chain"][
"All Zeros"] = joint_state;
394 group_state[
"manipulator_joint"][
"All Zeros"] = joint_state;
395 group_state[
"manipulator_link"][
"All Zeros"] = joint_state;
400 EXPECT_TRUE(group_tcps.empty());
401 group_tcps[
"manipulator_chain"][
"laser"] = Eigen::Isometry3d::Identity();
402 group_tcps[
"manipulator_joint"][
"laser"] = Eigen::Isometry3d::Identity();
403 group_tcps[
"manipulator_link"][
"laser"] = Eigen::Isometry3d::Identity();
407 auto& acm = srdf.
acm;
408 EXPECT_TRUE(acm.getAllAllowedCollisions().empty());
409 acm.addAllowedCollision(
"link_1",
"link_3",
"Adjacent");
410 acm.addAllowedCollision(
"link_1",
"link_2",
"Adjacent");
411 acm.addAllowedCollision(
"link_2",
"link_3",
"Adjacent");
412 acm.addAllowedCollision(
"link_3",
"link_4",
"Adjacent");
413 acm.addAllowedCollision(
"link_4",
"link_5",
"Adjacent");
414 acm.addAllowedCollision(
"base_link",
"link_1",
"Adjacent");
415 EXPECT_FALSE(acm.getAllAllowedCollisions().empty());
422 EXPECT_TRUE(srdf_reload.
name ==
"test_srdf");
444 TEST(TesseractSRDFUnit, LoadSRDFFailureCasesUnit)
454 std::string xml_string =
455 R
"(<robot name="abb_irb2400" version="1.0.0">
456 <group name="manipulator">
457 <chain base_link="base_link" tip_link="tool0" />
463 EXPECT_EQ(srdf.name, "abb_irb2400");
470 std::string xml_string =
471 R
"(<robot name="abb_irb2400" version="1.0">
472 <group name="manipulator">
473 <chain base_link="base_link" tip_link="tool0" />
479 EXPECT_EQ(srdf.name, "abb_irb2400");
487 std::string xml_string =
488 R
"(<robot version="1.0.0">
489 <group name="manipulator">
490 <chain base_link="base_link" tip_link="tool0" />
495 EXPECT_ANY_THROW(srdf.initString(*g, xml_string, locator));
498 std::string xml_string =
499 R
"(<robot name="abb_irb2400" version="1 0 0">
500 <group name="manipulator">
501 <chain base_link="base_link" tip_link="tool0" />
506 EXPECT_ANY_THROW(srdf.initString(*g, xml_string, locator));
509 std::string xml_string =
510 R
"(<robot version="1.0.0">
511 <group name="manipulator">
512 <chain base_link="base_link" tip_link="tool0" />
517 EXPECT_ANY_THROW(srdf.initString(*g, xml_string, locator));
520 std::string xml_string =
521 R
"(<robot name="abb_irb2400" version="1 0 0">
522 <group name="manipulator">
523 <chain base_link="base_link" tip_link="tool0" />
528 EXPECT_ANY_THROW(srdf.initString(*g, xml_string, locator));
531 std::string xml_string =
532 R
"(<missing_robot name="abb_irb2400" version="1.0.0">
533 <group name="manipulator">
534 <chain base_link="base_link" tip_link="tool0" />
539 EXPECT_ANY_THROW(srdf.initString(*g, xml_string, locator));
543 EXPECT_ANY_THROW(srdf.
initFile(*g,
"/tmp/file_does_not_exist.srdf", locator));
550 std::shared_ptr<tesseract_common::Resource> locateResource(
const std::string& url)
const override final
552 std::filesystem::path mod_url(url);
553 if (!mod_url.is_absolute())
558 return std::make_shared<tesseract_common::SimpleLocatedResource>(
559 url, mod_url.string(), std::make_shared<TempResourceLocator>(*
this));
563 TEST(TesseractSRDFUnit, LoadSRDFSaveUnit)
572 std::string xml_string =
573 R
"(<robot name="abb_irb2400" version="1.0.0">
574 <group name="manipulator">
575 <chain base_link="base_link" tip_link="tool0" />
577 <group name="positioner">
578 <chain base_link="world" tip_link="base_link" />
580 <group name="gantry">
581 <chain base_link="world" tip_link="tool0" />
584 <group name="manipulator_joint">
585 <joint name="joint_1"/>
586 <joint name="joint_2"/>
587 <joint name="joint_3"/>
588 <joint name="joint_4"/>
589 <joint name="joint_5"/>
590 <joint name="joint_6"/>
591 <joint name="joint_tool0"/>
594 <group_state name="all-zeros" group="manipulator">
595 <joint name="joint_1" value="0"/>
596 <joint name="joint_2" value="0"/>
597 <joint name="joint_3" value="0"/>
598 <joint name="joint_4" value="0"/>
599 <joint name="joint_5" value="0"/>
600 <joint name="joint_6" value="0"/>
603 <group_tcps group="gantry">
604 <tcp name="laser" xyz="1 .1 1" rpy="0 1.57 0" />
605 <tcp name="welder" xyz=".1 1 .2" wxyz="1 0 0 0" />
608 <disable_collisions link1="base_link" link2="link_1" reason="Adjacent" />
609 <disable_collisions link1="base_link" link2="link_2" reason="Never" />
610 <disable_collisions link1="base_link" link2="link_3" reason="Never" />
612 <collision_margins default_margin="0.025">
613 <pair_margin link1="link_6" link2="link_5" margin="0.01"/>
614 <pair_margin link1="link_5" link2="link_4" margin="0.015"/>
618 std::string yaml_kin_plugins_string =
619 R"(kinematic_plugins:
622 default: KDLFwdKinChain
625 class: KDLFwdKinChainFactory
632 default: KDLInvKinChainLMA
635 class: KDLInvKinChainLMAFactory
641 class: KDLInvKinChainNRFactory
646 std::string yaml_cm_plugins_string =
647 R"(contact_manager_plugins:
651 - tesseract_collision_bullet_factories
652 - tesseract_collision_fcl_factories
654 default: BulletDiscreteBVHManager
656 BulletDiscreteBVHManager:
657 class: BulletDiscreteBVHManagerFactory
659 BulletDiscreteSimpleManager:
660 class: BulletDiscreteSimpleManagerFactory
661 FCLDiscreteBVHManager:
662 class: FCLDiscreteBVHManagerFactory
664 default: BulletCastBVHManager
666 BulletCastBVHManager:
667 class: BulletCastBVHManagerFactory
669 BulletCastSimpleManager:
670 class: BulletCastSimpleManagerFactory)";
672 std::string yaml_calibration_string =
697 srdf_save.initString(*g, xml_string, locator);
714 srdf.
initFile(*g, save_path, locator);
715 EXPECT_EQ(srdf.
name,
"abb_irb2400");
730 auto tcp_it = kin_info.
group_tcps.find(
"gantry");
731 EXPECT_TRUE(tcp_it != kin_info.
group_tcps.end());
732 EXPECT_EQ(tcp_it->second.size(), 2);
733 EXPECT_TRUE(tcp_it->second.find(
"laser") != tcp_it->second.end());
734 EXPECT_TRUE(tcp_it->second.find(
"welder") != tcp_it->second.end());
738 auto chain_gantry_it = kin_info.
chain_groups.find(
"gantry");
739 auto chain_manipulator_it = kin_info.
chain_groups.find(
"manipulator");
740 auto chain_positioner_it = kin_info.
chain_groups.find(
"positioner");
741 EXPECT_TRUE(chain_gantry_it != kin_info.
chain_groups.end());
742 EXPECT_TRUE(chain_manipulator_it != kin_info.
chain_groups.end());
743 EXPECT_TRUE(chain_positioner_it != kin_info.
chain_groups.end());
747 auto joint_manipulator_it = kin_info.
joint_groups.find(
"manipulator_joint");
748 EXPECT_TRUE(joint_manipulator_it != kin_info.
joint_groups.end());
752 auto group_state_it = kin_info.
group_states.find(
"manipulator");
753 EXPECT_TRUE(group_state_it != kin_info.
group_states.end());
754 EXPECT_EQ(group_state_it->second.size(), 1);
755 EXPECT_TRUE(group_state_it->second.find(
"all-zeros") != group_state_it->second.end());
758 EXPECT_TRUE(acm->isCollisionAllowed(
"base_link",
"link_1"));
759 EXPECT_TRUE(acm->isCollisionAllowed(
"base_link",
"link_2"));
760 EXPECT_TRUE(acm->isCollisionAllowed(
"base_link",
"link_3"));
770 yaml_calibration_string =
800 EXPECT_ANY_THROW(bad_srdf.
initFile(*g, save_path, locator));
803 TEST(TesseractSRDFUnit, LoadSRDFAllowedCollisionMatrixUnit)
811 std::string xml_string =
812 R
"(<robot name="abb_irb2400">
813 <disable_collisions link1="base_link" link2="link_1" reason="Adjacent" />
814 <disable_collisions link1="base_link" link2="link_2" reason="Never" />
815 <disable_collisions link1="base_link" link2="link_3" reason="Never" />
817 tinyxml2::XMLDocument xml_doc;
818 EXPECT_TRUE(xml_doc.Parse(xml_string.c_str()) == tinyxml2::XML_SUCCESS);
820 tinyxml2::XMLElement* element = xml_doc.FirstChildElement("robot");
821 EXPECT_TRUE(element !=
nullptr);
829 auto is_failure = [g](
const std::string& xml_string) {
830 tinyxml2::XMLDocument xml_doc;
831 EXPECT_TRUE(xml_doc.Parse(xml_string.c_str()) == tinyxml2::XML_SUCCESS);
833 tinyxml2::XMLElement* element = xml_doc.FirstChildElement(
"robot");
834 EXPECT_TRUE(element !=
nullptr);
840 catch (
const std::exception& e)
849 std::string xml_string =
850 R
"(<robot name="abb_irb2400">
851 <disable_collisions link2="link_1" reason="Adjacent" />
852 <disable_collisions link1="base_link" link2="link_2" reason="Never" />
853 <disable_collisions link1="base_link" link2="link_3" reason="Never" />
855 EXPECT_TRUE(is_failure(xml_string));
858 EXPECT_ANY_THROW(srdf_model.initString(*g, xml_string, locator));
861 std::string xml_string =
862 R
"(<robot name="abb_irb2400">
863 <disable_collisions link1="base_link" link2="link_1" reason="Adjacent" />
864 <disable_collisions link1="base_link" reason="Never" />
865 <disable_collisions link1="base_link" link2="link_3" reason="Never" />
867 EXPECT_TRUE(is_failure(xml_string));
870 EXPECT_ANY_THROW(srdf_model.initString(*g, xml_string, locator));
873 std::string xml_string =
874 R
"(<robot name="abb_irb2400">
875 <disable_collisions link1="base_link" link2="link_1" reason="Adjacent" />
876 <disable_collisions link1="base_link" link2="link_2" reason="Never" />
877 <disable_collisions link1="base_link" link2="link_3" />
879 EXPECT_FALSE(is_failure(xml_string));
882 EXPECT_NO_THROW(srdf_model.initString(*g, xml_string, locator));
885 std::string xml_string =
886 R
"(<robot name="abb_irb2400">
887 <disable_collisions link1="missing_link" link2="link_1" reason="Adjacent" />
888 <disable_collisions link1="base_link" link2="link_2" reason="Never" />
889 <disable_collisions link1="base_link" link2="link_3" reason="Never" />
891 EXPECT_FALSE(is_failure(xml_string));
894 EXPECT_NO_THROW(srdf_model.initString(*g, xml_string, locator));
897 std::string xml_string =
898 R
"(<robot name="abb_irb2400">
899 <disable_collisions link1="base_link" link2="link_1" reason="Adjacent" />
900 <disable_collisions link1="base_link" link2="missing_link" reason="Never" />
901 <disable_collisions link1="base_link" link2="link_3" reason="Never" />
903 EXPECT_FALSE(is_failure(xml_string));
906 EXPECT_NO_THROW(srdf_model.initString(*g, xml_string, locator));
909 std::string xml_string =
910 R
"(<robot name="abb_irb2400">
911 <disable_collisions link1="base_link" link2="link_1" reason="Adjacent" />
912 <disable_collisions link1="base_link" link2="missing_link" reason="Never" />
913 <disable_collisions link1="base_link" link2="link_3" reason="2.335" />
915 EXPECT_FALSE(is_failure(xml_string));
918 EXPECT_NO_THROW(srdf_model.initString(*g, xml_string, locator));
922 TEST(TesseractSRDFUnit, SRDFChainGroupUnit)
930 std::string str = R
"(<robot name="abb_irb2400">
931 <group name="manipulator">
932 <chain base_link="base_link" tip_link="tool0" />
936 tinyxml2::XMLDocument xml_doc;
937 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
939 tinyxml2::XMLElement* element = xml_doc.FirstChildElement("robot");
940 EXPECT_TRUE(element !=
nullptr);
942 auto [group_names, chain_groups, joint_groups, link_groups] =
943 parseGroups(*g, element, std::array<int, 3>({ 1, 0, 0 }));
945 EXPECT_EQ(group_names.size(), 1);
946 EXPECT_EQ(*group_names.begin(),
"manipulator");
947 EXPECT_EQ(chain_groups.size(), 1);
948 EXPECT_TRUE(joint_groups.empty());
949 EXPECT_TRUE(link_groups.empty());
950 EXPECT_EQ(chain_groups[
"manipulator"].size(), 1);
951 EXPECT_EQ(chain_groups[
"manipulator"][0].first,
"base_link");
952 EXPECT_EQ(chain_groups[
"manipulator"][0].second,
"tool0");
955 auto is_failure = [g](
const std::string& xml_string) {
956 tinyxml2::XMLDocument xml_doc;
957 EXPECT_TRUE(xml_doc.Parse(xml_string.c_str()) == tinyxml2::XML_SUCCESS);
959 tinyxml2::XMLElement* element = xml_doc.FirstChildElement(
"robot");
960 EXPECT_TRUE(element !=
nullptr);
964 parseGroups(*g, element, std::array<int, 3>({ 1, 0, 0 }));
966 catch (
const std::exception& e)
975 std::string str = R
"(<robot name="abb_irb2400">
977 <chain base_link="base_link" tip_link="tool0" />
980 EXPECT_TRUE(is_failure(str));
983 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
986 std::string str = R
"(<robot name="abb_irb2400">
987 <group name="manipulator"/>
989 EXPECT_TRUE(is_failure(str));
992 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
995 std::string str = R
"(<robot name="abb_irb2400">
996 <group name="manipulator">
997 <chain tip_link="tool0" />
1000 EXPECT_TRUE(is_failure(str));
1003 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
1006 std::string str = R
"(<robot name="abb_irb2400">
1007 <group name="manipulator">
1008 <chain base_link="base_link" />
1011 EXPECT_TRUE(is_failure(str));
1014 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
1017 std::string str = R
"(<robot name="abb_irb2400">
1018 <group name="manipulator">
1019 <chain base_link="missing_link" tip_link="tool0" />
1022 EXPECT_TRUE(is_failure(str));
1025 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
1028 std::string str = R
"(<robot name="abb_irb2400">
1029 <group name="manipulator">
1030 <chain base_link="base_link" tip_link="missing_link" />
1033 EXPECT_TRUE(is_failure(str));
1036 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
1040 TEST(TesseractSRDFUnit, SRDFJointGroupUnit)
1048 std::string str = R
"(<robot name="abb_irb2400">
1049 <group name="manipulator">
1050 <joint name="joint_1"/>
1051 <joint name="joint_2"/>
1052 <joint name="joint_3"/>
1053 <joint name="joint_4"/>
1054 <joint name="joint_5"/>
1055 <joint name="joint_6"/>
1056 <joint name="joint_tool0"/>
1060 tinyxml2::XMLDocument xml_doc;
1061 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
1063 tinyxml2::XMLElement* element = xml_doc.FirstChildElement("robot");
1064 EXPECT_TRUE(element !=
nullptr);
1066 auto [group_names, chain_groups, joint_groups, link_groups] =
1067 parseGroups(*g, element, std::array<int, 3>({ 1, 0, 0 }));
1069 EXPECT_EQ(group_names.size(), 1);
1070 EXPECT_EQ(*group_names.begin(),
"manipulator");
1071 EXPECT_TRUE(chain_groups.empty());
1072 EXPECT_EQ(joint_groups.size(), 1);
1073 EXPECT_TRUE(link_groups.empty());
1074 EXPECT_EQ(joint_groups[
"manipulator"].size(), 7);
1077 auto is_failure = [g](
const std::string& xml_string) {
1078 tinyxml2::XMLDocument xml_doc;
1079 EXPECT_TRUE(xml_doc.Parse(xml_string.c_str()) == tinyxml2::XML_SUCCESS);
1081 tinyxml2::XMLElement* element = xml_doc.FirstChildElement(
"robot");
1082 EXPECT_TRUE(element !=
nullptr);
1086 parseGroups(*g, element, std::array<int, 3>({ 1, 0, 0 }));
1088 catch (
const std::exception& e)
1097 std::string str = R
"(<robot name="abb_irb2400">
1099 <joint name="joint_1"/>
1103 EXPECT_TRUE(is_failure(str));
1106 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
1109 std::string str = R
"(<robot name="abb_irb2400">
1110 <group name="manipulator"/>
1113 EXPECT_TRUE(is_failure(str));
1116 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
1119 std::string str = R
"(<robot name="abb_irb2400">
1120 <group name="manipulator">
1125 EXPECT_TRUE(is_failure(str));
1128 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
1132 std::string str = R
"(<robot name="abb_irb2400">
1133 <group name="manipulator">
1134 <joint name="missing_joint"/>
1138 EXPECT_TRUE(is_failure(str));
1141 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
1145 TEST(TesseractSRDFUnit, SRDFLinkGroupUnit)
1153 std::string str = R
"(<robot name="abb_irb2400">
1154 <group name="manipulator">
1155 <link name="base_link"/>
1156 <link name="link_1"/>
1157 <link name="link_2"/>
1158 <link name="link_3"/>
1159 <link name="link_4"/>
1160 <link name="link_5"/>
1161 <link name="link_6"/>
1162 <link name="tool0"/>
1166 tinyxml2::XMLDocument xml_doc;
1167 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
1169 tinyxml2::XMLElement* element = xml_doc.FirstChildElement("robot");
1170 EXPECT_TRUE(element !=
nullptr);
1172 auto [group_names, chain_groups, joint_groups, link_groups] =
1173 parseGroups(*g, element, std::array<int, 3>({ 1, 0, 0 }));
1175 EXPECT_EQ(group_names.size(), 1);
1176 EXPECT_EQ(*group_names.begin(),
"manipulator");
1177 EXPECT_TRUE(chain_groups.empty());
1178 EXPECT_TRUE(joint_groups.empty());
1179 EXPECT_EQ(link_groups.size(), 1);
1180 EXPECT_EQ(link_groups[
"manipulator"].size(), 8);
1183 auto is_failure = [g](
const std::string& xml_string) {
1184 tinyxml2::XMLDocument xml_doc;
1185 EXPECT_TRUE(xml_doc.Parse(xml_string.c_str()) == tinyxml2::XML_SUCCESS);
1187 tinyxml2::XMLElement* element = xml_doc.FirstChildElement(
"robot");
1188 EXPECT_TRUE(element !=
nullptr);
1192 parseGroups(*g, element, std::array<int, 3>({ 1, 0, 0 }));
1194 catch (
const std::exception& e)
1203 std::string str = R
"(<robot name="abb_irb2400">
1205 <link name="joint_1"/>
1209 EXPECT_TRUE(is_failure(str));
1212 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
1215 std::string str = R
"(<robot name="abb_irb2400">
1216 <group name="manipulator"/>
1219 EXPECT_TRUE(is_failure(str));
1222 std::string str = R
"(<robot name="abb_irb2400">
1223 <group name="manipulator">
1228 EXPECT_TRUE(is_failure(str));
1231 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
1234 std::string str = R
"(<robot name="abb_irb2400">
1235 <group name="manipulator">
1236 <link name="missing_link"/>
1240 EXPECT_TRUE(is_failure(str));
1243 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
1247 TEST(TesseractSRDFUnit, LoadSRDFGroupStatesUnit)
1255 std::string xml_string =
1256 R
"(<robot name="abb_irb2400">
1257 <group_state name="all-zeros" group="manipulator">
1258 <joint name="joint_1" value="0"/>
1259 <joint name="joint_2" value="0"/>
1260 <joint name="joint_3" value="0"/>
1261 <joint name="joint_4" value="0"/>
1262 <joint name="joint_5" value="0"/>
1263 <joint name="joint_6" value="0"/>
1266 tinyxml2::XMLDocument xml_doc;
1267 EXPECT_TRUE(xml_doc.Parse(xml_string.c_str()) == tinyxml2::XML_SUCCESS);
1269 tinyxml2::XMLElement* element = xml_doc.FirstChildElement("robot");
1270 EXPECT_TRUE(element !=
nullptr);
1274 EXPECT_EQ(group_states.size(), 1);
1276 auto it = group_states.find(
"manipulator");
1277 EXPECT_TRUE(it != group_states.end());
1279 auto it2 = it->second.find(
"all-zeros");
1280 EXPECT_TRUE(it2 != it->second.end());
1281 EXPECT_EQ(it2->second.size(), 6);
1282 EXPECT_DOUBLE_EQ(it2->second[
"joint_1"], 0);
1283 EXPECT_DOUBLE_EQ(it2->second[
"joint_2"], 0);
1284 EXPECT_DOUBLE_EQ(it2->second[
"joint_3"], 0);
1285 EXPECT_DOUBLE_EQ(it2->second[
"joint_4"], 0);
1286 EXPECT_DOUBLE_EQ(it2->second[
"joint_5"], 0);
1287 EXPECT_DOUBLE_EQ(it2->second[
"joint_6"], 0);
1290 auto is_failure = [g, &group_names](
const std::string& xml_string) {
1291 tinyxml2::XMLDocument xml_doc;
1292 EXPECT_TRUE(xml_doc.Parse(xml_string.c_str()) == tinyxml2::XML_SUCCESS);
1294 tinyxml2::XMLElement* element = xml_doc.FirstChildElement(
"robot");
1295 EXPECT_TRUE(element !=
nullptr);
1299 parseGroupStates(*g, group_names, element, std::array<int, 3>({ 1, 0, 0 }));
1301 catch (
const std::exception& e)
1310 std::string xml_string =
1311 R
"(<robot name="abb_irb2400">
1312 <group_state group="manipulator">
1313 <joint name="joint_1" value="0"/>
1316 EXPECT_TRUE(is_failure(xml_string));
1319 EXPECT_ANY_THROW(srdf_model.initString(*g, xml_string, locator));
1322 std::string xml_string =
1323 R
"(<robot name="abb_irb2400">
1324 <group_state name="all-zeros">
1325 <joint name="joint_1" value="0"/>
1328 EXPECT_TRUE(is_failure(xml_string));
1331 EXPECT_ANY_THROW(srdf_model.initString(*g, xml_string, locator));
1334 std::string xml_string =
1335 R
"(<robot name="abb_irb2400">
1336 <group_state name="all-zeros" group="missing_group">
1337 <joint name="joint_1" value="0"/>
1340 EXPECT_TRUE(is_failure(xml_string));
1343 EXPECT_ANY_THROW(srdf_model.initString(*g, xml_string, locator));
1346 std::string xml_string =
1347 R
"(<robot name="abb_irb2400">
1348 <group_state name="all-zeros" group="manipulator"/>
1350 EXPECT_TRUE(is_failure(xml_string));
1353 EXPECT_ANY_THROW(srdf_model.initString(*g, xml_string, locator));
1356 std::string xml_string =
1357 R
"(<robot name="abb_irb2400">
1358 <group_state name="all-zeros" group="manipulator">
1362 EXPECT_TRUE(is_failure(xml_string));
1365 EXPECT_ANY_THROW(srdf_model.initString(*g, xml_string, locator));
1368 std::string xml_string =
1369 R
"(<robot name="abb_irb2400">
1370 <group_state name="all-zeros" group="manipulator">
1371 <joint name="joint_1"/>
1374 EXPECT_TRUE(is_failure(xml_string));
1377 EXPECT_ANY_THROW(srdf_model.initString(*g, xml_string, locator));
1380 std::string xml_string =
1381 R
"(<robot name="abb_irb2400">
1382 <group_state name="all-zeros" group="manipulator">
1383 <joint name="joint_1" value="abc"/>
1386 EXPECT_TRUE(is_failure(xml_string));
1389 EXPECT_ANY_THROW(srdf_model.initString(*g, xml_string, locator));
1392 std::string xml_string =
1393 R
"(<robot name="abb_irb2400">
1394 <group_state name="all-zeros" group="manipulator">
1395 <joint name="missing_joint" value="0"/>
1398 EXPECT_TRUE(is_failure(xml_string));
1401 EXPECT_ANY_THROW(srdf_model.initString(*g, xml_string, locator));
1405 TEST(TesseractSRDFUnit, SRDFGroupTCPsUnit)
1413 std::string str = R
"(<robot name="abb_irb2400">
1414 <group_tcps group="manipulator">
1415 <tcp name="laser" xyz="1 .1 1" rpy="0 1.57 0" />
1416 <tcp name="welder" xyz=".1 1 .2" wxyz="1 0 0 0" />
1420 tinyxml2::XMLDocument xml_doc;
1421 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
1423 tinyxml2::XMLElement* element = xml_doc.FirstChildElement("robot");
1424 EXPECT_TRUE(element !=
nullptr);
1428 EXPECT_EQ(group_tcps.size(), 1);
1430 auto it = group_tcps.find(
"manipulator");
1431 EXPECT_TRUE(it != group_tcps.end());
1432 EXPECT_EQ(it->second.size(), 2);
1434 auto it2 = it->second.find(
"laser");
1435 EXPECT_TRUE(it2 != it->second.end());
1437 auto it3 = it->second.find(
"welder");
1438 EXPECT_TRUE(it3 != it->second.end());
1441 auto is_failure = [g](
const std::string& xml_string) {
1442 tinyxml2::XMLDocument xml_doc;
1443 EXPECT_TRUE(xml_doc.Parse(xml_string.c_str()) == tinyxml2::XML_SUCCESS);
1445 tinyxml2::XMLElement* element = xml_doc.FirstChildElement(
"robot");
1446 EXPECT_TRUE(element !=
nullptr);
1452 catch (
const std::exception& e)
1461 std::string str = R
"(<robot name="abb_irb2400">
1463 <tcp name="laser" xyz="1 .1 1" rpy="0 1.57 0" />
1466 EXPECT_TRUE(is_failure(str));
1469 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
1472 std::string str = R
"(<robot name="abb_irb2400">
1473 <group_tcps group="manipulator"/>
1475 EXPECT_TRUE(is_failure(str));
1478 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
1481 std::string str = R
"(<robot name="abb_irb2400">
1482 <group_tcps group="manipulator">
1483 <tcp xyz="1 .1 1" rpy="0 1.57 0" />
1486 EXPECT_TRUE(is_failure(str));
1489 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
1492 std::string str = R
"(<robot name="abb_irb2400">
1493 <group_tcps group="manipulator">
1494 <tcp name="laser" rpy="0 1.57 0" />
1497 EXPECT_TRUE(is_failure(str));
1500 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
1503 std::string str = R
"(<robot name="abb_irb2400">
1504 <group_tcps group="manipulator">
1505 <tcp name="laser" xyz="1 .1 1" />
1508 EXPECT_TRUE(is_failure(str));
1511 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
1514 std::string str = R
"(<robot name="abb_irb2400">
1515 <group_tcps group="manipulator">
1516 <tcp name="laser" xyz="a .1 1" rpy="0 1.57 0" />
1519 EXPECT_TRUE(is_failure(str));
1522 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
1525 std::string str = R
"(<robot name="abb_irb2400">
1526 <group_tcps group="manipulator">
1527 <tcp name="laser" xyz="1 .1 1" rpy="a 1.57 0" />
1530 EXPECT_TRUE(is_failure(str));
1533 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
1536 std::string str = R
"(<robot name="abb_irb2400">
1537 <group_tcps group="manipulator">
1538 <tcp name="laser" xyz="1 .1 1" wxyz="a 1.57 0 0" />
1541 EXPECT_TRUE(is_failure(str));
1544 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
1548 TEST(TesseractSRDFUnit, SRDFCollisionMarginsUnit)
1557 std::string str = R
"(<robot name="abb_irb2400">
1558 <collision_margins default_margin="0.025">
1559 <pair_margin link1="link_6" link2="link_5" margin="0.01"/>
1560 <pair_margin link1="link_5" link2="link_4" margin="0.015"/>
1561 </collision_margins>
1564 tinyxml2::XMLDocument xml_doc;
1565 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
1567 tinyxml2::XMLElement* element = xml_doc.FirstChildElement("robot");
1568 EXPECT_TRUE(element !=
nullptr);
1573 EXPECT_TRUE(margin_data !=
nullptr);
1574 EXPECT_NEAR(margin_data->getDefaultCollisionMargin(), 0.025, 1e-6);
1575 EXPECT_NEAR(margin_data->getMaxCollisionMargin(), 0.025, 1e-6);
1576 EXPECT_EQ(margin_data->getCollisionMarginPairData().getCollisionMargins().size(), 2);
1577 EXPECT_NEAR(margin_data->getCollisionMargin(
"link_5",
"link_6"), 0.01, 1e-6);
1578 EXPECT_NEAR(margin_data->getCollisionMargin(
"link_5",
"link_4"), 0.015, 1e-6);
1582 std::string str = R
"(<robot name="abb_irb2400">
1583 <collision_margins default_margin="0.025"/>
1586 tinyxml2::XMLDocument xml_doc;
1587 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
1589 tinyxml2::XMLElement* element = xml_doc.FirstChildElement("robot");
1590 EXPECT_TRUE(element !=
nullptr);
1595 EXPECT_TRUE(margin_data !=
nullptr);
1596 EXPECT_NEAR(margin_data->getDefaultCollisionMargin(), 0.025, 1e-6);
1597 EXPECT_NEAR(margin_data->getMaxCollisionMargin(), 0.025, 1e-6);
1598 EXPECT_EQ(margin_data->getCollisionMarginPairData().getCollisionMargins().size(), 0);
1602 std::string str = R
"(<robot name="abb_irb2400">
1603 <collision_margins default_margin="-0.025">
1604 <pair_margin link1="link_6" link2="link_5" margin="-0.01"/>
1605 <pair_margin link1="link_5" link2="link_4" margin="-0.015"/>
1606 </collision_margins>
1609 tinyxml2::XMLDocument xml_doc;
1610 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
1612 tinyxml2::XMLElement* element = xml_doc.FirstChildElement("robot");
1613 EXPECT_TRUE(element !=
nullptr);
1618 EXPECT_TRUE(margin_data !=
nullptr);
1619 EXPECT_NEAR(margin_data->getDefaultCollisionMargin(), -0.025, 1e-6);
1620 EXPECT_NEAR(margin_data->getMaxCollisionMargin(), -0.01, 1e-6);
1621 EXPECT_EQ(margin_data->getCollisionMarginPairData().getCollisionMargins().size(), 2);
1622 EXPECT_NEAR(margin_data->getCollisionMargin(
"link_5",
"link_6"), -0.01, 1e-6);
1623 EXPECT_NEAR(margin_data->getCollisionMargin(
"link_5",
"link_4"), -0.015, 1e-6);
1627 std::string str = R
"(<robot name="abb_irb2400">
1630 tinyxml2::XMLDocument xml_doc;
1631 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
1633 tinyxml2::XMLElement* element = xml_doc.FirstChildElement("robot");
1634 EXPECT_TRUE(element !=
nullptr);
1639 EXPECT_TRUE(margin_data ==
nullptr);
1643 auto is_failure = [g](
const std::string& xml_string) {
1644 tinyxml2::XMLDocument xml_doc;
1645 EXPECT_TRUE(xml_doc.Parse(xml_string.c_str()) == tinyxml2::XML_SUCCESS);
1647 tinyxml2::XMLElement* element = xml_doc.FirstChildElement(
"robot");
1648 EXPECT_TRUE(element !=
nullptr);
1654 catch (
const std::exception& e)
1663 std::string str = R
"(<robot name="abb_irb2400">
1665 <pair_margin link1="link_6" link2="link_5" margin="0.01"/>
1666 <pair_margin link1="link_5" link2="link_4" margin="0.015"/>
1667 </collision_margins>
1669 EXPECT_TRUE(is_failure(str));
1672 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
1676 std::string str = R
"(<robot name="abb_irb2400">
1677 <collision_margins default_margin="0.025">
1678 <pair_margin link2="link_5" margin="0.01"/>
1679 <pair_margin link1="link_5" link2="link_4" margin="0.015"/>
1680 </collision_margins>
1682 EXPECT_TRUE(is_failure(str));
1685 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
1689 std::string str = R
"(<robot name="abb_irb2400">
1690 <collision_margins default_margin="0.025">
1691 <pair_margin link1="link_6" link2="link_5" margin="0.01"/>
1692 <pair_margin link1="link_5" margin="0.015"/>
1693 </collision_margins>
1695 EXPECT_TRUE(is_failure(str));
1698 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
1702 std::string str = R
"(<robot name="abb_irb2400">
1703 <collision_margins default_margin="0.025">
1704 <pair_margin link1="link_6" link2="link_5" margin="0.01"/>
1705 <pair_margin link1="link_5" link2="link_4"/>
1706 </collision_margins>
1708 EXPECT_TRUE(is_failure(str));
1711 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
1715 std::string str = R
"(<robot name="abb_irb2400">
1716 <collision_margins default_margin="">
1717 <pair_margin link1="link_6" link2="link_5" margin="0.01"/>
1718 <pair_margin link1="link_5" link2="link_4" margin="0.01"/>
1719 </collision_margins>
1721 EXPECT_TRUE(is_failure(str));
1724 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
1728 std::string str = R
"(<robot name="abb_irb2400">
1729 <collision_margins default_margin="0.025">
1730 <pair_margin link1="link_6" link2="link_5" margin=""/>
1731 <pair_margin link1="link_5" link2="link_4" margin="0.01"/>
1732 </collision_margins>
1734 EXPECT_TRUE(is_failure(str));
1737 EXPECT_ANY_THROW(srdf_model.initString(*g, str, locator));
1741 std::string str = R
"(<robot name="abb_irb2400">
1742 <collision_margins default_margin="-0.025">
1743 <pair_margin link1="missing_link" link2="link_5" margin="0.01"/>
1744 <pair_margin link1="link_5" link2="link_4" margin="0.015"/>
1745 </collision_margins>
1747 EXPECT_FALSE(is_failure(str));
1750 EXPECT_NO_THROW(srdf_model.initString(*g, str, locator));
1754 std::string str = R
"(<robot name="abb_irb2400">
1755 <collision_margins default_margin="-0.025">
1756 <pair_margin link1="link_6" link2="missing_link" margin="0.01"/>
1757 <pair_margin link1="link_5" link2="link_4" margin="0.015"/>
1758 </collision_margins>
1760 EXPECT_FALSE(is_failure(str));
1763 EXPECT_NO_THROW(srdf_model.initString(*g, str, locator));
1767 TEST(TesseractSRDFUnit, AddRemoveChainGroupUnit)
1774 chain_group.emplace_back(
"base_link",
"tool0");
1777 EXPECT_TRUE(info.
chain_groups.at(
"manipulator") == chain_group);
1780 EXPECT_TRUE(info.
hasGroup(
"manipulator"));
1784 EXPECT_EQ(info1_copy, info);
1788 chain_group.emplace_back(
"tool0",
"base_link");
1790 EXPECT_NE(info1_copy, info);
1794 EXPECT_EQ(info1_copy, info);
1799 EXPECT_FALSE(info.
hasGroup(
"manipulator"));
1804 TEST(TesseractSRDFUnit, AddRemoveJointGroupUnit)
1810 JointGroup joint_group = {
"joint_1",
"joint_2",
"joint_3",
"joint_4",
"joint_5",
"joint_6" };
1813 EXPECT_TRUE(info.
hasGroup(
"manipulator"));
1814 EXPECT_TRUE(info.
joint_groups.at(
"manipulator") == joint_group);
1820 EXPECT_EQ(info1_copy, info);
1823 joint_group = {
"joint_6",
"joint_5",
"joint_4",
"joint_3",
"joint_2",
"joint_1" };
1825 EXPECT_EQ(info1_copy, info);
1828 joint_group = {
"joint_6",
"joint_5",
"joint_4",
"joint_3",
"joint_2",
"joint_0" };
1830 EXPECT_NE(info1_copy, info);
1834 EXPECT_EQ(info1_copy, info);
1839 EXPECT_FALSE(info.
hasGroup(
"manipulator"));
1844 TEST(TesseractSRDFUnit, AddRemoveLinkGroupUnit)
1850 LinkGroup link_group = {
"link_1",
"link_2",
"link_3",
"link_4",
"link_5",
"link_6" };
1853 EXPECT_TRUE(info.
hasGroup(
"manipulator"));
1859 EXPECT_EQ(info1_copy, info);
1862 link_group = {
"link_6",
"link_5",
"link_4",
"link_3",
"link_2",
"link_1" };
1864 EXPECT_EQ(info1_copy, info);
1867 link_group = {
"link_6",
"link_5",
"link_4",
"link_3",
"link_2",
"link_0" };
1869 EXPECT_NE(info1_copy, info);
1873 EXPECT_EQ(info1_copy, info);
1878 EXPECT_FALSE(info.
hasGroup(
"manipulator"));
1883 TEST(TesseractSRDFUnit, AddRemoveGroupJointStateUnit)
1890 group_states[
"joint_1"] = 0;
1891 group_states[
"joint_2"] = 0;
1892 group_states[
"joint_3"] = 0;
1893 group_states[
"joint_4"] = 0;
1894 group_states[
"joint_5"] = 0;
1895 group_states[
"joint_6"] = 0;
1899 EXPECT_TRUE(info.
group_states.at(
"manipulator").at(
"all-zeros") == group_states);
1900 EXPECT_EQ(info.
group_states.at(
"manipulator").size(), 1);
1905 EXPECT_EQ(info1_copy, info);
1908 group_states[
"joint_1"] = 1;
1909 group_states[
"joint_2"] = 2;
1910 group_states[
"joint_3"] = 3;
1911 group_states[
"joint_4"] = 4;
1912 group_states[
"joint_5"] = 5;
1913 group_states[
"joint_6"] = 6;
1916 EXPECT_NE(info1_copy, info);
1920 EXPECT_EQ(info1_copy, info);
1928 TEST(TesseractSRDFUnit, AddRemoveGroupTCPUnit)
1934 Eigen::Isometry3d tcp_laser = Eigen::Isometry3d::Identity();
1935 tcp_laser.translation() = Eigen::Vector3d(1, 0.1, 1);
1937 Eigen::Isometry3d tcp_welder = Eigen::Isometry3d::Identity();
1938 tcp_welder.translation() = Eigen::Vector3d(0.1, 1, 0.2);
1940 info.
addGroupTCP(
"manipulator",
"laser", tcp_laser);
1941 info.
addGroupTCP(
"manipulator",
"welder", tcp_welder);
1942 EXPECT_TRUE(info.
hasGroupTCP(
"manipulator",
"laser"));
1943 EXPECT_TRUE(info.
hasGroupTCP(
"manipulator",
"welder"));
1944 EXPECT_TRUE(info.
group_tcps.at(
"manipulator").at(
"laser").isApprox(tcp_laser, 1e-6));
1945 EXPECT_TRUE(info.
group_tcps.at(
"manipulator").at(
"welder").isApprox(tcp_welder, 1e-6));
1946 EXPECT_EQ(info.
group_tcps.at(
"manipulator").size(), 2);
1951 EXPECT_EQ(info1_copy, info);
1954 tcp_laser = Eigen::Isometry3d::Identity();
1955 tcp_laser.translation() = Eigen::Vector3d(0.1, 1, 0.2);
1957 tcp_welder = Eigen::Isometry3d::Identity();
1958 tcp_welder.translation() = Eigen::Vector3d(1, 0.1, 1);
1960 info1_copy.
addGroupTCP(
"manipulator",
"laser", tcp_laser);
1961 info1_copy.
addGroupTCP(
"manipulator",
"welder", tcp_welder);
1963 EXPECT_NE(info1_copy, info);
1967 EXPECT_EQ(info1_copy, info);
1972 EXPECT_FALSE(info.
hasGroupTCP(
"manipulator",
"laser"));
1973 EXPECT_FALSE(info.
hasGroupTCP(
"manipulator",
"welder"));
1977 TEST(TesseractSRDFUnit, ParseConfigFilePathUnit)
1979 std::array<int, 3> version{ 1, 0, 0 };
1984 std::string str = R
"(<robot name="abb_irb2400">
1985 <contact_managers_plugin_config filename="package://tesseract_support/urdf/contact_manager_plugins.yaml"/>
1988 tinyxml2::XMLDocument xml_doc;
1989 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
1991 tinyxml2::XMLElement* robot_element = xml_doc.FirstChildElement("robot");
1992 EXPECT_TRUE(robot_element !=
nullptr);
1994 tinyxml2::XMLElement* element = robot_element->FirstChildElement(
"contact_managers_plugin_config");
1995 EXPECT_TRUE(element !=
nullptr);
1998 EXPECT_TRUE(std::filesystem::exists(path));
2002 std::string str = R
"(<robot name="abb_irb2400">
2003 <contact_managers_plugin_config incorrect_attribute="package://tesseract_support/urdf/contact_manager_plugins.yaml"/>
2006 tinyxml2::XMLDocument xml_doc;
2007 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
2009 tinyxml2::XMLElement* robot_element = xml_doc.FirstChildElement("robot");
2010 EXPECT_TRUE(robot_element !=
nullptr);
2012 tinyxml2::XMLElement* element = robot_element->FirstChildElement(
"contact_managers_plugin_config");
2013 EXPECT_TRUE(element !=
nullptr);
2018 EXPECT_ANY_THROW(srdf_model.
initString(*g, str, locator));
2022 std::string str = R
"(<robot name="abb_irb2400">
2023 <contact_managers_plugin_config filename="package://tesseract_support/urdf/does_not_exist.yaml"/>
2026 tinyxml2::XMLDocument xml_doc;
2027 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
2029 tinyxml2::XMLElement* robot_element = xml_doc.FirstChildElement("robot");
2030 EXPECT_TRUE(robot_element !=
nullptr);
2032 tinyxml2::XMLElement* element = robot_element->FirstChildElement(
"contact_managers_plugin_config");
2033 EXPECT_TRUE(element !=
nullptr);
2038 EXPECT_ANY_THROW(srdf_model.
initString(*g, str, locator));
2042 std::string str = R
"(<robot name="abb_irb2400">
2043 <contact_managers_plugin_config filename="does_not_exist.yaml"/>
2046 tinyxml2::XMLDocument xml_doc;
2047 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
2049 tinyxml2::XMLElement* robot_element = xml_doc.FirstChildElement("robot");
2050 EXPECT_TRUE(robot_element !=
nullptr);
2052 tinyxml2::XMLElement* element = robot_element->FirstChildElement(
"contact_managers_plugin_config");
2053 EXPECT_TRUE(element !=
nullptr);
2058 EXPECT_ANY_THROW(srdf_model.
initString(*g, str, locator));
2062 TEST(TesseractSRDFUnit, ParseContactManagersPluginConfigUnit)
2064 std::array<int, 3> version{ 1, 0, 0 };
2069 std::string str = R
"(<robot name="abb_irb2400">
2070 <contact_managers_plugin_config filename="package://tesseract_support/urdf/contact_manager_plugins.yaml"/>
2073 tinyxml2::XMLDocument xml_doc;
2074 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
2076 tinyxml2::XMLElement* robot_element = xml_doc.FirstChildElement("robot");
2077 EXPECT_TRUE(robot_element !=
nullptr);
2079 tinyxml2::XMLElement* element = robot_element->FirstChildElement(
"contact_managers_plugin_config");
2080 EXPECT_TRUE(element !=
nullptr);
2084 EXPECT_FALSE(info.
empty());
2088 std::string str = R
"(<robot name="abb_irb2400">
2089 <contact_managers_plugin_config filename="package://tesseract_support/urdf/does_not_exist.yaml"/>
2092 tinyxml2::XMLDocument xml_doc;
2093 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
2095 tinyxml2::XMLElement* robot_element = xml_doc.FirstChildElement("robot");
2096 EXPECT_TRUE(robot_element !=
nullptr);
2098 tinyxml2::XMLElement* element = robot_element->FirstChildElement(
"contact_managers_plugin_config");
2099 EXPECT_TRUE(element !=
nullptr);
2104 EXPECT_ANY_THROW(srdf_model.
initString(*g, str, locator));
2108 std::string str = R
"(<robot name="abb_irb2400">
2109 <contact_managers_plugin_config filename="package://tesseract_support/urdf/malformed_config.yaml"/>
2112 tinyxml2::XMLDocument xml_doc;
2113 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
2115 tinyxml2::XMLElement* robot_element = xml_doc.FirstChildElement("robot");
2116 EXPECT_TRUE(robot_element !=
nullptr);
2118 tinyxml2::XMLElement* element = robot_element->FirstChildElement(
"contact_managers_plugin_config");
2119 EXPECT_TRUE(element !=
nullptr);
2124 EXPECT_ANY_THROW(srdf_model.
initString(*g, str, locator));
2128 TEST(TesseractSRDFUnit, ParseKinematicsPluginConfigUnit)
2130 std::array<int, 3> version{ 1, 0, 0 };
2135 std::string str = R
"(<robot name="abb_irb2400">
2136 <kinematics_plugin_config filename="package://tesseract_support/urdf/abb_irb2400_plugins.yaml"/>
2139 tinyxml2::XMLDocument xml_doc;
2140 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
2142 tinyxml2::XMLElement* robot_element = xml_doc.FirstChildElement("robot");
2143 EXPECT_TRUE(robot_element !=
nullptr);
2145 tinyxml2::XMLElement* element = robot_element->FirstChildElement(
"kinematics_plugin_config");
2146 EXPECT_TRUE(element !=
nullptr);
2150 EXPECT_FALSE(info.
empty());
2154 std::string str = R
"(<robot name="abb_irb2400">
2155 <kinematics_plugin_config/>
2158 tinyxml2::XMLDocument xml_doc;
2159 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
2161 tinyxml2::XMLElement* robot_element = xml_doc.FirstChildElement("robot");
2162 EXPECT_TRUE(robot_element !=
nullptr);
2164 tinyxml2::XMLElement* element = robot_element->FirstChildElement(
"kinematics_plugin_config");
2165 EXPECT_TRUE(element !=
nullptr);
2170 EXPECT_ANY_THROW(srdf_model.
initString(*g, str, locator));
2174 std::string str = R
"(<robot name="abb_irb2400">
2175 <kinematics_plugin_config filename="package://tesseract_support/urdf/does_not_exist.yaml"/>
2178 tinyxml2::XMLDocument xml_doc;
2179 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
2181 tinyxml2::XMLElement* robot_element = xml_doc.FirstChildElement("robot");
2182 EXPECT_TRUE(robot_element !=
nullptr);
2184 tinyxml2::XMLElement* element = robot_element->FirstChildElement(
"kinematics_plugin_config");
2185 EXPECT_TRUE(element !=
nullptr);
2190 EXPECT_ANY_THROW(srdf_model.
initString(*g, str, locator));
2194 std::string str = R
"(<robot name="abb_irb2400">
2195 <kinematics_plugin_config filename="package://tesseract_support/urdf/malformed_config.yaml"/>
2198 tinyxml2::XMLDocument xml_doc;
2199 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
2201 tinyxml2::XMLElement* robot_element = xml_doc.FirstChildElement("robot");
2202 EXPECT_TRUE(robot_element !=
nullptr);
2204 tinyxml2::XMLElement* element = robot_element->FirstChildElement(
"kinematics_plugin_config");
2205 EXPECT_TRUE(element !=
nullptr);
2210 EXPECT_ANY_THROW(srdf_model.
initString(*g, str, locator));
2214 TEST(TesseractSRDFUnit, ParseCalibrationConfigUnit)
2216 std::array<int, 3> version{ 1, 0, 0 };
2221 std::string str = R
"(<robot name="abb_irb2400">
2222 <calibration_config filename="package://tesseract_support/urdf/abb_irb2400_calibration.yaml"/>
2225 tinyxml2::XMLDocument xml_doc;
2226 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
2228 tinyxml2::XMLElement* robot_element = xml_doc.FirstChildElement("robot");
2229 EXPECT_TRUE(robot_element !=
nullptr);
2231 tinyxml2::XMLElement* element = robot_element->FirstChildElement(
"calibration_config");
2232 EXPECT_TRUE(element !=
nullptr);
2235 EXPECT_FALSE(info.
empty());
2239 std::string str = R
"(<robot name="abb_irb2400">
2240 <calibration_config filename="package://tesseract_support/urdf/does_not_exist.yaml"/>
2243 tinyxml2::XMLDocument xml_doc;
2244 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
2246 tinyxml2::XMLElement* robot_element = xml_doc.FirstChildElement("robot");
2247 EXPECT_TRUE(robot_element !=
nullptr);
2249 tinyxml2::XMLElement* element = robot_element->FirstChildElement(
"calibration_config");
2250 EXPECT_TRUE(element !=
nullptr);
2255 EXPECT_ANY_THROW(srdf_model.
initString(*g, str, locator));
2259 std::string str = R
"(<robot name="abb_irb2400">
2260 <calibration_config/>
2263 tinyxml2::XMLDocument xml_doc;
2264 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
2266 tinyxml2::XMLElement* robot_element = xml_doc.FirstChildElement("robot");
2267 EXPECT_TRUE(robot_element !=
nullptr);
2269 tinyxml2::XMLElement* element = robot_element->FirstChildElement(
"calibration_config");
2270 EXPECT_TRUE(element !=
nullptr);
2275 EXPECT_ANY_THROW(srdf_model.
initString(*g, str, locator));
2279 std::string str = R
"(<robot name="abb_irb2400">
2280 <calibration_config filename="package://tesseract_support/urdf/malformed_config.yaml"/>
2283 tinyxml2::XMLDocument xml_doc;
2284 EXPECT_TRUE(xml_doc.Parse(str.c_str()) == tinyxml2::XML_SUCCESS);
2286 tinyxml2::XMLElement* robot_element = xml_doc.FirstChildElement("robot");
2287 EXPECT_TRUE(robot_element !=
nullptr);
2289 tinyxml2::XMLElement* element = robot_element->FirstChildElement(
"calibration_config");
2290 EXPECT_TRUE(element !=
nullptr);
2295 EXPECT_ANY_THROW(srdf_model.
initString(*g, str, locator));
2299 int main(
int argc,
char** argv)
2301 testing::InitGoogleTest(&argc, argv);
2303 return RUN_ALL_TESTS();