00001 #ifndef WALK_INTERFACE_UTIL_HH
00002 # define WALK_INTERFACE_UTIL_HH
00003 
00004 # include <cmath>
00005 
00006 # include <walk_interfaces/types.hh>
00007 
00008 namespace walk
00009 {
00010   
00011   
00012   
00013   
00014   
00015   template <class U, class V>
00016   void trans2dToTrans3d (U& dst, const V& src)
00017   {
00018     assert (dst.cols () == 4
00019             && "Incorrect columns number for dest matrix, should be 4.");
00020     assert (dst.rows () == 4
00021             && "Incorrect rows number for dest matrix, should be 4.");
00022     assert (src.cols () == 3
00023             && "Wrong columns number for source matrix, should be 3.");
00024     assert (src.rows () == 3
00025             && "Wrong rows number for source matrix, should be 3.");
00026     dst.setIdentity ();
00027 
00028     
00029     dst(0, 0) = src(0, 0);
00030     dst(0, 1) = src(0, 1);
00031     dst(1, 0) = src(1, 0);
00032     dst(1, 1) = src(1, 1);
00033 
00034     
00035     dst(0, 3) = src(0, 3);
00036     dst(1, 3) = src(1, 3);
00037   }
00038 
00039   
00040   
00041   
00042   
00043   
00044   
00045   
00046   template <class U>
00047   void trans2dToTrans3d (U& dst,
00048                          const double& srcX,
00049                          const double& srcY,
00050                          const double& srcTh)
00051   {
00052     assert (dst.cols () == 4
00053             && "Incorrect columns number for dest matrix, should be 4.");
00054     assert (dst.rows () == 4
00055             && "Incorrect rows number for dest matrix, should be 4.");
00056 
00057     dst.setIdentity ();
00058 
00059     
00060     dst(0, 0) = std::cos (srcTh);
00061     dst(1, 1) = std::cos (srcTh);
00062 
00063     dst(0, 1) = -std::sin (srcTh);
00064     dst(1, 0) = std::sin (srcTh);
00065 
00066     
00067     dst(0, 3) = srcX;
00068     dst(1, 3) = srcY;
00069   }
00070 
00074   template <class T>
00075   void convertVector3dToTrans3d (HomogeneousMatrix3d& dst, const T& src)
00076   {
00077     assert (dst.cols () == 4
00078             && "Incorrect columns number for dest matrix, should be 4.");
00079     assert (dst.rows () == 4
00080             && "Incorrect rows number for dest matrix, should be 4.");
00081 
00082     dst.setIdentity ();
00083 
00084     
00085     dst(0, 3) = src[0];
00086     dst(1, 3) = src[1];
00087     dst(2, 3) = src[2];
00088   }
00089 
00095   template <class T>
00096   void convertToTrans3d (HomogeneousMatrix3d& dst, const T& src)
00097   {
00098     assert (dst.cols () == 4
00099             && "Incorrect columns number for dest matrix, should be 4.");
00100     assert (dst.rows () == 4
00101             && "Incorrect rows number for dest matrix, should be 4.");
00102 
00103     dst.setIdentity ();
00104 
00105     
00106     for (unsigned rowId = 0; rowId < 4; ++rowId)
00107       for (unsigned colId = 0; colId < 4; ++colId)
00108         dst(rowId, colId) = src(rowId, colId);
00109   }
00110 
00114   template <class T>
00115   void convertToVector2d (Vector2d& dst, const T& src)
00116   {
00117     assert (dst.size () == 2
00118             && "Incorrect dest vector size mismatch, should be 2.");
00119 
00120     dst[0] = src[0];
00121     dst[1] = src[1];
00122   }
00123 
00127   template <class T>
00128   void convertToVector3d (Vector3d& dst, const T& src)
00129   {
00130     assert (dst.size () == 3
00131             && "Incorrect dest vector size mismatch, should be 3.");
00132 
00133     dst[0] = src[0];
00134     dst[1] = src[1];
00135     dst[2] = src[2];
00136   }
00137 
00141   template <class T>
00142   void convertToPosture (Posture& dst, const T& src)
00143   {
00144     assert (src.size () == dst.size ()
00145             && "Source and dest vectors size mismatch, should be equal.");
00146     assert (src.size () != 0
00147             && "Source vector has a zero size.");
00148 
00149     for (unsigned id; id < src.size (); ++id)
00150       dst[id] = src [id];
00151   }
00152 
00153 } 
00154 
00155 #endif //! WALK_INTERFACE_UTIL_HH