自己攒平衡车、无人机或者双足机器人,绕不开一个六轴传感器,就是MPU6050。它把三轴加速度计和三轴陀螺仪塞进一颗芯片,成本十几块,几乎所有DIY教程都会用到。但很多新手卡在最后一步:原始数据读出来了,怎么变成能用的角度?今天就把它讲透。
先说结论:DMP是拿来即用的傻瓜包,卡尔曼和互补滤波是自己动手。新手先跑通一个能出角度的demo,再回头啃算法,比一上来就啃卡尔曼理论强得多。
一句话搞懂MPU6050
MPU6050是InvenSense出的六轴运动组件,整合了三轴加速度计(测平移加速度)和三轴陀螺仪(测角速度)。加速度量程可调±2g到±16g,陀螺仪±250°/s到±2000°/s,覆盖绝大多数机器人项目。
它走I2C接口,默认地址0x68(AD0接地时),AD0接高电平会变成0x69。Arduino Uno上SDA接A4、SCL接A5,供电3.3V或5V都行。接线就四根,真不难。
原始数据为什么用不了
读出来的是一串16位整数,加速度原始值要除以16384(±2g量程下的比例系数)才变成g,陀螺仪除以131(±250°/s下)才变成°/s。这一步不做,后面全是废数据。
更麻烦的是,加速度计怕运动干扰,一跑起来测出的重力方向就偏了;陀螺仪反过来,静止时还会零点漂移,积分久了角度越飘越远。单独用谁都不行,必须把两者融合,这就是姿态解算要解决的核心问题。
DMP:让芯片自己算
MPU6050内部藏了一个数字运动处理器DMP,是硬件解算引擎。只要用Jeff Rowberg那套MPU6050_6Axis_MotionApps20库,调用dmpInitialize和setDMPEnabled,芯片就能直接输出四元数,再换算成横滚roll、俯仰pitch和航向yaw,主控几乎不占资源。
这是新手最省事的路:十几行代码就出稳定角度,100Hz刷新配自平衡完全够用。缺点是得多引一根INT中断到Arduino Pin2,而且DMP库对ESP32支持一直不顺畅,主要跑在AVR系板上。
卡尔曼:自己写融合
不想用DMP,就拿原始数据在片上自己融合。主流是卡尔曼或互补滤波。卡尔曼预测加校正两步走,抑制噪声效果好,但参数(过程噪声Q、测量噪声R)要调,新手容易调崩。
互补滤波更接地气:把加速度计算出的角度当长期基准、陀螺仪积分的角度负责短期,用一个权重α加权。代码几行写完,够平衡车用,只是动态响应不如卡尔曼干脆。
到底怎么选
我的建议很直接:做自平衡小车、机器狗平衡这类要求稳定、又不想折腾算法的,直接用DMP,省心还准。想搞懂原理、或者要把主控资源腾出来做别的,就上卡尔曼或互补滤波,但要准备好调几天参数。
不管走哪条路,第一步都是校准。刚上电别急着用,DMP一般要15到40秒才稳定,先跑一遍自带的CalibrateAccel和CalibrateGyro把偏移量记下来。这个坑我踩过,数据全是鬼画符,就是没做校准。
总结一下
MPU6050姿态解算就三步:接好I2C、校准偏移、选融合方案。DMP是拿来即用,卡尔曼和互补滤波是自己动手。记住先校准再分析,别让鬼画符耽误你一下午。

卡尔曼的Q和R参数是真玄学,新手最容易卡这。建议先用DMP把项目跑起来,回头再啃算法,别一上来就四处找教程,越看越懵。
上周刚把MPU6050接上,A4A5接反了读出来全是乱的,排了一下午,早点看到这篇就好了。先说结论的值直接除16384,学到了。
看完就一个感受:先校准再分析,不然数据全是鬼画符。然后自作聪明不改校准,今天就踩了这个坑。
DMP是真省事,我之前手写互补滤波调了一晚上权重,换DMP半小时就稳定了。不过做双足还是建议多理解融合原理,后面做步态规划用得上。