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
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
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
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
00232
00233 #include "transformation3.hxx"
00234
00235 #endif
00236