1
- // =====================================================================================================
1
+ // =============================================================================================
2
2
// MadgwickAHRS.c
3
- // =====================================================================================================
3
+ // =============================================================================================
4
4
//
5
5
// Implementation of Madgwick's IMU and AHRS algorithms.
6
6
// See: http://www.x-io.co.uk/open-source-imu-and-ahrs-algorithms/
14
14
// 02/10/2011 SOH Madgwick Optimised for reduced CPU load
15
15
// 19/02/2012 SOH Madgwick Magnetometer measurement is normalised
16
16
//
17
- // =====================================================================================================
17
+ // =============================================================================================
18
18
19
- // ---------------------------------------------------------------------------------------------------
19
+ // -------------------------------------------------------------------------------------------
20
20
// Header files
21
21
22
22
#include " MadgwickAHRS.h"
23
23
#include < math.h>
24
24
25
- // ---------------------------------------------------------------------------------------------------
25
+ // -------------------------------------------------------------------------------------------
26
26
// Definitions
27
27
28
+ #define sampleFreqDef 512 .0f // sample frequency in Hz
29
+ #define betaDef 0 .1f // 2 * proportional gain
28
30
29
31
30
- // ====================================================================================================
32
+ // ============================================================================================
31
33
// Functions
32
34
33
- // ---------------------------------------------------------------------------------------------------
35
+ // -------------------------------------------------------------------------------------------
34
36
// AHRS algorithm update
35
37
36
38
Madgwick::Madgwick () {
@@ -39,6 +41,7 @@ Madgwick::Madgwick() {
39
41
q1 = 0 .0f ;
40
42
q2 = 0 .0f ;
41
43
q3 = 0 .0f ;
44
+ invSampleFreq = 1 .0f / sampleFreqDef;
42
45
}
43
46
44
47
void Madgwick::update (float gx, float gy, float gz, float ax, float ay, float az, float mx, float my, float mz) {
@@ -67,7 +70,7 @@ void Madgwick::update(float gx, float gy, float gz, float ax, float ay, float az
67
70
recipNorm = invSqrt (ax * ax + ay * ay + az * az);
68
71
ax *= recipNorm;
69
72
ay *= recipNorm;
70
- az *= recipNorm;
73
+ az *= recipNorm;
71
74
72
75
// Normalise magnetometer measurement
73
76
recipNorm = invSqrt (mx * mx + my * my + mz * mz);
@@ -124,10 +127,10 @@ void Madgwick::update(float gx, float gy, float gz, float ax, float ay, float az
124
127
}
125
128
126
129
// Integrate rate of change of quaternion to yield quaternion
127
- q0 += qDot1 * ( 1 . 0f / sampleFreq) ;
128
- q1 += qDot2 * ( 1 . 0f / sampleFreq) ;
129
- q2 += qDot3 * ( 1 . 0f / sampleFreq) ;
130
- q3 += qDot4 * ( 1 . 0f / sampleFreq) ;
130
+ q0 += qDot1 * invSampleFreq ;
131
+ q1 += qDot2 * invSampleFreq ;
132
+ q2 += qDot3 * invSampleFreq ;
133
+ q3 += qDot4 * invSampleFreq ;
131
134
132
135
// Normalise quaternion
133
136
recipNorm = invSqrt (q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3);
@@ -137,7 +140,7 @@ void Madgwick::update(float gx, float gy, float gz, float ax, float ay, float az
137
140
q3 *= recipNorm;
138
141
}
139
142
140
- // ---------------------------------------------------------------------------------------------------
143
+ // -------------------------------------------------------------------------------------------
141
144
// IMU algorithm update
142
145
143
146
void Madgwick::updateIMU (float gx, float gy, float gz, float ax, float ay, float az) {
@@ -195,10 +198,10 @@ void Madgwick::updateIMU(float gx, float gy, float gz, float ax, float ay, float
195
198
}
196
199
197
200
// Integrate rate of change of quaternion to yield quaternion
198
- q0 += qDot1 * ( 1 . 0f / sampleFreq) ;
199
- q1 += qDot2 * ( 1 . 0f / sampleFreq) ;
200
- q2 += qDot3 * ( 1 . 0f / sampleFreq) ;
201
- q3 += qDot4 * ( 1 . 0f / sampleFreq) ;
201
+ q0 += qDot1 * invSampleFreq ;
202
+ q1 += qDot2 * invSampleFreq ;
203
+ q2 += qDot3 * invSampleFreq ;
204
+ q3 += qDot4 * invSampleFreq ;
202
205
203
206
// Normalise quaternion
204
207
recipNorm = invSqrt (q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3);
@@ -208,7 +211,7 @@ void Madgwick::updateIMU(float gx, float gy, float gz, float ax, float ay, float
208
211
q3 *= recipNorm;
209
212
}
210
213
211
- // ---------------------------------------------------------------------------------------------------
214
+ // -------------------------------------------------------------------------------------------
212
215
// Fast inverse square-root
213
216
// See: http://en.wikipedia.org/wiki/Fast_inverse_square_root
214
217
@@ -222,6 +225,6 @@ float Madgwick::invSqrt(float x) {
222
225
return y;
223
226
}
224
227
225
- // ====================================================================================================
228
+ // ============================================================================================
226
229
// END OF CODE
227
- // ====================================================================================================
230
+ // ============================================================================================
0 commit comments