transformation3.hh

00001 #ifndef _TRANSFORMATION3_HXX_
00002 #define _TRANSFORMATION3_HXX_
00003 
00004 #include <assert.h>
00005 #include <cmath>
00006 #include "dmatrix.hh"
00007 
00008 template <class T>
00009 struct Vector3 {
00010   T elems[3] ;
00011 
00012   Vector3(T x, T y, T z) {elems[0]=x; elems[1]=y; elems[2]=z;}
00013   Vector3()              {elems[0]=0.; elems[1]=0.; elems[2]=0.;}
00014   Vector3(const DVector<T>& t){}
00015 
00016   // translational view
00017   inline const T& x()     const  {return elems[0];}
00018   inline const T& y()     const  {return elems[1];}
00019   inline const T& z()     const  {return elems[2];}
00020   inline T& x()            {return elems[0];}
00021   inline T& y()            {return elems[1];}
00022   inline T& z()            {return elems[2];}
00023 
00024   // rotational view
00025   inline const T& roll()   const  {return elems[0];}
00026   inline const T& pitch() const  {return elems[1];}
00027   inline const T& yaw()   const  {return elems[2];}
00028   inline T& roll()          {return elems[0];}
00029   inline T& pitch()        {return elems[1];}
00030   inline T& yaw()          {return elems[2];}
00031 
00032 };
00033 
00034 template <class T>
00035 struct Pose3 : public DVector<T>{
00036   Pose3();
00037   Pose3(const Vector3<T>& rot, const Vector3<T>& trans);
00038   Pose3(const T& x, const T& y, const T& z, const T& roll, const T& pitch, const T& yaw);
00039   Pose3(const DVector<T>& v): DVector<T>(v) {assert(v.dim()==6);} 
00040     
00041   inline operator const DVector<T>&  () {return (const DVector<T>)*this;}
00042   inline operator DVector<T>&        () {return *this;}
00043 
00044   inline const T& roll()  const  {return DVector<T>::elems[0];}
00045   inline const T& pitch() const  {return DVector<T>::elems[1];}
00046   inline const T& yaw()   const  {return DVector<T>::elems[2];}
00047   inline const T& x()     const  {return DVector<T>::elems[3];}
00048   inline const T& y()     const  {return DVector<T>::elems[4];}
00049   inline const T& z()     const  {return DVector<T>::elems[5];}
00050 
00051   inline T& roll()               {return DVector<T>::elems[0];}
00052   inline T& pitch()              {return DVector<T>::elems[1];}
00053   inline T& yaw()                {return DVector<T>::elems[2];}
00054   inline T& x()                  {return DVector<T>::elems[3];}
00055   inline T& y()                  {return DVector<T>::elems[4];}
00056   inline T& z()                  {return DVector<T>::elems[5];}
00057 
00058 };
00059 
00060 
00066 template <class T>
00067 struct Quaternion{
00068 
00072   Quaternion();
00073   
00077   Quaternion(const Vector3<T>& pose);
00078   
00082   Quaternion(const T _w, const T _x, const T _y, const T _z);
00083   
00087   Quaternion(const T _roll_x_phi, const T _pitch_y_theta, const T _yaw_z_psi);
00088   
00092   inline Quaternion<T> conjugated() const;
00093   
00097   inline Quaternion<T> normalized() const;
00098   
00102   inline Quaternion<T> inverse() const;
00103 
00104   /*construct a quaternion on the axis/angle representation*/
00105   inline Quaternion(const Vector3<T>& axis, const T& angle);
00106 
00113   inline Quaternion<T> rotateThisAlong (const Vector3<T>& axis, const T alpha) const;
00114   
00115         
00122   inline Quaternion<T> rotatePoint(const Quaternion& p) const;
00123   
00130   inline Vector3<T> rotatePoint(const Vector3<T>& p) const;
00131   
00138   inline Quaternion withRotation (const T alpha) const;
00139         
00144   inline Vector3<T> toAngles() const;
00145   
00146   inline Vector3<T> axis() const;
00147   inline T angle() const;
00148 
00149         
00153   inline T norm() const;
00154   
00158   inline T re() const;
00159   
00163   inline Vector3<T> im() const;
00164         
00165   T w,x,y,z;
00166 };
00167 
00168 
00169 
00170 template <class T> inline Quaternion<T> operator + (const Quaternion<T> & left, const Quaternion<T>& right);
00171 template <class T> inline Quaternion<T> operator - (const Quaternion<T> & left, const Quaternion<T>& right);
00172 template <class T> inline Quaternion<T> operator * (const Quaternion<T> & left, const Quaternion<T>& right);
00173 template <class T> inline Quaternion<T> operator * (const Quaternion<T> & left, const T scalar);
00174 template <class T> inline Quaternion<T> operator * (const T scalar, const Quaternion<T>& right);
00175 template <class T> std::ostream& operator << (std::ostream& os, const Quaternion<T>& q);
00176 
00177 template <class T> inline T innerproduct(const Quaternion<T>& left, const Quaternion<T>& right);
00178 template <class T> inline Quaternion<T> slerp(const Quaternion<T>& from, const Quaternion<T>& to, const T lambda);
00179 
00180 
00181 
00182 template <class T>
00183 struct Transformation3{
00184   Quaternion<T> rotationQuaternion;
00185   Vector3<T>    translationVector;
00186 
00187   Transformation3(){}
00188 
00189   inline static Transformation3<T> identity();
00190 
00191   Transformation3 (const Vector3<T>& trans, const Quaternion<T>& rot);
00192   Transformation3 (const Pose3<T>& v);
00193   Transformation3 (const T& x, const T& y, const T& z, const T& roll, const T& pitch, const T& yaw);
00194 
00195   inline Vector3<T> translation() const;
00196   inline Quaternion <T> rotation() const;
00197 
00198   inline Pose3<T> toPoseType() const;
00199   
00200   inline void setTranslation(const Vector3<T>& t);
00201   inline void setTranslation(const T& x, const T& y, const T& z);
00202 
00203   inline void setRotation(const Vector3<T>& r);
00204   inline void setRotation(const T& roll, const T& pitch, const T& yaw);
00205   inline void setRotation(const Quaternion<T>& q);
00206 
00207 
00208   inline Transformation3<T> inv() const;
00209   inline bool validRotation(const T& epsilon=0.001) const;
00210 
00211 };
00212 
00213 template <class T>
00214 inline Vector3<T> operator * (const Transformation3<T>& m, const Vector3<T>& v);
00215 
00216 template <class T>
00217 inline Transformation3<T> operator * (const Transformation3<T>& m1, const Transformation3<T>& m2);
00218 
00219 template <class T>
00220 struct Operations3D{
00221   typedef T                  BaseType;
00222   typedef Pose3<T>           PoseType;
00223   typedef Quaternion<T>      RotationType;
00224   typedef Vector3<T>         TranslationType;
00225   typedef Transformation3<T> TransformationType;
00226   typedef DMatrix<T>         CovarianceType;
00227   typedef DMatrix<T>         InformationType;
00228   typedef Transformation3<T> ParametersType;
00229 };
00230 
00231 /**************************** IMPLEMENTATION ****************************/
00232 
00233 #include "transformation3.hxx"
00234 
00235 #endif
00236 

Generated on Mon Nov 12 11:43:00 2007 for TORO by  doxygen 1.5.0