22
33// ----------------- Initialization -------------------
44
5+ float imuFilter::timeStep () {
6+ return dt;
7+ }
8+
59void imuFilter::updateTimer () {
610 uint32_t time_now = micros ();
711 uint32_t change_time = time_now - last_time;
@@ -15,10 +19,10 @@ void imuFilter::setup() {
1519 last_time = micros ();
1620}
1721
18- void imuFilter::setup ( float ax, float ay, float az ) {
22+ void imuFilter::setup ( vec3_t accel ) {
1923 setup ();
2024 // set quaternion as vertical vector
21- vec3_t v = vec3_t (ax, ay, az) .norm (); // gravity vector
25+ vec3_t v = accel .norm (); // gravity vector
2226
2327 float norm = v.x *v.x + v.y *v.y ;
2428 float cosine = v.z /sqrt ( norm + v.z *v.z ) * 0.5 ; // vertical angle
@@ -28,8 +32,8 @@ void imuFilter::setup( float ax, float ay, float az ) {
2832 q.v = vec3_t (v.y *norm, -v.x *norm, 0 );
2933}
3034
31- void imuFilter::setup ( vec3_t accel ) {
32- setup ( accel. x , accel. y , accel. z );
35+ void imuFilter::setup ( float ax, float ay, float az ) {
36+ setup ( vec3_t (ax, ay, az) );
3337}
3438
3539// ---------------- Heading estimate ------------------
@@ -53,29 +57,31 @@ void imuFilter::update( float gx, float gy, float gz ) {
5357
5458void imuFilter::update ( float gx, float gy, float gz,
5559 float ax, float ay, float az,
56- const float ALPHA /* =DEFAULT_GAIN*/ ,
57- const float SD_ACC /* =DEFAULT_SD*/ ) {
60+ const float ALPHA,
61+ const float SD_ACC,
62+ const float GRAVITY ) {
5863 // Update Timer
5964 updateTimer ();
6065
6166 // check global acceleration:
6267 vec3_t accel = {ax, ay, az};
63- vec3_t acrel = q.rotate (accel, GLOBAL_FRAME) - vec3_t (0 ,0 ,1 );
68+ vec3_t acrel = q.rotate (accel, GLOBAL_FRAME);
69+ acrel.z -= GRAVITY;
6470
6571 // kalmal filter:
6672 const float INV_VAR = 1.0 /( SD_ACC * SD_ACC );
6773 float error = acrel.dot (acrel); // deviation from vertical
6874
69- float gain = ALPHA * dt;
70- gain = gain/(1 + var*INV_VAR); // kalman gain
75+ float gain = 1.0 /(1 + var*INV_VAR); // kalman gain
7176 var = error + var*gain; // variance of error
72-
77+
7378 // error about vertical
7479 vec3_t vz = q.axisZ (LOCAL_FRAME);
7580 vec3_t ve = accel.norm ();
7681 ve = ve.cross (vz);
7782
7883 // Rotation increment
84+ gain *= ALPHA * dt;
7985 vec3_t da = vec3_t (gx, gy, gz)*dt + ve*gain;
8086 quat_t dq; dq.setRotation (da, SMALL_ANGLE);
8187
@@ -90,8 +96,9 @@ void imuFilter::update( vec3_t gyro ) {
9096}
9197
9298void imuFilter::update ( vec3_t gyro, vec3_t accel,
93- const float ALPHA /* =DEFAULT_GAIN*/ ,
94- const float SD_ACC /* =DEFAULT_SD*/ ) {
99+ const float ALPHA,
100+ const float SD_ACC,
101+ const float GRAVITY ) {
95102 update ( gyro.x , gyro.y , gyro.z ,
96103 accel.x , accel.y , accel.z ,
97104 ALPHA, SD_ACC );
@@ -134,10 +141,6 @@ vec3_t imuFilter::projectVector( vec3_t vec, const bool TO_WORLD ) {
134141 return q.rotate (vec, TO_WORLD);
135142}
136143
137- float imuFilter::timeStep () {
138- return dt;
139- }
140-
141144// ------------------ Euler Angles -------------------
142145
143146float imuFilter::roll () { // x-axis
0 commit comments