Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "industrial_utils/utils.h"
00033 #include "ros/ros.h"
00034 #include <algorithm>
00035
00036 namespace industrial_utils
00037 {
00038
00039 bool isSimilar(std::vector<std::string> lhs, std::vector<std::string> rhs)
00040 {
00041 bool rtn = false;
00042
00043 if (lhs.size() != rhs.size())
00044 {
00045 rtn = false;
00046 }
00047 else
00048 {
00049 std::sort(lhs.begin(), lhs.end());
00050 std::sort(rhs.begin(), rhs.end());
00051 rtn = isSame(lhs, rhs);
00052 }
00053
00054 return rtn;
00055 }
00056
00057 bool isSame(const std::vector<std::string> & lhs, const std::vector<std::string> & rhs)
00058 {
00059 bool rtn = false;
00060
00061 if (lhs.size() != rhs.size())
00062 {
00063 rtn = false;
00064 }
00065 else
00066 {
00067 rtn = std::equal(lhs.begin(), lhs.end(), rhs.begin());
00068 }
00069 return rtn;
00070 }
00071
00072 bool findChainJointNames(const boost::shared_ptr<const urdf::Link> &link, bool ignore_fixed,
00073 std::vector<std::string> &joint_names)
00074 {
00075 typedef std::vector<boost::shared_ptr<urdf::Joint> > joint_list;
00076 typedef std::vector<boost::shared_ptr<urdf::Link> > link_list;
00077 std::string found_joint, found_link;
00078
00079
00080 const joint_list &joints = link->child_joints;
00081 ROS_DEBUG("Found %lu child joints:", joints.size());
00082 for (joint_list::const_iterator it=joints.begin(); it!=joints.end(); ++it)
00083 {
00084 ROS_DEBUG_STREAM(" " << (*it)->name << ": type " << (*it)->type);
00085 if (ignore_fixed && (*it)->type == urdf::Joint::FIXED)
00086 continue;
00087
00088 if (found_joint.empty())
00089 {
00090 found_joint = (*it)->name;
00091 joint_names.push_back(found_joint);
00092 }
00093 else
00094 {
00095 ROS_WARN_STREAM("Unable to find chain in URDF. Branching joints: " << found_joint << " and " << (*it)->name);
00096 return false;
00097 }
00098 }
00099
00100
00101 const link_list &links = link->child_links;
00102 std::vector<std::string> sub_joints;
00103 ROS_DEBUG("Found %lu child links:", links.size());
00104 for (link_list::const_iterator it=links.begin(); it!=links.end(); ++it)
00105 {
00106 ROS_DEBUG_STREAM(" " << (*it)->name);
00107 if (!findChainJointNames(*it, ignore_fixed, sub_joints))
00108 return false;
00109
00110 if (sub_joints.empty())
00111 continue;
00112
00113 if (found_link.empty())
00114 {
00115 found_link = (*it)->name;
00116 joint_names.insert(joint_names.end(), sub_joints.begin(), sub_joints.end());
00117 }
00118 else
00119 {
00120 ROS_WARN_STREAM("Unable to find chain in URDF. Branching links: " << found_link << " and " << (*it)->name);
00121 return false;
00122 }
00123 }
00124
00125 return true;
00126 }
00127
00128 }