29 #include <console_bridge/console.h>
42 const tinyxml2::XMLElement* srdf_xml,
43 const std::array<int, 3>& )
45 double default_margin{ 0 };
46 const tinyxml2::XMLElement* xml_element = srdf_xml->FirstChildElement(
"collision_margins");
47 if (xml_element ==
nullptr)
51 if (status != tinyxml2::XML_SUCCESS)
52 std::throw_with_nested(std::runtime_error(
"CollisionMargins: collision_margins missing attribute "
53 "'default_margin'."));
55 auto margin_data = std::make_shared<tesseract_common::CollisionMarginData>(default_margin);
56 for (
const tinyxml2::XMLElement* xml_pair_element = xml_element->FirstChildElement(
"pair_margin");
57 xml_pair_element !=
nullptr;
58 xml_pair_element = xml_pair_element->NextSiblingElement(
"pair_margin"))
60 std::string link1_name, link2_name;
61 double link_pair_margin{ 0 };
63 if (status != tinyxml2::XML_SUCCESS)
64 std::throw_with_nested(std::runtime_error(
"parseCollisionMargins: Missing or failed to parse 'link1' "
68 if (status != tinyxml2::XML_SUCCESS)
69 std::throw_with_nested(std::runtime_error(
"CollisionMargins: Missing or failed to parse 'link2' attribute."));
71 if (!scene_graph.
getLink(link1_name))
73 CONSOLE_BRIDGE_logWarn(
"parseCollisionMargins: Link '%s' is not known to URDF.", link1_name.c_str());
76 if (!scene_graph.
getLink(link2_name))
78 CONSOLE_BRIDGE_logWarn(
"parseCollisionMargins: Link '%s' is not known to URDF.", link2_name.c_str());
82 if (status != tinyxml2::XML_SUCCESS)
83 std::throw_with_nested(std::runtime_error(
"parseCollisionMargins: failed to parse link pair 'margin' "
86 margin_data->setCollisionMargin(link1_name, link2_name, link_pair_margin);