4. 传感器标定

各位同学,咱们今天聊聊IMU。说实话,IMU这玩意儿在自动驾驶里,就像人的小脑——它不负责“看路”,但负责“感知身体姿态”。没有它,你的车就是个瞎子,连自己正着还是歪着都不知道。

我刚开始做定位时,总觉得IMU就是个辅助,GPS才是老大。直到有一次在隧道里做测试,GPS信号全丢,车却靠着IMU稳稳开了两公里。嗯,从那以后,我再也不敢小看它了。

4.1 加速度计与陀螺仪:IMU的两大核心

IMU里装了两个关键传感器:加速度计和陀螺仪。它们各自干各自的活,但配合起来才能算出完整的姿态。

4.1.1 加速度计:测量“比力”

加速度计测的不是你通常理解的“加速度”。它测的是“比力”——也就是物体受到的惯性力与重力的合力。说白了,它告诉你“我现在被推着往哪个方向走”。

举个例子:你站在电梯里,电梯加速上升时,你会感觉身体变重。加速度计测到的就是这个“变重”的感觉。在静止状态下,它测到的就是重力加速度g,方向竖直向下。

我个人习惯把加速度计的输出写成这样:

a_meas = a_true + g + b_a + n_a

其中:

  • a_true 是真实的运动加速度
  • g 是重力加速度(9.81 m/s²)
  • b_a 是零偏(bias)
  • n_a 是噪声

注意,加速度计没法区分“运动加速度”和“重力加速度”。所以当你用它来算位置时,必须先减去重力分量。我在项目中遇到过有人直接积分加速度计输出,结果位置飞到了天上去——因为没去掉重力。

4.1.2 陀螺仪:测量角速度

陀螺仪测的是物体绕三个轴的旋转角速度。单位是 rad/s 或 °/s。它告诉你“我现在转得有多快”。

陀螺仪的原理,说白了就是科里奥利效应。一个振动的质量块,当它旋转时,会受到一个垂直于振动方向和旋转轴方向的力。测这个力的大小,就能算出角速度。

陀螺仪的输出模型类似:

ω_meas = ω_true + b_g + n_g

其中:

  • ω_true 是真实角速度
  • b_g 是零偏
  • n_g 是噪声

陀螺仪有个特点:它不怕重力,但怕温度变化。温度一变,零偏就漂。我曾经在夏天做路测,车在太阳下晒了半小时,陀螺仪的零偏直接翻了一倍。所以,温度补偿是必须做的。

4.2 捷联惯导解算:从原始数据到位置姿态

有了加速度和角速度,怎么算出位置和姿态?这就是捷联惯导解算(Strapdown Inertial Navigation)干的事。

“捷联”的意思是,IMU直接“绑”在车体上,不像老式平台惯导那样用物理平台保持水平。所以,解算全靠数学。

整个流程分三步:

  1. 姿态更新:用陀螺仪的角速度更新姿态
  2. 速度更新:用加速度计的输出,去掉重力,积分得到速度
  3. 位置更新:对速度积分得到位置

下面这张图是我画的捷联惯导解算流程,你一看就明白:

陀螺仪 ω 加速度计 a 姿态更新 四元数/旋转矩阵 姿态 q (横滚/俯仰/航向) 速度更新 a → 去重力 → 积分 速度 v 位置更新 v → 积分 → p 位置 p 姿态用于去重力 捷联惯导解算流程图 核心:姿态 → 速度 → 位置,逐级积分 注意:姿态误差会传递到速度和位置

你看,整个流程就是“积分套积分”。陀螺仪积分得到姿态,加速度计去重力后积分得到速度,速度再积分得到位置。每一步都有误差累积,所以IMU单独用不了多久就会漂。

4.2.1 姿态更新的数学表达

姿态更新最常用的方法是四元数。为什么用四元数?因为欧拉角有万向锁问题,旋转矩阵有9个参数太冗余。四元数只有4个参数,没有奇点,完美。

四元数更新公式:

q_new = q_old ⊗ exp(0.5 * ω * dt)

其中:

  • q 是四元数,表示从载体坐标系到导航坐标系的旋转
  • ω 是角速度向量
  • dt 是采样时间间隔
  • ⊗ 表示四元数乘法

我建议你直接用现成的库,比如 Eigen 或 ROS 里的 tf2。手写四元数乘法容易出错,我当年就踩过坑——符号搞反了,结果车头朝北,解算出来朝南。

4.2.2 速度与位置更新

速度更新时,最关键的一步是“去重力”。加速度计测到的比力包含重力,必须用当前姿态把重力投影到载体坐标系,然后减去。

v_new = v_old + (R(q) * a_meas - g) * dt

其中 R(q) 是四元数对应的旋转矩阵,把加速度从载体坐标系转到导航坐标系。

位置更新就简单了:

p_new = p_old + v_new * dt

嗯,这里要注意:IMU的采样频率通常很高(100Hz~1000Hz),所以积分步长很小。但高频也意味着计算量大,嵌入式平台上要优化。

4.3 IMU误差模型:为什么IMU会漂?

IMU不是完美的。它有很多误差源,导致解算结果随时间发散。我把它归纳为三类:

误差类型 来源 影响 典型值
零偏(Bias) 制造工艺、温度变化 姿态和位置随时间线性漂移 陀螺仪:0.1~10 °/h
加速度计:1~10 mg
比例因子(Scale Factor) 传感器非线性 测量值与真实值成比例偏差 0.1%~1%
随机噪声(Random Noise) 电子噪声、量化误差 高频抖动,积分后变为随机游走 角随机游走:0.01~0.1 °/√h
速度随机游走:0.01~0.1 m/s/√h

其中,零偏是最头疼的。它会导致姿态误差随时间线性增长,而姿态误差又会导致重力投影错误,进而让速度和位置误差二次方增长。这就是为什么纯IMU定位几分钟就废了。

核心结论: IMU误差的累积速度取决于传感器质量。消费级IMU(手机里的那种)几秒就漂,工业级IMU能撑几分钟,战术级IMU可以撑几十分钟。自动驾驶至少要用工业级。

4.3.1 零偏的建模与补偿

零偏不是常数,它会随时间缓慢变化。通常建模为一阶马尔可夫过程:

b_dot = -b / τ + w

其中:

  • τ 是相关时间常数
  • w 是高斯白噪声

在实际系统中,我们会在IMU静止时做“零偏标定”。让IMU静置几分钟,取平均值作为零偏估计值。但注意,这个值只对当前温度有效。温度一变,零偏就变。

我的经验: 在量产项目中,我建议做“温度-零偏”标定表。把IMU放在温箱里,从-40°C到85°C,每5°C记录一次零偏。然后做插值,运行时根据温度查表补偿。这样能把零偏误差减小一个数量级。

4.3.2 艾伦方差分析

怎么评估一个IMU的好坏?用艾伦方差(Allan Variance)。它能把不同时间尺度上的噪声成分分离出来。

简单说,你让IMU静止,采集几小时数据。然后计算不同时间间隔下的方差,画成对数图。你会看到:

  • 短时间(<1s):主要是角度随机游走(噪声)
  • 中等时间(1s~100s):主要是零偏不稳定性
  • 长时间(>100s):主要是速率随机游走(零偏漂移)

我曾经用艾伦方差分析过一款国产IMU,发现它的零偏不稳定性标称是0.5°/h,但实际测出来是2°/h。嗯,标称值看看就好,自己测才靠谱。

4.4 本章小结

IMU是自动驾驶定位的“内耳”。它不依赖外部信号,但误差会累积。加速度计和陀螺仪各有各的脾气,捷联惯导解算就是靠数学把它们拧在一起。误差模型告诉我们:IMU不能单独用太久,必须配合其他传感器(比如GPS、视觉)做融合。

下一章,我们会讲怎么把IMU和GPS融合在一起,用卡尔曼滤波来抑制IMU的漂移。嗯,那才是真正的重头戏。

避坑指南: 我曾经在项目里直接用IMU的原始数据做解算,没做低通滤波。结果高频噪声被积分放大,位置解算结果像心电图一样抖。记住:IMU数据一定要先滤波,再积分。