4 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
19 #if defined (_EULER_ANGLES_H) && defined (_VECTOR_H)
24 #define RAD2DEG 57.2957795
25 #define DEG2RAD 0.0174532925
27 template <typename TYPE>
28 euler_angles<TYPE>::euler_angles() : m_ang(EULER_SIZE)
32 template <typename TYPE>
33 euler_angles<TYPE>::euler_angles(const TYPE roll, const TYPE pitch, const TYPE yaw)
35 TYPE euler_data[EULER_SIZE] = {roll, pitch, yaw};
37 vect<TYPE> v(EULER_SIZE, euler_data);
41 template <typename TYPE>
42 euler_angles<TYPE>::euler_angles(const vect<TYPE> v)
47 template <typename TYPE>
48 euler_angles<TYPE>::euler_angles(const euler_angles<TYPE>& e)
53 template <typename TYPE>
54 euler_angles<TYPE>::~euler_angles()
59 template <typename TYPE>
60 euler_angles<TYPE> euler_angles<TYPE>::operator =(const euler_angles<TYPE>& e)
68 euler_angles<T> quat2euler(const quaternion<T> q)
71 T R11, R21, R31, R32, R33;
74 w = q.m_quat.m_vec[0];
75 x = q.m_quat.m_vec[1];
76 y = q.m_quat.m_vec[2];
77 z = q.m_quat.m_vec[3];
79 R11 = 2 * (w * w) - 1 + 2 * (x * x);
80 R21 = 2 * ((x * y) - (w * z));
81 R31 = 2 * ((x * z) + (w * y));
82 R32 = 2 * ((y * z) - (w * x));
83 R33 = 2 * (w * w) - 1 + 2 * (z * z);
85 phi = atan2(R32, R33);
86 theta = -atan(R31 / sqrt(1 - (R31 * R31)));
87 psi = atan2(R21, R11);
89 euler_angles<T> e(phi, theta, psi);
95 euler_angles<T> rad2deg(const euler_angles<T> e)
97 return (e.m_ang * (T) RAD2DEG);
100 template <typename T>
101 euler_angles<T> deg2rad(const euler_angles<T> e)
103 return (e.m_ang * (T) DEG2RAD);
106 #endif //_EULER_ANGLES_H