00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef RTC_POSE3D_H
00020 #define RTC_POSE3D_H
00021
00022
00023 #include "rtc/rtcMath.h"
00024 #include "rtc/rtcVec6.h"
00025 #include "rtc/rtcRotation.h"
00026
00027
00028 namespace rtc {
00029
00033 template <class T>
00034 class Pose3D {
00035 public:
00036
00037 Pose3D();
00038 Pose3D(T x, T y, T z, T roll, T pitch, T yaw);
00039 Pose3D(const Vec6<T>& pose);
00040 Pose3D(const Transform<T>& transform);;
00041 Pose3D(const Rotation<T>& rotation, const Vec3<T>& translation);
00042
00043
00044 T x() const;
00045 T y() const;
00046 T z() const;
00047 T roll() const;
00048 T pitch() const;
00049 T yaw() const;
00050 Vec3<T> getTranslation() const;
00051 Rotation<T> getRotation() const;
00052 Transform<T> getTransform() const;
00053
00054
00055 void set(const Pose3D& pose);
00056 void set(T x, T y, T z, T roll, T pitch, T yaw);
00057 void set(const Vec6<T>& pose);
00058 void set(const Transform<T>& transform);
00059 void set(const Rotation<T>& rotation, const Vec3<T>& translation);
00060
00061
00062 bool write(OutputHandler& oh) const;
00063 bool read(InputHandler& ih);
00064
00065
00066 Vec6<T> p;
00067 };
00068
00069
00070 typedef Pose3D<float> Pose3Df;
00071 typedef Pose3D<double> Pose3Dd;
00072
00073
00074
00075
00076
00080 template <class T>
00081 Pose3D<T>::Pose3D()
00082 : p(T(0))
00083 {
00084 }
00085
00089 template <class T>
00090 Pose3D<T>::Pose3D(T _x, T _y, T _z, T _roll, T _pitch, T _yaw)
00091 : p(_x,_y,_z,_roll,_pitch,_yaw)
00092 {
00093 }
00094
00098 template <class T>
00099 Pose3D<T>::Pose3D(const Vec6<T>& v)
00100 {
00101 set(v);
00102 }
00103
00107 template <class T>
00108 Pose3D<T>::Pose3D(const Transform<T>& t)
00109 {
00110 set(t);
00111 }
00112
00117 template <class T>
00118 Pose3D<T>::Pose3D(const Rotation<T>& rotation, const Vec3<T>& translation)
00119 {
00120 set(rotation,translation);
00121 }
00122
00123
00124
00127 template <class T>
00128 void Pose3D<T>::set(T _x, T _y, T _z, T _roll, T _pitch, T _yaw)
00129 {
00130 p.set(_x,_y,_z,_roll,_pitch,_yaw);
00131 }
00132
00136 template <class T>
00137 void Pose3D<T>::set(const Pose3D& p)
00138 {
00139 *this = p;
00140 }
00141
00145 template <class T>
00146 void Pose3D<T>::set(const Vec6<T>& v)
00147 {
00148 p = v;
00149 }
00150
00154 template <class T>
00155 void Pose3D<T>::set(const Transform<T>& t)
00156 {
00157 Vec3<T> trans = t.getTranslation();
00158 EulerAnglesf e = t.getRotation();
00159 set(trans(0),trans(1),trans(2),e.roll(),e.pitch(),e.yaw());
00160 }
00161
00166 template <class T>
00167 void Pose3D<T>::set(const Rotation<T>& rotation, const Vec3<T>& translation)
00168 {
00169 EulerAnglesf e(rotation);
00170 set(translation(0),translation(1),translation(2),e.roll(),e.pitch(),e.yaw());
00171 }
00172
00173
00176 template <class T>
00177 T Pose3D<T>::x() const
00178 {
00179 return p[0];
00180 }
00181
00184 template <class T>
00185 T Pose3D<T>::y() const
00186 {
00187 return p[1];
00188 }
00189
00192 template <class T>
00193 T Pose3D<T>::z() const
00194 {
00195 return p[2];
00196 }
00197
00200 template <class T>
00201 T Pose3D<T>::roll() const
00202 {
00203 return p[3];
00204 }
00205
00208 template <class T>
00209 T Pose3D<T>::pitch() const
00210 {
00211 return p[4];
00212 }
00213
00216 template <class T>
00217 T Pose3D<T>::yaw() const
00218 {
00219 return p[5];
00220 }
00221
00224 template <class T>
00225 Vec3<T> Pose3D<T>::getTranslation() const
00226 {
00227 return Vec3<T>(p[0],p[1],p[2]);
00228 }
00229
00232 template <class T>
00233 Rotation<T> Pose3D<T>::getRotation() const
00234 {
00235 return Rotation<T>(EulerAngles<T>(p[3],p[4],p[5]));
00236 }
00237
00240 template <class T>
00241 Transform<T> Pose3D<T>::getTransform() const
00242 {
00243 return Transform<T>(getRotation(),getTranslation());
00244 }
00245
00248 template <class T>
00249 inline bool Pose3D<T>::write(OutputHandler& oh) const {
00250 return p.write(oh);
00251 }
00252
00255 template <class T>
00256 inline bool Pose3D<T>::read(InputHandler& ih) {
00257 return p.read(ih);
00258 }
00259
00260
00263 template <class T>
00264 std::ostream& operator<<(std::ostream& os, const Pose3D<T>& pose)
00265 {
00266 os << pose.p;
00267 return os;
00268 }
00269
00272 template <class T>
00273 std::istream& operator>>(std::istream& is, Pose3D<T>& pose)
00274 {
00275 is >> pose.p;
00276 return is;
00277 }
00278
00282 template <class T>
00283 bool rtc_write(OutputHandler& oh, const Pose3D<T>& data)
00284 {
00285 return data.write(oh);
00286 };
00287
00291 template <class T>
00292 bool rtc_read(InputHandler& ih, Pose3D<T>& data)
00293 {
00294 return data.read(ih);
00295 };
00296
00297
00298 }
00299
00300 #endif // RTC_POSE3D_H defined
00301