conversion.cpp
Go to the documentation of this file.
00001 #include <Eigen/LU>
00002 
00003 #include <LinearMath/btMatrix3x3.h>
00004 #include <LinearMath/btQuaternion.h>
00005 
00006 #include "walk_msgs/conversion.hh"
00007 #include "walk_interfaces/util.hh"
00008 
00009 namespace walk_msgs
00010 {
00011   void convertPoseToHomogeneousMatrix(walk::HomogeneousMatrix3d& dst,
00012                                       const geometry_msgs::Pose& src)
00013   {
00014     btQuaternion quaternion
00015       (src.orientation.x, src.orientation.y, src.orientation.z,
00016        src.orientation.w);
00017     btMatrix3x3 rotation (quaternion);
00018 
00019     dst.setIdentity();
00020 
00021     // Copy the rotation component.
00022     for(unsigned i = 0; i < 3; ++i)
00023       for(unsigned j = 0; j < 3; ++j)
00024         dst (i, j) = rotation[i][j];
00025 
00026     // Copy the translation component.
00027     dst(0, 3) = src.position.x;
00028     dst(1, 3) = src.position.y;
00029     dst(2, 3) = src.position.z;
00030   }
00031 
00032 
00033   void convertPointToVector3d(walk::Vector3d& dst,
00034                               const geometry_msgs::Point& src)
00035   {
00036     dst[0] = src.x;
00037     dst[1] = src.y;
00038     dst[2] = src.z;
00039   }
00040 
00041   void convertHomogeneousMatrixToPose(geometry_msgs::Pose& dst,
00042                                       const walk::HomogeneousMatrix3d& src)
00043   {
00044     btMatrix3x3 rotation;
00045     btQuaternion quaternion;
00046     for(unsigned i = 0; i < 3; ++i)
00047       for(unsigned j = 0; j < 3; ++j)
00048         rotation[i][j] = src (i, j);
00049     rotation.getRotation (quaternion);
00050 
00051     dst.position.x = src (0, 3);
00052     dst.position.y = src (1, 3);
00053     dst.position.z = src (2, 3);
00054 
00055     dst.orientation.x = quaternion.x ();
00056     dst.orientation.y = quaternion.y ();
00057     dst.orientation.z = quaternion.z ();
00058     dst.orientation.w = quaternion.w ();
00059 
00060   }
00061 
00062   void convertTrajectoryToPath(nav_msgs::Path& dst,
00063                                const walk::DiscretizedTrajectory3d& src,
00064                                const std::string& frameName)
00065   {
00066     std::size_t size = src.data().size();
00067 
00068     std_msgs::Header poseHeader;
00069     poseHeader.seq = 0;
00070     poseHeader.stamp.sec = 0.;
00071     poseHeader.stamp.nsec = 0.;
00072     poseHeader.frame_id = frameName;
00073 
00074     geometry_msgs::PoseStamped poseStamped;
00075 
00076     walk::TimeDuration duration;
00077     for (std::size_t i = 0; i < size; ++i)
00078       {
00079         // Update header.
00080         ++poseHeader.seq;
00081         poseHeader.stamp.sec =
00082           duration.ticks() / walk::TimeDuration::rep_type::res_adjust ();
00083         poseHeader.stamp.nsec = duration.fractional_seconds() * 1e3;
00084 
00085         // Fill header.
00086         poseStamped.header = poseHeader;
00087 
00088         // Fill pose.
00089         convertHomogeneousMatrixToPose
00090           (poseStamped.pose,
00091            src.data()[i].position);
00092 
00093         // Add to path.
00094         dst.poses.push_back(poseStamped);
00095 
00096         duration += src.data()[i].duration;
00097       }
00098   }
00099 
00100   void convertTrajectoryV2dToPath(walk_msgs::PathPoint2d& dst,
00101                                   const walk::DiscretizedTrajectoryV2d& src,
00102                                   const std::string& frameName)
00103   {
00104     std::size_t size = src.data().size();
00105 
00106     std_msgs::Header pointHeader;
00107     pointHeader.seq = 0;
00108     pointHeader.stamp.sec = 0.;
00109     pointHeader.stamp.nsec = 0.;
00110     pointHeader.frame_id = frameName;
00111 
00112     walk_msgs::Point2dStamped pointStamped;
00113 
00114     walk::TimeDuration duration;
00115     for (std::size_t i = 0; i < size; ++i)
00116       {
00117         // Update header.
00118         ++pointHeader.seq;
00119         pointHeader.stamp.sec =
00120           duration.ticks() / walk::TimeDuration::rep_type::res_adjust ();
00121         pointHeader.stamp.nsec = duration.fractional_seconds() * 1000000;
00122 
00123         // Fill header.
00124         pointStamped.header = pointHeader;
00125 
00126         // Fill point.
00127         pointStamped.point.x = src.data()[i].position[0];
00128         pointStamped.point.y = src.data()[i].position[1];
00129 
00130         // Add to path.
00131         dst.points.push_back(pointStamped);
00132 
00133         duration += src.data()[i].duration;
00134       }
00135   }
00136 
00137   void convertTrajectoryV3dToPath(walk_msgs::PathPoint3d& dst,
00138                                   const walk::DiscretizedTrajectoryV3d& src,
00139                                   const std::string& frameName)
00140   {
00141     std::size_t size = src.data().size();
00142 
00143     std_msgs::Header pointHeader;
00144     pointHeader.seq = 0;
00145     pointHeader.stamp.sec = 0.;
00146     pointHeader.stamp.nsec = 0.;
00147     pointHeader.frame_id = frameName;
00148 
00149     geometry_msgs::PointStamped pointStamped;
00150 
00151     walk::TimeDuration duration;
00152     for (std::size_t i = 0; i < size; ++i)
00153       {
00154         // Update header.
00155         ++pointHeader.seq;
00156         pointHeader.stamp.sec =
00157           duration.ticks() / walk::TimeDuration::rep_type::res_adjust ();
00158         pointHeader.stamp.nsec = duration.fractional_seconds() * 1000000;
00159 
00160         // Fill header.
00161         pointStamped.header = pointHeader;
00162 
00163         // Fill point.
00164         pointStamped.point.x = src.data()[i].position[0];
00165         pointStamped.point.y = src.data()[i].position[1];
00166         pointStamped.point.z = src.data()[i].position[2];
00167 
00168         // Add to path.
00169         dst.points.push_back(pointStamped);
00170 
00171         duration += src.data()[i].duration;
00172       }
00173   }
00174 
00175   void convertTrajectoryV2dToPath(nav_msgs::Path& dst,
00176                                   const walk::DiscretizedTrajectoryV2d& src,
00177                                   const std::string& frameName)
00178   {
00179     std::size_t size = src.data().size();
00180 
00181     std_msgs::Header poseHeader;
00182     poseHeader.seq = 0;
00183     poseHeader.stamp.sec = 0.;
00184     poseHeader.stamp.nsec = 0.;
00185     poseHeader.frame_id = frameName;
00186 
00187     geometry_msgs::PoseStamped poseStamped;
00188 
00189     walk::TimeDuration duration;
00190     for (std::size_t i = 0; i < size; ++i)
00191       {
00192         // Update header.
00193         ++poseHeader.seq;
00194         poseHeader.stamp.sec =
00195           duration.ticks() / walk::TimeDuration::rep_type::res_adjust ();
00196         poseHeader.stamp.nsec = duration.fractional_seconds() * 1000000;
00197 
00198         // Fill header.
00199         poseStamped.header = poseHeader;
00200 
00201         // Fill point.
00202         poseStamped.pose.position.x = src.data()[i].position[0];
00203         poseStamped.pose.position.y = src.data()[i].position[1];
00204         poseStamped.pose.position.z = 0.;
00205 
00206         poseStamped.pose.orientation.x = 0.;
00207         poseStamped.pose.orientation.y = 0.;
00208         poseStamped.pose.orientation.z = 0.;
00209         poseStamped.pose.orientation.z = 1.;
00210 
00211         // Add to path.
00212         dst.poses.push_back(poseStamped);
00213 
00214         duration += src.data()[i].duration;
00215       }
00216   }
00217 
00218   void convertTrajectoryV3dToPath(nav_msgs::Path& dst,
00219                                   const walk::DiscretizedTrajectoryV3d& src,
00220                                   const std::string& frameName)
00221   {
00222     std::size_t size = src.data().size();
00223 
00224     std_msgs::Header poseHeader;
00225     poseHeader.seq = 0;
00226     poseHeader.stamp.sec = 0.;
00227     poseHeader.stamp.nsec = 0.;
00228     poseHeader.frame_id = frameName;
00229 
00230     geometry_msgs::PoseStamped poseStamped;
00231 
00232     walk::TimeDuration duration;
00233     for (std::size_t i = 0; i < size; ++i)
00234       {
00235         // Update header.
00236         ++poseHeader.seq;
00237         poseHeader.stamp.sec =
00238           duration.ticks() / walk::TimeDuration::rep_type::res_adjust ();
00239         poseHeader.stamp.nsec = duration.fractional_seconds() * 1000000;
00240 
00241         // Fill header.
00242         poseStamped.header = poseHeader;
00243 
00244         // Fill point.
00245         poseStamped.pose.position.x = src.data()[i].position[0];
00246         poseStamped.pose.position.y = src.data()[i].position[1];
00247         poseStamped.pose.position.z = src.data()[i].position[2];
00248 
00249         poseStamped.pose.orientation.x = 0.;
00250         poseStamped.pose.orientation.y = 0.;
00251         poseStamped.pose.orientation.z = 0.;
00252         poseStamped.pose.orientation.z = 1.;
00253 
00254         // Add to path.
00255         dst.poses.push_back(poseStamped);
00256 
00257         duration += src.data()[i].duration;
00258       }
00259   }
00260 
00261   void
00262   convertFootprint2dToHomogeneousMatrix3d
00263   (walk::HomogeneousMatrix3d& dst, const walk_msgs::Footprint2d& src)
00264   {
00265     dst.setIdentity();
00266     walk::trans2dToTrans3d (dst, src.x, src.y, src.theta);
00267   }
00268 
00269   void
00270   convertHomogeneousMatrix3dToFootprint2d
00271   (walk_msgs::Footprint2d& dst, const walk::HomogeneousMatrix3d& src)
00272   {
00273     dst.x = src (0, 3);
00274     dst.y = src (1, 3);
00275     dst.theta = std::atan2 (src (1, 0), src (0, 0));
00276   }
00277 
00278 } // end of namespace walk_msgs.


walk_msgs
Author(s): Thomas Moulard
autogenerated on Sat Dec 28 2013 17:05:25