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 
00038 #ifndef POSE_GRAPH_UTILS_H
00039 #define POSE_GRAPH_UTILS_H
00040 
00041 
00042 #include <ros/assert.h>
00043 #include <map>
00044 #include <string>
00045 #include <boost/lexical_cast.hpp>
00046 #include <pose_graph/geometry.h>
00047 #include <pose_graph/transforms.h>
00048 #include <geometry_msgs/Pose2D.h>
00049 #include <boost/format.hpp>
00050 #include <Eigen3/Dense>
00051 #include <numeric>
00052 
00053 namespace pose_graph
00054 {
00055 namespace gm=geometry_msgs;
00056 
00057 using std::map;
00058 using std::pair;
00059 using std::string;
00060 
00061 using boost::format;
00062 
00063 
00064 
00065 template <class Key, class Container>
00066 bool contains (const Container& container, const Key& key)
00067 {
00068   return container.find(key)!=container.end();
00069 }
00070 
00071 
00072 
00073 
00074 template <class K, class V, class C, class A>
00075 const V& keyValue (const map<K, V, C, A>& m, const K& key)
00076 {
00077   typename map<K, V, C, A>::const_iterator pos = m.find(key);
00078   ROS_ASSERT_MSG (pos!=m.end(), "Map did not contain a key that it was expected to");
00079   return pos->second;
00080 }
00081 
00082 
00083 
00084 
00085 
00086 
00087 inline
00088 string toString (const gm::Pose2D& pose)
00089 {
00090   return (format("[%.2f, %.2f, %.2f]") % pose.x % pose.y % pose.theta).str();
00091 }
00092 
00093 inline
00094 string toString (const gm::Point& p)
00095 {
00096   return (format("[%.2f, %.2f]") % p.x % p.y).str();
00097 }
00098 
00099 inline
00100 string toString (const Eigen3::Affine3d& trans)
00101 {
00102   const Eigen3::Vector3d v(trans.translation());
00103   const Eigen3::Quaterniond q(trans.rotation());
00104   return (format("[[%.2f, %.2f, %.2f], [%.2f, %.2f, %.2f, %.2f]]") %
00105           v.x() % v.y() % v.z() % q.x() % q.y() % q.z() % q.w()).str();
00106 }
00107 
00108 inline
00109 string toString2D (const gm::Pose& pose)
00110 {
00111   gm::Pose2D p = projectToPose2D(pose);
00112   
00113   return (format("(%2f, %2f, %2f)") % p.x % p.y %
00114           p.theta).str();
00115 }
00116 
00117 inline
00118 void poseEigenToMsg(const Eigen3::Affine3d &e, geometry_msgs::Pose &m)
00119 {
00120   m.position.x = e.translation()[0];
00121   m.position.y = e.translation()[1];
00122   m.position.z = e.translation()[2];
00123   Eigen3::Quaterniond q = (Eigen3::Quaterniond)e.linear();
00124   m.orientation.x = q.x();
00125   m.orientation.y = q.y();
00126   m.orientation.z = q.z();
00127   m.orientation.w = q.w();
00128   if (m.orientation.w < 0) {
00129     m.orientation.x *= -1;
00130     m.orientation.y *= -1;
00131     m.orientation.z *= -1;
00132     m.orientation.w *= -1;
00133   }
00134 }
00135 
00136 
00137 inline
00138 string toString2D (const Eigen3::Affine3d& trans)
00139 {
00140   gm::Pose p;
00141   poseEigenToMsg(trans, p);
00142   return toString2D(p);
00143 }
00144 
00145 
00146 inline
00147 string toString (const PoseConstraint& constraint)
00148 {
00149   const Eigen3::Vector3d v(constraint.translation);
00150   const Eigen3::Quaterniond q(constraint.rotation);
00151   return (format("[[%.2f, %.2f, %.2f], [%.2f, %.2f, %.2f, %.2f]]") %
00152           v.x() % v.y() % v.z() % q.x() % q.x() % q.y() % q.w()).str();
00153 }
00154   
00155 
00156 inline
00157 string toString (const gm::Pose& pose)
00158 {
00159   return (format("[(%.2f, %.2f, %.2f), (%.2f, %.2f, %.2f, %.2f)]") %
00160           pose.position.x % pose.position.y % pose.position.z %
00161           pose.orientation.x % pose.orientation.y % pose.orientation.z % pose.orientation.w).str();
00162 }
00163 
00164 
00165 template <class T>
00166 std::string concatenate (const std::string& s, const T& x)
00167 {
00168   return s + std::string(" ") + boost::lexical_cast<std::string>(x);
00169 }
00170 
00171 
00172 template <class T>
00173 std::string toString (const std::set<T>& set)
00174 {
00175   const std::string s = std::accumulate(set.begin(), set.end(), std::string(""), concatenate<T>);
00176   return std::string("[") + s + std::string("]");
00177 }
00178 
00179 template <class T>
00180 std::string toString (const std::vector<T>& v)
00181 {
00182   const std::string s = std::accumulate(v.begin(), v.end(), std::string(""), concatenate<T>);
00183   return std::string("[") + s + std::string("]");
00184 }
00185 
00186 inline
00187 std::string toString (const PrecisionMatrix& m)
00188 {
00189   return (format("(x-x: %.2f, y-y: %.2f, x-y: %.2f, th-th: %.2f)") % m(0,0) % m(1,1) % m(0,1) % m(5,5)).str();
00190 }
00191 
00192 
00193 
00194 
00195 } 
00196 
00197 
00198 #endif // Include guard