35 #define sampleFreq 51.136f
36 //#define betaDef 0.1f
39 #define M_PI 3.14159265358979323846
41 //---------------------------------------------------------------------------------------------------
45 volatile float q0 = 1.0f,
q1 = 0.0f,
q2 = 0.0f,
q3 = 0.0f;
92 void MadgwickAHRSupdate(
float gx,
float gy,
float gz,
float ax,
float ay,
float az,
float mx,
float my,
float mz) {
95 float qDot1, qDot2, qDot3, qDot4;
97 float _2q0mx, _2q0my, _2q0mz, _2q1mx, _2bx, _2bz, _4bx, _4bz, _2q0, _2q1, _2q2, _2q3, _2q0q2, _2q2q3, q0q0, q0q1, q0q2, q0q3, q1q1, q1q2, q1q3, q2q2, q2q3, q3q3;
100 if((mx == 0.0f) && (my == 0.0f) && (mz == 0.0f)) {
106 qDot1 = 0.5f * (-
q1 * gx -
q2 * gy -
q3 * gz);
107 qDot2 = 0.5f * (
q0 * gx +
q2 * gz -
q3 * gy);
108 qDot3 = 0.5f * (
q0 * gy -
q1 * gz +
q3 * gx);
109 qDot4 = 0.5f * (
q0 * gz +
q1 * gy -
q2 * gx);
112 if(!((ax == 0.0f) && (ay == 0.0f) && (az == 0.0f))) {
115 recipNorm =
invSqrt(ax * ax + ay * ay + az * az);
121 recipNorm =
invSqrt(mx * mx + my * my + mz * mz);
127 _2q0mx = 2.0f *
q0 * mx;
128 _2q0my = 2.0f *
q0 * my;
129 _2q0mz = 2.0f *
q0 * mz;
130 _2q1mx = 2.0f *
q1 * mx;
135 _2q0q2 = 2.0f *
q0 *
q2;
136 _2q2q3 = 2.0f *
q2 *
q3;
149 hx = mx * q0q0 - _2q0my *
q3 + _2q0mz *
q2 + mx * q1q1 + _2q1 * my *
q2 + _2q1 * mz *
q3 - mx * q2q2 - mx * q3q3;
150 hy = _2q0mx *
q3 + my * q0q0 - _2q0mz *
q1 + _2q1mx *
q2 - my * q1q1 + my * q2q2 + _2q2 * mz *
q3 - my * q3q3;
151 _2bx = sqrt(hx * hx + hy * hy);
152 _2bz = -_2q0mx *
q2 + _2q0my *
q1 + mz * q0q0 + _2q1mx *
q3 - mz * q1q1 + _2q2 * my *
q3 - mz * q2q2 + mz * q3q3;
157 s0 = -_2q2 * (2.0f * q1q3 - _2q0q2 - ax) + _2q1 * (2.0f * q0q1 + _2q2q3 - ay) - _2bz *
q2 * (_2bx * (0.5f - q2q2 - q3q3) + _2bz * (q1q3 - q0q2) - mx) + (-_2bx *
q3 + _2bz *
q1) * (_2bx * (q1q2 - q0q3) + _2bz * (q0q1 + q2q3) - my) + _2bx *
q2 * (_2bx * (q0q2 + q1q3) + _2bz * (0.5f - q1q1 - q2q2) - mz);
158 s1 = _2q3 * (2.0f * q1q3 - _2q0q2 - ax) + _2q0 * (2.0f * q0q1 + _2q2q3 - ay) - 4.0f *
q1 * (1 - 2.0f * q1q1 - 2.0f * q2q2 - az) + _2bz *
q3 * (_2bx * (0.5f - q2q2 - q3q3) + _2bz * (q1q3 - q0q2) - mx) + (_2bx *
q2 + _2bz *
q0) * (_2bx * (q1q2 - q0q3) + _2bz * (q0q1 + q2q3) - my) + (_2bx *
q3 - _4bz *
q1) * (_2bx * (q0q2 + q1q3) + _2bz * (0.5f - q1q1 - q2q2) - mz);
159 s2 = -_2q0 * (2.0f * q1q3 - _2q0q2 - ax) + _2q3 * (2.0f * q0q1 + _2q2q3 - ay) - 4.0f *
q2 * (1 - 2.0f * q1q1 - 2.0f * q2q2 - az) + (-_4bx *
q2 - _2bz *
q0) * (_2bx * (0.5f - q2q2 - q3q3) + _2bz * (q1q3 - q0q2) - mx) + (_2bx *
q1 + _2bz *
q3) * (_2bx * (q1q2 - q0q3) + _2bz * (q0q1 + q2q3) - my) + (_2bx *
q0 - _4bz *
q2) * (_2bx * (q0q2 + q1q3) + _2bz * (0.5f - q1q1 - q2q2) - mz);
160 s3 = _2q1 * (2.0f * q1q3 - _2q0q2 - ax) + _2q2 * (2.0f * q0q1 + _2q2q3 - ay) + (-_4bx *
q3 + _2bz *
q1) * (_2bx * (0.5f - q2q2 - q3q3) + _2bz * (q1q3 - q0q2) - mx) + (-_2bx *
q0 + _2bz *
q2) * (_2bx * (q1q2 - q0q3) + _2bz * (q0q1 + q2q3) - my) + _2bx *
q1 * (_2bx * (q0q2 + q1q3) + _2bz * (0.5f - q1q1 - q2q2) - mz);
161 recipNorm =
invSqrt(s0 * s0 + s1 * s1 + s2 * s2 + s3 * s3);
219 float s0, s1, s2, s3;
220 float qDot1, qDot2, qDot3, qDot4;
221 float _2q0, _2q1, _2q2, _2q3, _4q0, _4q1, _4q2 ,_8q1, _8q2, q0q0, q1q1, q2q2, q3q3;
224 qDot1 = 0.5f * (-
q1 * gx -
q2 * gy -
q3 * gz);
225 qDot2 = 0.5f * (
q0 * gx +
q2 * gz -
q3 * gy);
226 qDot3 = 0.5f * (
q0 * gy -
q1 * gz +
q3 * gx);
227 qDot4 = 0.5f * (
q0 * gz +
q1 * gy -
q2 * gx);
230 if(!((ax == 0.0f) && (ay == 0.0f) && (az == 0.0f))) {
233 recipNorm =
invSqrt(ax * ax + ay * ay + az * az);
254 s0 = _4q0 * q2q2 + _2q2 * ax + _4q0 * q1q1 - _2q1 * ay;
255 s1 = _4q1 * q3q3 - _2q3 * ax + 4.0f * q0q0 *
q1 - _2q0 * ay - _4q1 + _8q1 * q1q1 + _8q1 * q2q2 + _4q1 * az;
256 s2 = 4.0f * q0q0 *
q2 + _2q0 * ax + _4q2 * q3q3 - _2q3 * ay - _4q2 + _8q2 * q1q1 + _8q2 * q2q2 + _4q2 * az;
257 s3 = 4.0f * q1q1 *
q3 - _2q1 * ax + 4.0f * q2q2 *
q3 - _2q2 * ay;
258 recipNorm =
invSqrt(s0 * s0 + s1 * s1 + s2 * s2 + s3 * s3);
290 float halfx = 0.5f * x;
293 i = 0x5f3759df - (i>>1);
295 y = y * (1.5f - (halfx * y * y));
355 double sinr_cosp = 2 * (
q0 *
q1 +
q2 *
q3);
356 double cosr_cosp = 1 - 2 * (
q1 *
q1 +
q2 *
q2);
357 roll = atan2(sinr_cosp, cosr_cosp);
360 double sinp = 2 * (
q0 *
q2 -
q3 *
q1);
367 double siny_cosp = 2 * (
q0 *
q3 +
q1 *
q2);
368 double cosy_cosp = 1 - 2 * (
q2 *
q2 +
q3 *
q3);
369 yaw = atan2(siny_cosp, cosy_cosp);
372 euler_angles[0] =
roll;
373 euler_angles[1] =
pitch;
374 euler_angles[2] =
yaw;