30 #include <boost/algorithm/string/classification.hpp>
31 #include <boost/algorithm/string/split.hpp>
48 const tinyxml2::XMLElement* srdf_xml,
49 const std::array<int, 3>& )
54 for (
const tinyxml2::XMLElement* xml_group_element = srdf_xml->FirstChildElement(
"group_tcps");
55 xml_group_element !=
nullptr;
56 xml_group_element = xml_group_element->NextSiblingElement(
"group_tcps"))
58 std::string group_name_string;
60 if (status != tinyxml2::XML_SUCCESS)
61 std::throw_with_nested(std::runtime_error(
"GroupTCPs: Missing or failed to parse attribute 'group'!"));
63 for (
const tinyxml2::XMLElement* xml_element = xml_group_element->FirstChildElement(
"tcp"); xml_element !=
nullptr;
64 xml_element = xml_element->NextSiblingElement(
"tcp"))
66 Eigen::Isometry3d tcp = Eigen::Isometry3d::Identity();
68 if (xml_element->Attribute(
"name") ==
nullptr || xml_element->Attribute(
"xyz") ==
nullptr ||
69 (xml_element->Attribute(
"rpy") ==
nullptr && xml_element->Attribute(
"wxyz") ==
nullptr))
70 std::throw_with_nested(std::runtime_error(
71 strFormat(
"GroupTCPs: Invalid tcp definition for group '%s'!", group_name_string.c_str())));
73 std::string tcp_name_string;
76 if (status != tinyxml2::XML_SUCCESS)
77 std::throw_with_nested(
78 std::runtime_error(
"GroupTCPS: Failed to parse attribute 'name' for group '" + group_name_string +
"'!"));
81 std::string xyz_string, rpy_string, wxyz_string;
84 if (status != tinyxml2::XML_NO_ATTRIBUTE && status != tinyxml2::XML_SUCCESS)
85 std::throw_with_nested(std::runtime_error(
strFormat(
"GroupTCPS: TCP '%s' for group '%s' failed to parse "
87 tcp_name_string.c_str(),
88 group_name_string.c_str())));
91 if (status != tinyxml2::XML_NO_ATTRIBUTE)
93 std::vector<std::string> tokens;
94 boost::split(tokens, xyz_string, boost::is_any_of(
" "), boost::token_compress_on);
96 std::throw_with_nested(std::runtime_error(
strFormat(
"GroupTCPS: TCP '%s' for group '%s' failed to parse "
98 tcp_name_string.c_str(),
99 group_name_string.c_str())));
101 double x{ 0 }, y{ 0 }, z{ 0 };
107 tcp.translation() = Eigen::Vector3d(x, y, z);
110 if (xml_element->Attribute(
"wxyz") ==
nullptr)
114 if (status != tinyxml2::XML_NO_ATTRIBUTE && status != tinyxml2::XML_SUCCESS)
115 std::throw_with_nested(std::runtime_error(
strFormat(
"GroupTCPS: TCP '%s' for group '%s' failed to parse "
117 tcp_name_string.c_str(),
118 group_name_string.c_str())));
121 if (status != tinyxml2::XML_NO_ATTRIBUTE)
123 std::vector<std::string> tokens;
124 boost::split(tokens, rpy_string, boost::is_any_of(
" "), boost::token_compress_on);
126 std::throw_with_nested(std::runtime_error(
strFormat(
"GroupTCPS: TCP '%s' for group '%s' failed to parse "
128 tcp_name_string.c_str(),
129 group_name_string.c_str())));
131 double r{ 0 }, p{ 0 }, y{ 0 };
137 Eigen::AngleAxisd rollAngle(r, Eigen::Vector3d::UnitX());
138 Eigen::AngleAxisd pitchAngle(p, Eigen::Vector3d::UnitY());
139 Eigen::AngleAxisd yawAngle(y, Eigen::Vector3d::UnitZ());
141 Eigen::Quaterniond rpy{ yawAngle * pitchAngle * rollAngle };
143 tcp.linear() = rpy.toRotationMatrix();
150 if (status != tinyxml2::XML_NO_ATTRIBUTE && status != tinyxml2::XML_SUCCESS)
151 std::throw_with_nested(std::runtime_error(
strFormat(
"GroupTCPS: TCP '%s' for group '%s' failed to parse "
153 tcp_name_string.c_str(),
154 group_name_string.c_str())));
157 if (status != tinyxml2::XML_NO_ATTRIBUTE)
159 std::vector<std::string> tokens;
160 boost::split(tokens, wxyz_string, boost::is_any_of(
" "), boost::token_compress_on);
162 std::throw_with_nested(std::runtime_error(
strFormat(
"GroupTCPS: TCP '%s' for group '%s' failed to parse "
164 tcp_name_string.c_str(),
165 group_name_string.c_str())));
167 double qw{ 0 }, qx{ 0 }, qy{ 0 }, qz{ 0 };
174 Eigen::Quaterniond q(qw, qx, qy, qz);
177 tcp.linear() = q.toRotationMatrix();
181 auto group_tcp = group_tcps.find(group_name_string);
182 if (group_tcp == group_tcps.end())
185 group_tcp = group_tcps.find(group_name_string);
188 group_tcp->second[tcp_name_string] = tcp;
191 if (group_tcps.count(group_name_string) == 0)
192 std::throw_with_nested(
193 std::runtime_error(
"GroupTCPS: No tool centers points were found for group '" + group_name_string +
"'!"));