我是使用I2Cdev的arduino的mpu6050库实现的。具体就是将mpu6050水平放置,进行校准,然后将校准的偏移量写进代码,并将校准代码注释掉就可以了。
不建议有些文章推荐的保留陀螺仪校准,取消加速度计校准。我尝试了一下,这样每次开机,误差相比我的方法,还是要更大一些。
下面是举个例子:
下面的代码中, mpu6050.CalibrateAccel(6);和 mpu6050.CalibrateGyro(6);是开机后的自动校准程序,校准后,会输出加速度计和陀螺仪的偏移量。被注释掉几行mpu6050.set…offset()是库文件自带的偏移量。第一次校准后,使用下面代码中被注释掉的串口输出代码,就可以看到实际的偏移量,然后用实际偏移量写自己的偏移量语句,并注释掉校准和串口输出代码就可以了。
// 库文件自设置的初始偏移量(根据你的硬件情况设置)
// mpu6050.setXGyroOffset(220);
// mpu6050.setYGyroOffset(76);
// mpu6050.setZGyroOffset(-85);
// mpu6050.setZAccelOffset(1788);
//根据我自己的设备自检结果修改
mpu6050.setXAccelOffset(-802); // X轴加速度计偏移
mpu6050.setYAccelOffset(-2565); // Y轴加速度计偏移
mpu6050.setZAccelOffset(1250); // Z轴加速度计偏移
mpu6050.setXGyroOffset(58); // X轴陀螺仪偏移
mpu6050.setYGyroOffset(-17); // Y轴陀螺仪偏移
mpu6050.setZGyroOffset(-7); // Z轴陀螺仪偏移
if (devStatus == 0) {
// 校准传感器。因为已经使用了校准后的值,所以不需要再次校准
// mpu6050.CalibrateAccel(6);
// mpu6050.CalibrateGyro(6);
mpu6050.PrintActiveOffsets();
// 这段代码仅是手动获取校准后的偏移量,并输出到串口。平时注销掉就可以
// Serial.println(F("Calibration completed. Current offsets:"));
// int16_t ax_offset = mpu6050.getXAccelOffset();
// int16_t ay_offset = mpu6050.getYAccelOffset();
// int16_t az_offset = mpu6050.getZAccelOffset();
// int16_t gx_offset = mpu6050.getXGyroOffset();
// int16_t gy_offset = mpu6050.getYGyroOffset();
// int16_t gz_offset = mpu6050.getZGyroOffset();
// Serial.print(F("Accel offsets: X="));
// Serial.print(ax_offset);
// Serial.print(F(", Y="));
// Serial.print(ay_offset);
// Serial.print(F(", Z="));
// Serial.println(az_offset);
// Serial.print(F("Gyro offsets: X="));
// Serial.print(gx_offset);
// Serial.print(F(", Y="));
// Serial.print(gy_offset);
// Serial.print(F(", Z="));
// Serial.println(gz_offset);
3708

被折叠的 条评论
为什么被折叠?



