|
1 | 1 | #include "imu.h"
|
2 | 2 |
|
| 3 | +#define IMU_DEFAULT_CALIBRATION_TIME_MS 3000 |
| 4 | + |
3 | 5 | namespace xrp {
|
4 | 6 |
|
5 | 7 | unsigned long _imuUpdatePeriod = 1000 / IMU_UPDATE_RATE_HZ;
|
@@ -40,6 +42,11 @@ void imuInit(uint8_t addr, TwoWire *theWire) {
|
40 | 42 | _imuReady = true;
|
41 | 43 | Serial.println("--- IMU ---");
|
42 | 44 | Serial.println("LSM6DSOX detected");
|
| 45 | + |
| 46 | + Serial.println("Setting update rate to 208Hz"); |
| 47 | + _lsm6.setGyroDataRate(LSM6DS_RATE_208_HZ); |
| 48 | + _lsm6.setAccelDataRate(LSM6DS_RATE_208_HZ); |
| 49 | + |
43 | 50 | Serial.print("Accel Range: ");
|
44 | 51 | switch (_lsm6.getAccelRange()) {
|
45 | 52 | case LSM6DS_ACCEL_RANGE_2_G:
|
@@ -79,6 +86,46 @@ void imuInit(uint8_t addr, TwoWire *theWire) {
|
79 | 86 | }
|
80 | 87 | }
|
81 | 88 |
|
| 89 | +void imuCalibrate(unsigned long calibrationTime) { |
| 90 | + unsigned long loopDelayTime = 1000 / 208; |
| 91 | + |
| 92 | + if (calibrationTime == 0) { |
| 93 | + calibrationTime = IMU_DEFAULT_CALIBRATION_TIME_MS; |
| 94 | + } |
| 95 | + |
| 96 | + Serial.printf("[IMU] Beginning calibration. Running for %u ms\n", calibrationTime); |
| 97 | + |
| 98 | + float gyroAvgValues[3] = {0, 0, 0}; |
| 99 | + int numVals = 0; |
| 100 | + |
| 101 | + unsigned long startTime = millis(); |
| 102 | + while (millis() < startTime + calibrationTime) { |
| 103 | + // Get IMU data |
| 104 | + sensors_event_t accel; |
| 105 | + sensors_event_t gyro; |
| 106 | + sensors_event_t temp; |
| 107 | + |
| 108 | + _lsm6.getEvent(&accel, &gyro, &temp); |
| 109 | + |
| 110 | + gyroAvgValues[0] += _radToDeg(gyro.gyro.x); |
| 111 | + gyroAvgValues[1] += _radToDeg(gyro.gyro.y); |
| 112 | + gyroAvgValues[2] += _radToDeg(gyro.gyro.z); |
| 113 | + |
| 114 | + numVals++; |
| 115 | + delay(loopDelayTime); |
| 116 | + } |
| 117 | + |
| 118 | + _gyroOffsetsDegPerSec[0] = gyroAvgValues[0] / numVals; |
| 119 | + _gyroOffsetsDegPerSec[1] = gyroAvgValues[1] / numVals; |
| 120 | + _gyroOffsetsDegPerSec[2] = gyroAvgValues[2] / numVals; |
| 121 | + |
| 122 | + Serial.printf("[IMU] Offsets: X(%f) Y(%f) Z(%f)\n", |
| 123 | + _gyroOffsetsDegPerSec[0], |
| 124 | + _gyroOffsetsDegPerSec[1], |
| 125 | + _gyroOffsetsDegPerSec[2]); |
| 126 | + Serial.println("[IMU] Calibration Complete"); |
| 127 | +} |
| 128 | + |
82 | 129 | bool imuPeriodic() {
|
83 | 130 | if (!_imuReady) return false;
|
84 | 131 | if (!_imuEnabled) return false;
|
|
0 commit comments