- #include <Wire.h>
- #include <Adafruit_MPU6050.h>
- #include <Adafruit_Sensor.h>
- Adafruit_MPU6050 mpu;
- void setup() {
- Serial.begin(9600);
- while (!Serial) delay(10);
- if (!mpu.begin()) {
- Serial.println("MPU6050初始化失败!");
- while (1);
- }
-
- // 传感器参数配置
- mpu.setAccelerometerRange(MPU6050_RANGE_8_G); // 加速度计量程 ±8G
- mpu.setGyroRange(MPU6050_RANGE_500_DEG); // 陀螺仪量程 ±500°/s
- mpu.setFilterBandwidth(MPU6050_BAND_21_HZ); // 滤波器带宽 21Hz
- }
- void loop() {
- sensors_event_t a, g, temp;
- mpu.getEvent(&a, &g, &temp); // 获取传感器事件
- // 通过加速度计计算角度(静态精度高)
- float roll = atan2(a.acceleration.y, a.acceleration.z) * 180/M_PI;
- float pitch = atan2(-a.acceleration.x, sqrt(pow(a.acceleration.y, 2) + pow(a.acceleration.z, 2))) * 180/M_PI;
- Serial.print("Roll: ");
- Serial.print(roll);
- Serial.print("°\tPitch: ");
- Serial.print(pitch);
- Serial.println("°");
- delay(200);
- }
卡尔曼滤波 - 融合加速度计和陀螺仪数据
动态补偿 - 运动状态下优先使用陀螺仪积分
零偏校准 - 上电时静止3秒自动校准零偏
见问题
若出现I2C通信失败:
检查接线是否接触不良
尝试添加Wire.setClock(400000)提高I2C速率
数据抖动较大时:
降低采样频率至50Hz
在代码中添加移动平均滤波
倾斜角度超过90°时:
使用四元数解算替代欧拉角
启用MPU6050内置的DMP功能
- // 添加卡尔曼滤波库(需额外安装)
- #include <SimpleKalmanFilter.h>
- SimpleKalmanFilter kalmanX(0.5, 0.5, 0.01);
- SimpleKalmanFilter kalmanY(0.5, 0.5, 0.01);
- // 在loop()中替换原始数据
- float filtered_roll = kalmanX.updateEstimate(roll);
- float filtered_pitch = kalmanY.updateEstimate(pitch);
此方案在静止环境下精度可达±0.5°,动态环境下建议结合陀螺仪积分进行数据融合。建议通过串口绘图仪实时观察数据波形(Ctrl+Shift+L 打开Arduino IDE绘图工具)。
|