Larus glider flight sensor system 3.9.2024
Software-In-The-Loop test and validation system
Loading...
Searching...
No Matches
quaternion.h
Go to the documentation of this file.
1/***********************************************************************/
25#ifndef QUATERNION_H
26#define QUATERNION_H
27
28#include "embedded_math.h"
29#include "vector.h"
30#include "float3matrix.h"
31#include "float3vector.h"
32#include "euler.h"
33
35template <class datatype > class quaternion: public vector <datatype, 4>
36{
37public:
43
46 : vector <datatype, 4>({0})
47 {
49 };
50
63
65 operator eulerangle <datatype> () const
66 {
71
73
75 _euler.r = ATAN2( TWO * (e0*e1 + e2*e3) , e0*e0 - e1*e1 - e2*e2 + e3*e3 );
76 _euler.p = ASIN( TWO * (e0*e2 - e3*e1));
77 _euler.y = ATAN2( TWO * (e0*e3 + e1*e2) , e0*e0 + e1*e1 - e2*e2 - e3*e3 );
78 return _euler;
79 }
89
99
101 inline datatype get_down( void) const
102 {
103 datatype e0 = this->e[0];
104 datatype e1 = this->e[1];
105 datatype e2 = this->e[2];
106 datatype e3 = this->e[3];
107 return TWO * (e1*e3-e0*e2);
108 }
109
112 {
117
118 return ATAN2( TWO * (e0*e3 + e1*e2) , e0*e0 + e1*e1 - e2*e2 - e3*e3 );
119 }
120
123 {
128
130 vector<datatype, 4>::e[0] += (-e1*p -e2*q -e3*r);
131 vector<datatype, 4>::e[1] += ( e0*p +e2*r -e3*q);
132 vector<datatype, 4>::e[2] += ( e0*q -e1*r +e3*p);
133 vector<datatype, 4>::e[3] += ( e0*r +e1*q -e2*p);
134
135 normalize();
136 }
137
154
157 {
163
164 m.e[0][0] = TWO * (e0*e0+e1*e1) - ONE;
165 m.e[0][1] = TWO * (e1*e2-e0*e3);
166 m.e[0][2] = TWO * (e1*e3+e0*e2);
167
168 m.e[1][0] = TWO * (e1*e2+e0*e3);
169 m.e[1][1] = TWO * (e0*e0+e2*e2) - ONE;
170 m.e[1][2] = TWO * (e2*e3-e0*e1);
171
172 m.e[2][0] = TWO * (e1*e3-e0*e2);
173 m.e[2][1] = TWO * (e2*e3+e0*e1);
174 m.e[2][2] = TWO * (e0*e0+e3*e3) - ONE;
175 }
193
195 {
196 float tmp;
197 tmp = ONE + rotm.e[0][0] + rotm.e[1][1] + rotm.e[2][2];
199 tmp = SQRT( tmp);
200 tmp *= HALF;
202 tmp = QUARTER / tmp;
203 vector<datatype, 4>::e[1] = tmp * (rotm.e[2][1] - rotm.e[1][2]);
204 vector<datatype, 4>::e[2] = tmp * (rotm.e[0][2] - rotm.e[2][0]);
205 vector<datatype, 4>::e[3] = tmp * (rotm.e[1][0] - rotm.e[0][1]);
206 normalize(); // compensate computational inaccuracies
207 };
208};
209
210#endif // QUATERNION_H
maintain attitude and provide coordinate transformation services
Definition quaternion.h:36
datatype get_north(void) const
get north component of attitude
Definition quaternion.h:81
void from_euler(datatype p, datatype q, datatype r)
euler angle -> quaternion transformation
Definition quaternion.h:139
quaternion(vector< datatype, 3 > &init)
constructor from euler angle
Definition quaternion.h:39
datatype get_down(void) const
get down component of attitude
Definition quaternion.h:101
datatype get_east(void) const
get east component of attitude
Definition quaternion.h:91
void get_rotation_matrix(matrix< datatype, 3 > &m) const
quaternion -> rotation matrix transformation
Definition quaternion.h:156
void rotate(datatype p, datatype q, datatype r)
quaternion update using rotation vector
Definition quaternion.h:122
datatype get_heading(void) const
get heading component of attitude
Definition quaternion.h:111
quaternion()
constructor from datatype[4]
Definition quaternion.h:45
void normalize(void)
normalize quaternion absolute value to ONE
Definition quaternion.h:52
quaternion< datatype > operator*(quaternion< datatype > &right)
Definition quaternion.h:176
void from_rotation_matrix(matrix< datatype, 3 > &rotm)
Definition quaternion.h:194
mathematical vector of arbitrary type and size
Definition vector.h:40
defines platform-dependent algorithms and constants
#define ONE
#define SIN(x)
#define HALF
#define ASIN(x)
#define QUARTER
#define TWO
#define COS(x)
#define SQRT(x)
#define ATAN2(y, x)
Euler angle class implementation.
linear algebra implementation