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 + 
"'!"));