3. IMU误差模型与标定:确定性误差、随机误差与温漂补偿

做车载定位这些年,我最大的体会就是:IMU这东西,看着简单,用起来全是坑。你买回来的IMU,数据手册上写得漂漂亮亮,什么「零偏稳定性0.1°/h」、「噪声密度0.005°/s/√Hz」,可一上车实测,数据直接飘到姥姥家。

为什么会这样?因为IMU有误差。而且误差分两种:一种是你能测出来、能补偿的——这叫确定性误差;另一种是随机的、统计性的——这叫随机误差。今天我们就把这俩掰开揉碎了讲清楚。

3.1 确定性误差:三个最要命的家伙

确定性误差,说白了就是「每次开机都差不多的那些偏差」。我习惯把它们分成三类:零偏、标度因数误差、安装误差。这三兄弟,任何一个没处理好,融合定位的精度都会大打折扣。

3.1.1 零偏(Bias)

零偏是什么?你想想看,IMU静止不动的时候,理论上输出应该是0。但实际呢?它总会输出一个非零的小值。这个值就是零偏。

我在项目中遇到过最夸张的一次,某款MEMS陀螺仪的零偏达到了0.5°/s。什么概念?你车停着不动,积分1分钟就偏了30度。这要是用在导航上,早不知道拐哪去了。

零偏的数学表达很简单:

ω_measured = ω_true + b_g + n_g
a_measured = a_true + b_a + n_a

其中b_g和b_a就是陀螺和加速度计的零偏。注意,零偏不是一成不变的——它随温度变、随时间变、甚至随供电电压变。所以标定不是一次性的活。

我的经验: 零偏标定最常用的方法是「静止采集法」。把IMU放平,静止采集30秒到1分钟的数据,取平均就是零偏。但要注意——采集时间太短,随机噪声没被平均掉;采集时间太长,温度变化又会影响结果。我个人习惯是60秒,刚刚好。

3.1.2 标度因数误差(Scale Factor)

标度因数误差,说白了就是「你转1度,它告诉你转了0.98度」或者「你转1度,它告诉你转了1.02度」。这是传感器本身的灵敏度偏差。

数学上可以写成:

ω_measured = (1 + s_g) · ω_true + b_g
a_measured = (1 + s_a) · a_true + b_a

s_g和s_a就是标度因数误差,通常用ppm(百万分之一)表示。好的工业级IMU,标度因数误差能做到100ppm以内。但车规级的MEMS嘛……嗯,你懂的。

标度因数误差怎么测?需要转台。把IMU固定在转台上,以已知角速度旋转,对比实际输出和理论值。没有转台怎么办?我曾经试过用手机上的陀螺仪配合一个简易旋转平台……结果嘛,只能说「勉强能用」。

3.1.3 安装误差(Misalignment)

安装误差是最容易被忽略的。你想想看,IMU芯片焊在PCB上,PCB装在盒子里,盒子固定在车上。这一路下来,传感器的三个轴和车体的三个轴,能完全对齐吗?

不可能。总会有几度甚至十几度的偏差。

安装误差的数学模型是个3×3的矩阵:

ω_body = M · ω_sensor

其中M是一个包含三个小角度误差的旋转矩阵。标定安装误差,需要让IMU在已知姿态下采集数据,然后反算出这个矩阵。

注意: 安装误差和零偏、标度因数误差是耦合的。你单独标零偏,标出来的值里可能混着安装误差的影响。所以标定顺序很重要——我建议先标零偏,再标标度因数,最后标安装误差。

3.2 随机误差:Allan方差分析

确定性误差标完了,你以为就完了?天真。IMU还有随机误差——那些你无法预测、只能用统计方法描述的噪声。

随机误差的分析工具,业界公认的就是Allan方差。我刚开始做IMU时,看到Allan方差曲线也是一脸懵。后来做多了才发现,这东西其实没那么玄乎。

3.2.1 Allan方差是什么?

简单说,Allan方差就是把IMU的静态数据按不同时间窗口切分,然后看每个窗口内的方差变化。画出来是一条log-log曲线,从这条曲线上,你能读出五种噪声的参数:

  • 量化噪声(Quantization Noise) —— 斜率-1,高频段
  • 角度随机游走(Angle Random Walk) —— 斜率-1/2,中高频段
  • 零偏不稳定性(Bias Instability) —— 曲线最低点,这是最关键的指标
  • 速率随机游走(Rate Random Walk) —— 斜率+1/2,中低频段
  • 速率斜坡(Rate Ramp) —— 斜率+1,低频段

你看,不同噪声在Allan方差曲线上占据不同的频段。这就是为什么Allan方差这么有用——它能帮你把混在一起的噪声「拆开」来看。

3.2.2 实际操作步骤

我在项目中做Allan方差分析的流程是这样的:

  1. 把IMU放在稳定的平台上,静止采集至少2小时数据(越长越好,我一般采4小时)
  2. 用Python的allantools库或者自己写代码计算Allan方差
  3. 画出log-log曲线,拟合出各噪声参数
  4. 把这些参数填入卡尔曼滤波器的噪声协方差矩阵

下面是我常用的Python代码片段:

import numpy as np
import allantools

def compute_allan_variance(data, fs):
    """
    计算Allan方差
    data: 传感器数据(一维数组)
    fs: 采样率(Hz)
    """
    # 使用allantools库计算
    (taus, adev, _, _) = allantools.oadev(data, rate=fs, data_type="freq")
    
    # 转换为Allan方差(平方)
    avar = adev ** 2
    
    return taus, avar

# 使用示例
gyro_data = np.loadtxt('gyro_static_4h.txt')
taus, avar = compute_allan_variance(gyro_data, fs=100.0)

# 找到曲线最低点(零偏不稳定性)
min_idx = np.argmin(avar)
bias_instability = np.sqrt(avar[min_idx])
print(f"零偏不稳定性: {bias_instability:.6f} °/s")
关键点: Allan方差分析的结果直接决定了你的卡尔曼滤波器能不能收敛。我见过太多人随便填个Q矩阵,结果滤波器要么发散要么收敛到错误值。老老实实做Allan方差分析,这是基本功。

3.3 六面法标定流程

六面法,顾名思义,就是把IMU放在六个不同的姿态下采集数据。这六个姿态分别是:X轴朝上、X轴朝下、Y轴朝上、Y轴朝下、Z轴朝上、Z轴朝下。

为什么是六个面?因为每个轴的正反方向各一次,刚好能解出零偏和标度因数。加上安装误差的话,需要更多姿态——但六面法是最基础的入门操作。

3.3.1 六面法标定加速度计

加速度计的六面法标定,原理很简单:每个姿态下,理论的重力加速度在传感器各轴上的投影是已知的。比如Z轴朝上时,理论值是[0, 0, g];Z轴朝下时,理论值是[0, 0, -g]。

实际操作中,我建议每个姿态采集30秒数据,取平均。然后建立方程组:

a_measured = S · (a_true + b)

其中S是标度因数矩阵(对角阵),b是零偏向量。六个姿态,六个方程,解六个未知数——刚好。

避坑指南: 我曾经在六面法标定时,把IMU的「朝上」和「朝下」搞反了。结果标出来的零偏全是负的,折腾了两天才发现。所以——每次换姿态时,用水平仪确认一下,别凭感觉。

3.3.2 六面法标定陀螺仪

陀螺仪的六面法标定和加速度计不太一样。因为陀螺仪测量的是角速度,而地球自转角速度只有15°/h,对MEMS陀螺来说基本测不到。所以陀螺仪的六面法,实际上是标定零偏——每个姿态下,理论角速度都是0。

六个姿态的零偏取平均,就是最终的零偏值。为什么取六个?因为每个姿态下,陀螺仪感受到的重力方向不同,而MEMS陀螺对重力有微弱的敏感性——这叫「g敏感性」。六个姿态平均,可以消除g敏感性的影响。

3.4 温漂补偿策略

温度漂移,是车载IMU最大的敌人之一。你想想看,车在夏天暴晒后,车内温度能到70°C;冬天冷启动,可能零下20°C。这么大的温度范围,IMU的零偏和标度因数能不变吗?

不可能。所以温漂补偿必须做。

3.4.1 温漂模型

最简单的温漂模型是多项式模型:

b(T) = b_0 + c_1 · (T - T_0) + c_2 · (T - T_0)²

其中T_0是参考温度(通常是25°C),c_1和c_2是温漂系数。这个模型虽然简单,但在-20°C到70°C范围内,精度基本够用。

更精确的模型是分段线性模型——把温度范围分成若干段,每段用一个线性函数拟合。我在项目中用过5段线性模型,效果比二次多项式好不少。

3.4.2 温漂标定流程

温漂标定需要温箱。把IMU放进温箱,从-40°C到85°C,每5°C一个点,每个温度点保温30分钟后采集数据。然后拟合出温漂曲线。

没有温箱怎么办?我有个取巧的办法:把IMU放进冰箱冷冻室,拿出来自然升温到室温,同时记录温度和IMU数据。虽然精度不如温箱,但也能凑合用。

重要提醒: 温漂补偿不是一劳永逸的。IMU老化后,温漂特性会变化。我建议每半年重新标定一次温漂参数。特别是车载应用,振动和温度循环会加速IMU的老化。

3.4.3 在线温漂补偿

除了离线标定,还可以做在线温漂补偿。思路是这样的:在卡尔曼滤波器中,把温漂系数也作为状态变量,和位置、速度、姿态一起估计。

这样做的好处是,系统可以自动适应IMU的老化和环境变化。缺点是状态维度增加了,计算量变大,而且可观测性变差——不是所有温漂参数都能被观测到。

我个人建议:先用离线标定打好基础,再用在线补偿做微调。两条腿走路,最稳。

3.5 本章小结

IMU误差模型和标定,是车载融合定位的基石。没有好的标定,后面所有的滤波、融合都是空中楼阁。

总结一下今天的内容:

  • 确定性误差:零偏、标度因数、安装误差,用六面法标定
  • 随机误差:用Allan方差分析,提取噪声参数
  • 温漂补偿:多项式模型或分段线性模型,离线标定+在线微调

嗯,这些内容够消化一阵子了。下一章我们讲卡尔曼滤波的基础——不过那是后话了。

一句话记住: IMU标定做得好,融合定位差不了;IMU标定偷了懒,定位精度全白干。

可可精品资料库