Paparazzi UAS  v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
pprz_algebra_double.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2008-2014 The Paparazzi Team
3  *
4  * This file is part of paparazzi.
5  *
6  * paparazzi is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2, or (at your option)
9  * any later version.
10  *
11  * paparazzi is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with paparazzi; see the file COPYING. If not, see
18  * <http://www.gnu.org/licenses/>.
19  */
20 
31 #ifndef PPRZ_ALGEBRA_DOUBLE_H
32 #define PPRZ_ALGEBRA_DOUBLE_H
33 
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37 
38 #include "pprz_algebra.h"
39 #include "pprz_algebra_float.h"
40 
41 struct DoubleVect2 {
42  double x;
43  double y;
44 };
45 
46 struct DoubleVect3 {
47  double x;
48  double y;
49  double z;
50 };
51 
55 struct DoubleQuat {
56  double qi;
57  double qx;
58  double qy;
59  double qz;
60 };
61 
62 struct DoubleMat33 {
63  double m[3 * 3];
64 };
65 
69 struct DoubleRMat {
70  double m[3 * 3];
71 };
72 
76 struct DoubleEulers {
77  double phi;
78  double theta;
79  double psi;
80 };
81 
85 struct DoubleRates {
86  double p;
87  double q;
88  double r;
89 };
90 
91 #define DOUBLE_VECT3_ROUND(_v) DOUBLE_VECT3_RINT(_v, _v)
92 
93 
94 #define DOUBLE_VECT3_RINT(_vout, _vin) { \
95  (_vout).x = rint((_vin).x); \
96  (_vout).y = rint((_vin).y); \
97  (_vout).z = rint((_vin).z); \
98  }
99 
100 static inline double double_vect3_norm(struct DoubleVect3 *v)
101 {
102  return sqrt(VECT3_NORM2(*v));
103 }
104 
106 static inline void double_vect3_normalize(struct DoubleVect3 *v)
107 {
108  const double n = double_vect3_norm(v);
109  if (n > 0) {
110  v->x /= n;
111  v->y /= n;
112  v->z /= n;
113  }
114 }
115 
116 
118 static inline void double_quat_identity(struct DoubleQuat *q)
119 {
120  q->qi = 1.0;
121  q->qx = 0;
122  q->qy = 0;
123  q->qz = 0;
124 }
125 
126 static inline double double_quat_norm(struct DoubleQuat *q)
127 {
128  return sqrt(SQUARE(q->qi) + SQUARE(q->qx) + SQUARE(q->qy) + SQUARE(q->qz));
129 }
130 
131 
132 static inline void double_quat_normalize(struct DoubleQuat *q)
133 {
134  double qnorm = double_quat_norm(q);
135  if (qnorm > FLT_MIN) {
136  q->qi = q->qi / qnorm;
137  q->qx = q->qx / qnorm;
138  q->qy = q->qy / qnorm;
139  q->qz = q->qz / qnorm;
140  }
141 }
142 
155 extern void double_rmat_of_eulers_321(struct DoubleRMat *rm, struct DoubleEulers *e);
156 extern void double_quat_of_eulers(struct DoubleQuat *q, struct DoubleEulers *e);
157 extern void double_eulers_of_quat(struct DoubleEulers *e, struct DoubleQuat *q);
158 extern void double_quat_vmult(struct DoubleVect3 *v_out, struct DoubleQuat *q, struct DoubleVect3 *v_in);
159 
163 extern void double_quat_comp(struct DoubleQuat *a2c, struct DoubleQuat *a2b, struct DoubleQuat *b2c);
164 
166 static inline void double_rmat_identity(struct DoubleRMat *rm)
167 {
168  FLOAT_MAT33_DIAG(*rm, 1., 1., 1.);
169 }
170 
174 extern void double_rmat_inv(struct DoubleRMat *m_b2a, struct DoubleRMat *m_a2b);
175 
179 extern void double_rmat_comp(struct DoubleRMat *m_a2c, struct DoubleRMat *m_a2b,
180  struct DoubleRMat *m_b2c);
181 
185 extern void double_rmat_vmult(struct DoubleVect3 *vb, struct DoubleRMat *m_a2b,
186  struct DoubleVect3 *va);
187 
191 extern void double_rmat_transp_vmult(struct DoubleVect3 *vb, struct DoubleRMat *m_b2a,
192  struct DoubleVect3 *va);
193 
194 extern void double_rmat_of_quat(struct DoubleRMat *rm, struct DoubleQuat *q);
195 static inline void double_rmat_of_eulers(struct DoubleRMat *rm, struct DoubleEulers *e)
196 {
198 }
199 
200 /* defines for backwards compatibility */
201 #define DOUBLE_RMAT_OF_EULERS(_rm, _e) WARNING("DOUBLE_RMAT_OF_EULERS macro is deprecated, use the lower case function instead") double_rmat_of_eulers(&(_rm), &(_e))
202 #define DOUBLE_RMAT_OF_EULERS_321(_rm, _e) WARNING("DOUBLE_RMAT_OF_EULERS_321 macro is deprecated, use the lower case function instead") double_rmat_of_eulers(&(_rm), &(_e))
203 #define DOUBLE_QUAT_OF_EULERS(_q, _e) WARNING("DOUBLE_QUAT_OF_EULERS macro is deprecated, use the lower case function instead") double_quat_of_eulers(&(_q), &(_e))
204 #define DOUBLE_EULERS_OF_QUAT(_e, _q) WARNING("DOUBLE_EULERS_OF_QUAT macro is deprecated, use the lower case function instead") double_eulers_of_quat(&(_e), &(_q))
205 #define DOUBLE_QUAT_VMULT(v_out, q, v_in) WARNING("DOUBLE_QUAT_VMULT macro is deprecated, use the lower case function instead") double_quat_vmult(&(v_out), &(q), &(v_in))
206 
207 #ifdef __cplusplus
208 } /* extern "C" */
209 #endif
210 
211 #endif /* PPRZ_ALGEBRA_DOUBLE_H */
double psi
in radians
double m[3 *3]
double p
in rad/s^2
double theta
in radians
double m[3 *3]
double q
in rad/s^2
double phi
in radians
double r
in rad/s^2
void double_eulers_of_quat(struct DoubleEulers *e, struct DoubleQuat *q)
static double double_quat_norm(struct DoubleQuat *q)
void double_quat_vmult(struct DoubleVect3 *v_out, struct DoubleQuat *q, struct DoubleVect3 *v_in)
static void double_rmat_of_eulers(struct DoubleRMat *rm, struct DoubleEulers *e)
void double_rmat_vmult(struct DoubleVect3 *vb, struct DoubleRMat *m_a2b, struct DoubleVect3 *va)
rotate 3D vector by rotation matrix.
void double_rmat_inv(struct DoubleRMat *m_b2a, struct DoubleRMat *m_a2b)
Inverse/transpose of a rotation matrix.
static void double_vect3_normalize(struct DoubleVect3 *v)
normalize 3D vector in place
static void double_rmat_identity(struct DoubleRMat *rm)
initialises a rotation matrix to identity
void double_quat_comp(struct DoubleQuat *a2c, struct DoubleQuat *a2b, struct DoubleQuat *b2c)
Composition (multiplication) of two quaternions.
void double_rmat_of_eulers_321(struct DoubleRMat *rm, struct DoubleEulers *e)
Rotation matrix from 321 Euler angles (double).
static void double_quat_normalize(struct DoubleQuat *q)
void double_quat_of_eulers(struct DoubleQuat *q, struct DoubleEulers *e)
void double_rmat_transp_vmult(struct DoubleVect3 *vb, struct DoubleRMat *m_b2a, struct DoubleVect3 *va)
rotate 3D vector by transposed rotation matrix.
static void double_quat_identity(struct DoubleQuat *q)
initialises a quaternion to identity
void double_rmat_comp(struct DoubleRMat *m_a2c, struct DoubleRMat *m_a2b, struct DoubleRMat *m_b2c)
Composition (multiplication) of two rotation matrices.
static double double_vect3_norm(struct DoubleVect3 *v)
void double_rmat_of_quat(struct DoubleRMat *rm, struct DoubleQuat *q)
euler angles
Roation quaternion.
rotation matrix
angular rates
#define FLOAT_MAT33_DIAG(_m, _d00, _d11, _d22)
#define SQUARE(_a)
Definition: pprz_algebra.h:48
#define VECT3_NORM2(_v)
Definition: pprz_algebra.h:252
Paparazzi generic algebra macros.
Paparazzi floating point algebra.