30 #ifndef AHRS_FLOAT_UTILS_H
31 #define AHRS_FLOAT_UTILS_H
42 const float phi = atan2f(-accel->
y, -accel->
z);
43 const float cphi = cosf(phi);
44 const float theta = atan2f(cphi * accel->
x, -accel->
z);
48 const float sphi = sinf(phi);
49 const float ctheta = cosf(theta);
50 const float stheta = sinf(theta);
51 const float mn = ctheta * mag->
x + sphi * stheta * mag->
y + cphi * stheta * mag->
z;
52 const float me = 0. * mag->
x + cphi * mag->
y - sphi * mag->
z;
53 float psi = -atan2f(me, mn) + atan2(AHRS_H_Y, AHRS_H_X);
54 if (psi > M_PI) { psi -= 2.*M_PI; }
if (psi < -M_PI) { psi += 2.*M_PI; }
66 if (ABS(acc_normalized.
z - 1.0) < 5 * FLT_MIN) {
75 q->
qx = - acc_normalized.
y;
76 q->
qy = acc_normalized.
x;
78 q->
qi = 1.0 - acc_normalized.
z;
101 float dot = mag_ltp.
x * AHRS_H_X + mag_ltp.
y * AHRS_H_Y;
108 if (ABS(norm2 + dot) < 5 * FLT_MIN) {
114 q_m.
qz = mag_ltp.
x * AHRS_H_Y - mag_ltp.
y * AHRS_H_X;
115 q_m.
qi = norm2 + dot;
#define EULERS_ASSIGN(_e, _phi, _theta, _psi)
static void ahrs_float_get_quat_from_accel(struct FloatQuat *q, struct FloatVect3 *accel)
Compute a quaternion representing roll and pitch from an accelerometer measurement.
static void ahrs_float_get_euler_from_accel_mag(struct FloatEulers *e, struct FloatVect3 *accel, struct FloatVect3 *mag)
static void float_vect3_normalize(struct FloatVect3 *v)
normalize 3D vector in place
void float_rmat_transp_vmult(struct FloatVect3 *vb, struct FloatRMat *m_b2a, struct FloatVect3 *va)
rotate 3D vector by transposed rotation matrix.
Paparazzi floating point algebra.
void float_rmat_of_quat(struct FloatRMat *rm, struct FloatQuat *q)
#define QUAT_ASSIGN(_q, _i, _x, _y, _z)
static void float_quat_normalize(struct FloatQuat *q)
static void ahrs_float_get_quat_from_accel_mag(struct FloatQuat *q, struct FloatVect3 *accel, struct FloatVect3 *mag)
void float_quat_comp_norm_shortest(struct FloatQuat *a2c, struct FloatQuat *a2b, struct FloatQuat *b2c)
Composition (multiplication) of two quaternions with normalization.