mirror of
https://github.com/okalachev/flix.git
synced 2026-02-17 15:41:32 +00:00
Add parameters for easier IMU orientation definition
This commit is contained in:
15
flix/imu.ino
15
flix/imu.ino
@@ -10,6 +10,7 @@
|
||||
#include "util.h"
|
||||
|
||||
MPU9250 imu(SPI);
|
||||
Vector imuRotation(0, 0, -PI / 2); // imu orientation as Euler angles
|
||||
|
||||
Vector accBias;
|
||||
Vector accScale(1, 1, 1);
|
||||
@@ -37,16 +38,10 @@ void readIMU() {
|
||||
// apply scale and bias
|
||||
acc = (acc - accBias) / accScale;
|
||||
gyro = gyro - gyroBias;
|
||||
// rotate
|
||||
rotateIMU(acc);
|
||||
rotateIMU(gyro);
|
||||
}
|
||||
|
||||
void rotateIMU(Vector& data) {
|
||||
// Rotate from LFD to FLU
|
||||
// NOTE: In case of using other IMU orientation, change this line:
|
||||
data = Vector(data.y, data.x, -data.z);
|
||||
// Axes orientation for various boards: https://github.com/okalachev/flixperiph#imu-axes-orientation
|
||||
// rotate to body frame
|
||||
Quaternion rotation = Quaternion::fromEuler(imuRotation);
|
||||
acc = Quaternion::rotateVector(acc, rotation.inversed());
|
||||
gyro = Quaternion::rotateVector(gyro, rotation.inversed());
|
||||
}
|
||||
|
||||
void calibrateGyroOnce() {
|
||||
|
||||
@@ -43,6 +43,9 @@ Parameter parameters[] = {
|
||||
{"CTL_Y_RATE_MAX", &maxRate.z},
|
||||
{"CTL_TILT_MAX", &tiltMax},
|
||||
// imu
|
||||
{"IMU_ROT_ROLL", &imuRotation.x},
|
||||
{"IMU_ROT_PITCH", &imuRotation.y},
|
||||
{"IMU_ROT_YAW", &imuRotation.z},
|
||||
{"IMU_ACC_BIAS_X", &accBias.x},
|
||||
{"IMU_ACC_BIAS_Y", &accBias.y},
|
||||
{"IMU_ACC_BIAS_Z", &accBias.z},
|
||||
|
||||
Reference in New Issue
Block a user