Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef RTC_EULERANGLES_H
00020 #define RTC_EULERANGLES_H
00021
00022
00023 #include "rtc/rtcMath.h"
00024 #include "rtc/rtcRotation.h"
00025 #include "rtc/rtcTransform.h"
00026 #include "rtc/rtcQuaternion.h"
00027 #include "rtc/rtcVec3.h"
00028
00029
00030 namespace rtc {
00031
00032
00033 template <class T> class EulerAngles;
00034 template <class T> class Rotation;
00035 template <class T> class Transform;
00036 template <class T> class Quaternion;
00037
00074 template <class T>
00075 class EulerAngles: public Vec3<T> {
00076 public:
00078 EulerAngles();
00079 EulerAngles(const T roll, const T pitch, const T yaw);
00080 EulerAngles(const Vec<T,3>& v);
00081 EulerAngles(const Quaternion<T>& q);
00082 EulerAngles(const Rotation<T>& r);
00083
00085 void set(const Vec<T,3>& v);
00086 void set(const T roll, const T pitch, const T yaw);
00087 void set(const Quaternion<T>& q);
00088 void set(const Rotation<T>& r);
00089 void bound();
00090
00092 T yaw() const;
00093 T pitch() const;
00094 T roll() const;
00095 Vec3<T> toDegrees();
00096
00098 using Vec3<T>::x;
00099 };
00100
00101
00102 typedef EulerAngles<float> EulerAnglesf;
00103 typedef EulerAngles<double> EulerAnglesd;
00104
00105
00106
00107
00108
00111 template <class T>
00112 inline EulerAngles<T>::EulerAngles() {
00113 set(T(0),T(0),T(0));
00114 }
00115
00119 template <class T>
00120 inline EulerAngles<T>::EulerAngles(const T roll,
00121 const T pitch,
00122 const T yaw) {
00123 set(roll,pitch,yaw);
00124 }
00125
00128 template <class T>
00129 inline EulerAngles<T>::EulerAngles(const Vec<T,3>& v) : Vec3<T>(v) {
00130 bound();
00131 }
00132
00135 template <class T>
00136 inline EulerAngles<T>::EulerAngles(const Quaternion<T>& q) {
00137 set(q);
00138 }
00139
00142 template <class T>
00143 inline EulerAngles<T>::EulerAngles(const Rotation<T>& r) {
00144 set(r);
00145 }
00146
00147
00148
00151 template <class T>
00152 inline void EulerAngles<T>::set(const Vec<T,3>& v) {
00153 Vec<T,3>::set(v);
00154 bound();
00155 }
00156
00159 template <class T>
00160 inline void EulerAngles<T>::set(const T roll, const T pitch, const T yaw) {
00161 x[0] = roll; x[1] = pitch; x[2] = yaw;
00162 bound();
00163 }
00164
00167 template <class T>
00168 inline void EulerAngles<T>::set(const Quaternion<T>& q) {
00169 set(atan2(T(2)*(q.x[2]*q.x[3] + q.x[0]*q.x[1]),q.x[0]*q.x[0] - q.x[1]*q.x[1] - q.x[2]*q.x[2] + q.x[3]*q.x[3]),
00170 asin(T(-2)*(q.x[1]*q.x[3] - q.x[0]*q.x[2])),
00171 atan2(T(2)*(q.x[1]*q.x[2] + q.x[0]*q.x[3]),q.x[0]*q.x[0] + q.x[1]*q.x[1] - q.x[2]*q.x[2] - q.x[3]*q.x[3]));
00172 }
00173
00176 template <class T>
00177 inline void EulerAngles<T>::set(const Rotation<T>& r) {
00178 set((T)atan2(double(r.x[7]),double(r.x[8])),
00179 (T)asin(-double(r.x[6])),
00180 (T)atan2(double(r.x[3]),double(r.x[0])));
00181 }
00182
00186 template <class T>
00187 inline void EulerAngles<T>::bound() {
00188 for (int i=0;i<3;i++) {
00189 x[i] = fmod(x[i],T(TWOPI));
00190 if (x[i] > T(PI)) x[i] -= T(TWOPI);
00191 if (x[i] < -T(PI)) x[i] += T(TWOPI);
00192 }
00193 if (rtc_abs(x[1]) > T(PI_2)) {
00194 x[0] -= rtc_sign(x[0])*T(PI);
00195 x[1] = rtc_sign(x[1])*(T(PI) - rtc_abs(x[1]));
00196 x[2] -= rtc_sign(x[2])*T(PI);
00197 }
00198 }
00199
00202 template <class T>
00203 inline T EulerAngles<T>::roll() const { return x[0]; }
00204
00207 template <class T>
00208 inline T EulerAngles<T>::pitch() const { return x[1]; }
00209
00212 template <class T>
00213 inline T EulerAngles<T>::yaw() const { return x[2]; }
00214
00217 template <class T>
00218 inline Vec3<T> EulerAngles<T>::toDegrees() {
00219 return Vec3<T>((T)R2D*x[0],(T)R2D*x[1],(T)R2D*x[2]);
00220 }
00221
00222
00223 }
00224
00225 #endif // RTC_EULERANGLES_H defined
00226