Paparazzi UAS v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
Loading...
Searching...
No Matches
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
35extern "C" {
36#endif
37
38#include "pprz_algebra.h"
39#include "pprz_algebra_float.h"
40
42 double x;
43 double y;
44};
45
47 double x;
48 double y;
49 double z;
50};
51
55struct DoubleQuat {
56 double qi;
57 double qx;
58 double qy;
59 double qz;
60};
61
63 double m[3 * 3];
64};
65
69struct DoubleRMat {
70 double m[3 * 3];
71};
72
77 double phi;
78 double theta;
79 double psi;
80};
81
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
100static inline double double_vect3_norm(struct DoubleVect3 *v)
101{
102 return sqrt(VECT3_NORM2(*v));
103}
104
106static 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
118static 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
126static 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
132static 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
155extern void double_rmat_of_eulers_321(struct DoubleRMat *rm, struct DoubleEulers *e);
156extern void double_quat_of_eulers(struct DoubleQuat *q, struct DoubleEulers *e);
157extern void double_eulers_of_quat(struct DoubleEulers *e, struct DoubleQuat *q);
158extern void double_quat_vmult(struct DoubleVect3 *v_out, struct DoubleQuat *q, struct DoubleVect3 *v_in);
159
163extern void double_quat_comp(struct DoubleQuat *a2c, struct DoubleQuat *a2b, struct DoubleQuat *b2c);
164
166static inline void double_rmat_identity(struct DoubleRMat *rm)
167{
168 FLOAT_MAT33_DIAG(*rm, 1., 1., 1.);
169}
170
174extern void double_rmat_inv(struct DoubleRMat *m_b2a, struct DoubleRMat *m_a2b);
175
179extern void double_rmat_comp(struct DoubleRMat *m_a2c, struct DoubleRMat *m_a2b,
180 struct DoubleRMat *m_b2c);
181
185extern void double_rmat_vmult(struct DoubleVect3 *vb, struct DoubleRMat *m_a2b,
186 struct DoubleVect3 *va);
187
191extern void double_rmat_transp_vmult(struct DoubleVect3 *vb, struct DoubleRMat *m_b2a,
192 struct DoubleVect3 *va);
193
194extern void double_rmat_of_quat(struct DoubleRMat *rm, struct DoubleQuat *q);
195static 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 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)
Roation quaternion.
rotation matrix
angular rates
#define FLOAT_MAT33_DIAG(_m, _d00, _d11, _d22)
#define SQUARE(_a)
#define VECT3_NORM2(_v)
uint16_t foo
Definition main_demo5.c:58
Paparazzi generic algebra macros.
Paparazzi floating point algebra.