第三节:核心传感器(二)——IMU的加速度计与陀螺仪
好,咱们接着聊传感器。上一节我们把激光雷达聊透了,这一节轮到另一个关键角色——惯性测量单元,也就是IMU。
说实话,IMU这玩意儿在扫地机器人里,地位有点特殊。它不像激光雷达那样直接给你一张地图,它更像一个“感觉器官”。你闭着眼睛走路,靠内耳前庭感知自己是加速了还是转弯了——IMU干的就是这个活。
我刚开始做机器人那会儿,总觉得IMU数据很“干净”,后来发现根本不是那么回事。今天咱们就把它的底裤扒干净。
一、加速度计:你到底在测什么?
加速度计,顾名思义,测加速度。但这里有个坑——它测的不是运动加速度,而是比力。
什么叫比力?说白了,就是物体受到的惯性力与重力的合力,再除以质量。你想想看,一个静止放在桌面上的加速度计,它读数是0吗?不是。它读出来的是1g,方向竖直向上。为什么?因为桌面在推着它,抵抗重力。
我在项目中遇到过一件事:有个同事把加速度计水平安装,然后说“我明明没动,怎么读数不是0?”——嗯,这就是没搞懂比力的概念。
a_measured = a_motion + g
其中g是重力矢量,a_motion是运动加速度。
所以,如果你想从加速度计里提取运动加速度,得先把重力分量去掉。怎么去?用姿态估计。这又绕回到陀螺仪了——你看,传感器之间就是这么耦合的。
加速度计的工作原理
现在主流的MEMS加速度计,用的是电容式检测原理。内部有一个微小的质量块,被弹簧悬着。当有加速度时,质量块会偏移,改变电容极板之间的距离,电容值就变了。测出电容变化,就能反推出加速度。
我习惯把这种结构想象成一个弹簧秤——只不过这个秤特别小,小到肉眼看不见。
| 参数 | 典型值(消费级) | 说明 |
|---|---|---|
| 量程 | ±2g ~ ±16g | 扫地机器人一般用±2g或±4g |
| 灵敏度 | 16384 LSB/g(±2g时) | 数字输出时的分辨率 |
| 噪声密度 | 100~300 μg/√Hz | 决定了你能分辨多小的加速度 |
二、陀螺仪:角速度是怎么测出来的?
陀螺仪测的是角速度,单位是rad/s或者°/s。MEMS陀螺仪的原理比加速度计复杂一些,它利用了科里奥利效应。
简单说:一个质量块在高速振动,如果整个芯片在旋转,质量块就会受到一个垂直于振动方向和旋转轴方向的力——科里奥利力。测出这个力的大小,就能算出角速度。
我记得第一次看MEMS陀螺仪的内部结构图时,觉得这东西简直像微雕艺术品。一个硅片上刻着梳齿状的电极,质量块以几千赫兹的频率振动着——你想想看,这得多精密。
三、零偏:IMU的“原罪”
零偏,也叫bias,是IMU最让人头疼的问题之一。
什么叫零偏?理想情况下,IMU静止时,加速度计应该只读到重力,陀螺仪应该读到0。但现实是,即使静止不动,陀螺仪输出也不是0,而是某个小常数——这就是零偏。
为什么会这样?因为制造工艺不可能完美。微小的结构不对称、残余应力、温度变化,都会导致零偏。
我曾经吃过一次大亏:一个项目里,我用IMU做航位推算,跑了10分钟,位置误差就漂了十几米。查了半天,发现是陀螺仪的零偏没校准好。从那以后,我每次上电都会做一次零偏校准。
零偏的数学模型
我们通常把零偏建模为两部分:
- 常值零偏(b_c):上电后基本不变的部分,可以通过静态校准去掉。
- 零偏不稳定性(b_instability):随时间缓慢变化的部分,需要用滤波器估计。
在代码里,我一般这样处理:
// 静态零偏校准:采集N个静止样本取平均
float calibrate_gyro_bias() {
float sum = 0;
for (int i = 0; i < 1000; i++) {
sum += read_gyro();
delay(1);
}
return sum / 1000.0f;
}
// 使用时减去零偏
float gyro_rate = read_gyro() - gyro_bias;
四、噪声模型:IMU的“性格”
IMU的噪声,说白了就是输出信号上的随机抖动。你拿一个静止的加速度计,看它的输出,会发现它在某个值附近来回跳——这就是噪声。
IMU的噪声通常用角度随机游走(ARW)和速率随机游走(RRW)来描述。这两个名字听起来吓人,其实意思很简单:
- 角度随机游走:陀螺仪的白噪声积分后,角度误差会像随机游走一样扩散。
- 速率随机游走:陀螺仪的零偏漂移,导致角速度估计有低频误差。
你想想看,如果陀螺仪噪声很大,积分出来的角度就会越来越不准。这就是为什么纯IMU导航撑不了几分钟的原因。
角度随机游走:0.15 °/√hr
零偏不稳定性:4 °/hr
这意味着,1小时后,角度误差大约会漂到4°左右。
Allan方差:分析噪声的利器
我习惯用Allan方差来分析IMU的噪声特性。这个方法很简单:采集一段长时间的静态数据,然后计算不同时间尺度上的方差。
Allan方差曲线能告诉你:
- 曲线斜率为-1/2的部分:对应角度随机游走
- 曲线最低点:对应零偏不稳定性
- 曲线斜率为+1/2的部分:对应速率随机游走
嗯,这里要注意,Allan方差分析需要至少几小时的数据才可靠。我一般会采集4~6小时,然后离线分析。
五、实战中的IMU处理流程
说了这么多理论,咱们落地到扫地机器人上。我一般这样处理IMU数据:
- 上电校准:机器人静止3秒,采集陀螺仪和加速度计的均值,作为初始零偏。
- 低通滤波:加速度计和陀螺仪都做一阶低通滤波,截止频率20Hz左右,滤掉高频振动。
- 温度补偿:如果IMU有温度传感器,做简单的线性温度补偿。
- 姿态解算:用Mahony或Madgwick滤波器融合加速度计和陀螺仪,得到roll/pitch/yaw。
- 在线零偏估计:在姿态解算中,把陀螺仪零偏作为状态量,用卡尔曼滤波实时估计。
我曾经试过跳过温度补偿这一步,结果夏天和冬天的零偏差了将近一倍。从那以后,我再也不敢省这个环节了。
小结
IMU是个好东西,但也是个“娇气”的传感器。它告诉你加速度和角速度,但每个数据都带着零偏和噪声。你得学会跟它打交道:校准它、滤波它、融合它。
下一节,咱们聊聊怎么把IMU和激光雷达的数据融合起来——这才是SLAM的核心所在。