第三节:核心传感器(二)——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导航撑不了几分钟的原因。

噪声参数(以ICM-42688为例):
角度随机游走:0.15 °/√hr
零偏不稳定性:4 °/hr
这意味着,1小时后,角度误差大约会漂到4°左右。

Allan方差:分析噪声的利器

我习惯用Allan方差来分析IMU的噪声特性。这个方法很简单:采集一段长时间的静态数据,然后计算不同时间尺度上的方差。

Allan方差曲线能告诉你:

  • 曲线斜率为-1/2的部分:对应角度随机游走
  • 曲线最低点:对应零偏不稳定性
  • 曲线斜率为+1/2的部分:对应速率随机游走

嗯,这里要注意,Allan方差分析需要至少几小时的数据才可靠。我一般会采集4~6小时,然后离线分析。

五、实战中的IMU处理流程

说了这么多理论,咱们落地到扫地机器人上。我一般这样处理IMU数据:

  1. 上电校准:机器人静止3秒,采集陀螺仪和加速度计的均值,作为初始零偏。
  2. 低通滤波:加速度计和陀螺仪都做一阶低通滤波,截止频率20Hz左右,滤掉高频振动。
  3. 温度补偿:如果IMU有温度传感器,做简单的线性温度补偿。
  4. 姿态解算:用Mahony或Madgwick滤波器融合加速度计和陀螺仪,得到roll/pitch/yaw。
  5. 在线零偏估计:在姿态解算中,把陀螺仪零偏作为状态量,用卡尔曼滤波实时估计。

我曾经试过跳过温度补偿这一步,结果夏天和冬天的零偏差了将近一倍。从那以后,我再也不敢省这个环节了。

避坑指南: 如果你发现IMU数据里突然出现一个很大的尖峰,别急着滤波——先检查是不是机械碰撞。扫地机器人撞到墙时,IMU会记录到很大的冲击加速度。这个信号不是噪声,是有效信息,可以用来做碰撞检测。

小结

IMU是个好东西,但也是个“娇气”的传感器。它告诉你加速度和角速度,但每个数据都带着零偏和噪声。你得学会跟它打交道:校准它、滤波它、融合它。

下一节,咱们聊聊怎么把IMU和激光雷达的数据融合起来——这才是SLAM的核心所在。