Как откалибровать Mpu6050 с помощью библиотеки?
Я использую библиотеку i2cdev
Код: (я не знал, правильный это код или нет)
#include <Arduino.h>
#include <MPU6050.h>
#include <kalman.h>
#include <stdint.h>
#define ACCELLSB 2048
#define GYROLSB 16.4
#define CONSOLE
#define CALIBRATE
#ifdef CALIBRATE
int16_t Accel_X_offset;
int16_t Accel_Y_offset;
int16_t Accel_Z_offset;
int16_t Gyro_X_offset;
int16_t Gyro_Y_offset;
int16_t Gyro_Z_offset;
#endif
MPU6050 mpu6050;
Kalman AngleX;
Kalman AngleY;
void setup()
{
mpu6050.initialize();
mpu6050.setFullScaleAccelRange(MPU6050_ACCEL_FS_16);
mpu6050.setFullScaleGyroRange(MPU6050_GYRO_FS_2000);
#ifdef CALIBRATE
mpu6050.CalibrateAccel();
mpu6050.CalibrateGyro();
Accel_X_offset = mpu6050.getXAccelOffset();
Accel_Y_offset = mpu6050.getYAccelOffset();
Accel_Z_offset = mpu6050.getZAccelOffset();
Gyro_X_offset = mpu6050.getXGyroOffset();
Gyro_Y_offset = mpu6050.getYGyroOffset();
Gyro_Z_offset = mpu6050.getZGyroOffset();
#endif
int16_t AccelX, AccelY, AccelZ;
int16_t GyroX, GyroY, GyroZ;
mpu6050.getMotion6(&AccelX,&AccelY,&AccelZ,&GyroX,&GyroY,&GyroZ);
// Я собираюсь использовать эти значения в фильтре Калмана
#ifdef CALIBRATE
AccelX -= Accel_X_offset;
AccelY -= Accel_Y_offset;
AccelZ -= Accel_Z_offset;
GyroX -= Gyro_X_offset;
GyroY -= Gyro_Y_offset;
GyroZ -= Gyro_Z_offset;
#endif
}
void loop()
{
}
Как правильно откалибровать mpu6050 (поправьте меня, что я не так или это правильно)?
Спасибо.
1 ответ
Лучший ответ:
Я лично предлагаю вам библиотеку MPU6050_tockn
.https://github.com/tockn/MPU6050_tockn
Если вы используете calcGyroOffsets()
в setup()
, он рассчитает калибровку гироскопа, и значение гироскопа будет откалибровано.
#include <MPU6050_tockn>
#include <Wire.h>
MPU6050 mpu6050(Wire);
void setup(){
Wire.begin();
mpu6050.begin();
mpu6050.calcGyroOffsets();
}
Если вы используете calcGyroOffsets(true)
в setup()
, вы можете увидеть состояние расчета калибровки в последовательном мониторе.
#include <MPU6050_tockn>
#include <Wire.h>
MPU6050 mpu6050(Wire);
void setup(){
Serial.begin(9600);
Wire.begin();
mpu6050.begin();
mpu6050.calcGyroOffsets(true);
}
Последовательный монитор:
Calculate gyro offsets
DO NOT MOVE MPU6050.....
Done!
X : 1.45
Y : 1.23
Z : -1.32
Program will start after 3 seconds
Если вы знаете смещения гироскопа, вы можете установить их с помощью setGyroOffsets()
, и вам не нужно выполнять calcGyroOffsets()
, так что вы можете запустить программу быстро.
#include <MPU6050_tockn>
#include <Wire.h>
MPU6050 mpu6050(Wire);
void setup(){
Serial.begin(9600);
Wire.begin();
mpu6050.begin();
mpu6050.setGyroOffsets(1.45, 1.23, -1.32);
}
Но если вы хотите сделать это с фильтром Калмана, перейдите на https://github.com /jarzebski/Arduino-KalmanFilter/blob/master/KalmanFilter_MPU6050/KalmanFilter_MPU6050.ino Это поможет вам.
- Как очистить буфер FIFO на MPU6050?
- Как сгенерировать аппаратное прерывание в mpu6050 для пробуждения Arduino из режима SLEEP_MODE_PWR_DOWN?
- Понимание того, почему следует избегать «String» и альтернативных решений
- Объяснение кода MPU6050
- Изменение адреса I2C MPU-6050
- Снять гравитацию с акселерометра MPU-6050
- Скорость передачи данных акселерометра mpu6050 в Arduino Uno и частота дискретизации mpu6050
- Как соединить L293D и MPU6050 для совместной работы?
Спасибо за ваш ответ, в библиотеке MPU6050_tockn используется дополнительный фильтр, но я хочу использовать фильтр Калмана, так что можете ли вы объяснить, как калибровать с помощью этой библиотеки?, @srilakshmikanthanp
Я только что отредактировал ответ для этого. Но он использует KalmanFilter.h, а не kalman.h., @Osadhi Virochana