@@ -43,13 +43,11 @@ static spi_bb_state m_spi_bb;
43
43
static ICM20948_STATE m_icm20948_state ;
44
44
static BMI_STATE m_bmi_state ;
45
45
static imu_config m_settings ;
46
- static float m_gyro_offset [3 ] = {0.0 };
47
46
static systime_t init_time ;
48
47
static bool imu_ready ;
49
48
50
49
// Private functions
51
50
static void imu_read_callback (float * accel , float * gyro , float * mag );
52
- static void terminal_gyro_info (int argc , const char * * argv );
53
51
static void rotate (float * input , float * rotation , float * output );
54
52
int8_t user_i2c_read (uint8_t dev_addr , uint8_t reg_addr , uint8_t * data , uint16_t len );
55
53
int8_t user_i2c_write (uint8_t dev_addr , uint8_t reg_addr , uint8_t * data , uint16_t len );
@@ -58,7 +56,6 @@ int8_t user_spi_write(uint8_t dev_id, uint8_t reg_addr, uint8_t *data, uint16_t
58
56
59
57
void imu_init (imu_config * set ) {
60
58
m_settings = * set ;
61
- memset (m_gyro_offset , 0 , sizeof (m_gyro_offset ));
62
59
63
60
imu_stop ();
64
61
imu_reset_orientation ();
@@ -112,19 +109,13 @@ void imu_init(imu_config *set) {
112
109
imu_init_bmi160_i2c (HW_I2C_SDA_PORT , HW_I2C_SDA_PIN ,
113
110
HW_I2C_SCL_PORT , HW_I2C_SCL_PIN );
114
111
}
115
-
116
- terminal_register_command_callback (
117
- "imu_gyro_info" ,
118
- "Print gyro offsets" ,
119
- 0 ,
120
- terminal_gyro_info );
121
112
}
122
113
123
114
void imu_reset_orientation (void ) {
124
115
imu_ready = false;
125
116
init_time = chVTGetSystemTimeX ();
126
117
ahrs_init_attitude_info (& m_att );
127
- FusionAhrsInitialise (& m_fusionAhrs , 2 .0 , 20 .0 );
118
+ FusionAhrsInitialise (& m_fusionAhrs , 10 .0 , 1 .0 );
128
119
ahrs_update_all_parameters (1.0 , 10.0 , 0.0 , 2.0 );
129
120
}
130
121
@@ -298,9 +289,6 @@ void imu_get_calibration(float yaw, float *imu_cal) {
298
289
float backup_gyro_offset_x = m_settings .gyro_offsets [0 ];
299
290
float backup_gyro_offset_y = m_settings .gyro_offsets [1 ];
300
291
float backup_gyro_offset_z = m_settings .gyro_offsets [2 ];
301
- float backup_gyro_comp_x = m_settings .gyro_offset_comp_fact [0 ];
302
- float backup_gyro_comp_y = m_settings .gyro_offset_comp_fact [1 ];
303
- float backup_gyro_comp_z = m_settings .gyro_offset_comp_fact [2 ];
304
292
305
293
// Override settings
306
294
m_settings .sample_rate_hz = 1000 ;
@@ -315,14 +303,6 @@ void imu_get_calibration(float yaw, float *imu_cal) {
315
303
m_settings .gyro_offsets [0 ] = 0 ;
316
304
m_settings .gyro_offsets [1 ] = 0 ;
317
305
m_settings .gyro_offsets [2 ] = 0 ;
318
- m_settings .gyro_offset_comp_fact [0 ] = 0 ;
319
- m_settings .gyro_offset_comp_fact [1 ] = 0 ;
320
- m_settings .gyro_offset_comp_fact [2 ] = 0 ;
321
-
322
- // Clear computed offsets
323
- m_gyro_offset [0 ] = 0 ;
324
- m_gyro_offset [1 ] = 0 ;
325
- m_gyro_offset [2 ] = 0 ;
326
306
327
307
// Sample gyro for offsets
328
308
float original_gyro_offsets [3 ] = {0 , 0 , 0 };
@@ -419,18 +399,18 @@ void imu_get_calibration(float yaw, float *imu_cal) {
419
399
m_settings .gyro_offsets [0 ] = backup_gyro_offset_x ;
420
400
m_settings .gyro_offsets [1 ] = backup_gyro_offset_y ;
421
401
m_settings .gyro_offsets [2 ] = backup_gyro_offset_z ;
422
- m_settings .gyro_offset_comp_fact [0 ] = backup_gyro_comp_x ;
423
- m_settings .gyro_offset_comp_fact [1 ] = backup_gyro_comp_y ;
424
- m_settings .gyro_offset_comp_fact [2 ] = backup_gyro_comp_z ;
425
402
426
403
ahrs_init_attitude_info (& m_att );
427
404
FusionAhrsReinitialise (& m_fusionAhrs );
428
405
}
429
406
430
407
static void imu_read_callback (float * accel , float * gyro , float * mag ) {
431
408
static uint32_t last_time = 0 ;
409
+
410
+ chSysLock ();
432
411
float dt = timer_seconds_elapsed_since (last_time );
433
412
last_time = timer_time_now ();
413
+ chSysUnlock ();
434
414
435
415
if (!imu_ready && ST2MS (chVTGetSystemTimeX () - init_time ) > 1000 ) {
436
416
ahrs_update_all_parameters (
@@ -440,7 +420,7 @@ static void imu_read_callback(float *accel, float *gyro, float *mag) {
440
420
m_settings .madgwick_beta );
441
421
442
422
FusionAhrsSetGain (& m_fusionAhrs , m_settings .madgwick_beta );
443
- FusionAhrsSetInitialGain (& m_fusionAhrs , m_settings .madgwick_beta * 10.0 );
423
+ FusionAhrsSetAccConfDecay (& m_fusionAhrs , m_settings .accel_confidence_decay );
444
424
445
425
imu_ready = true;
446
426
}
@@ -492,15 +472,6 @@ static void imu_read_callback(float *accel, float *gyro, float *mag) {
492
472
for (int i = 0 ; i < 3 ; i ++ ) {
493
473
m_accel [i ] -= m_settings .accel_offsets [i ];
494
474
m_gyro [i ] -= m_settings .gyro_offsets [i ];
495
-
496
- if (m_settings .gyro_offset_comp_fact [i ] > 0.0 ) {
497
- utils_step_towards (& m_gyro_offset [i ], m_gyro [i ], m_settings .gyro_offset_comp_fact [i ] * dt );
498
- utils_truncate_number_abs (& m_gyro_offset [i ], m_settings .gyro_offset_comp_clamp );
499
- } else {
500
- m_gyro_offset [i ] = 0.0 ;
501
- }
502
-
503
- m_gyro [i ] -= m_gyro_offset [i ];
504
475
}
505
476
506
477
float gyro_rad [3 ];
@@ -535,16 +506,6 @@ static void imu_read_callback(float *accel, float *gyro, float *mag) {
535
506
}
536
507
}
537
508
538
- static void terminal_gyro_info (int argc , const char * * argv ) {
539
- (void )argc ;
540
- (void )argv ;
541
-
542
- commands_printf ("Gyro offsets: [%.3f %.3f %.3f]\n" ,
543
- (double )(m_settings .gyro_offsets [0 ] + m_gyro_offset [0 ]),
544
- (double )(m_settings .gyro_offsets [1 ] + m_gyro_offset [1 ]),
545
- (double )(m_settings .gyro_offsets [2 ] + m_gyro_offset [2 ]));
546
- }
547
-
548
509
void rotate (float * input , float * rotation , float * output ) {
549
510
// Rotate imu offsets to match
550
511
float s1 = sinf (rotation [2 ] * M_PI / 180.0 );
0 commit comments