第四章:IMU原理与测量模型——加速度计与陀螺仪
各位同学,欢迎来到第四章。这一章我们聊聊IMU,也就是惯性测量单元。说实话,IMU这东西看着简单,就一个加速度计加一个陀螺仪,但里面的门道可不少。我在飞控和VIO项目里吃过不少IMU的亏,今天把这些经验掰开了揉碎了讲给你听。
4.1 加速度计原理
加速度计测量的是什么?很多人以为是「速度变化率」,其实不对。它测量的是「比力」(specific force),也就是物体受到的惯性力与重力的合力,再除以质量。
你想想看,一个静止放在桌面上的加速度计,它读数是0吗?不是。它读出来的是重力加速度g,方向向上。为什么?因为桌面给它一个支持力,抵消了重力。加速度计测的就是这个支持力产生的加速度。
我当年刚入行时,死活想不通一个问题:自由落体的加速度计读数为什么是0?后来才明白,因为它和重力一起下落,没有支持力了。嗯,这个坑我踩过,希望你一次就懂。
常见的加速度计有几种:
- 电容式MEMS加速度计:利用质量块位移改变电容,精度适中,消费级产品常用
- 压阻式:利用压阻效应,响应快但温漂大
- 谐振式:精度最高,但成本也高,工业级才用
在VIO方案里,我们用的基本都是MEMS电容式。便宜、体积小、功耗低,够用。
4.2 陀螺仪原理
陀螺仪测角速度,这个好理解。但MEMS陀螺仪的原理和传统机械陀螺完全不同。它用的是科里奥利效应(Coriolis effect)。
简单说:一个质量块在某个方向振动,如果系统有旋转,就会在垂直方向产生科里奥利力。测这个力的大小,就能算出角速度。
我记得第一次调试陀螺仪数据时,发现静止状态下输出居然有0.1 rad/s的漂移。我当时以为是传感器坏了,查了半天手册才发现——嗯,这是正常的,MEMS陀螺仪天生就有零偏。
陀螺仪的关键指标:
- 量程:常见±250/500/1000/2000 °/s
- 零偏稳定性:这个最重要,决定了你能做多长时间的积分
- 角度随机游走:噪声的积分效应,影响姿态估计精度
核心要点:加速度计和陀螺仪是互补的。加速度计低频准、高频噪;陀螺仪高频准、低频漂。VIO里用IMU预积分,就是利用这个互补特性。
4.3 IMU噪声模型
IMU的噪声模型,说白了就是回答一个问题:测量值和真实值之间差了多少,这个差是怎么分布的?
标准模型长这样:
ω_m = ω_t + b_g + n_g
a_m = a_t + b_a + n_a
其中:
- ω_m, a_m 是测量值
- ω_t, a_t 是真实值
- b_g, b_a 是零偏(bias),随时间缓慢变化
- n_g, n_a 是白噪声
零偏怎么建模?一般用随机游走(random walk):
b_g_dot = n_bg
b_a_dot = n_ba
这里n_bg和n_ba也是白噪声。所以整个IMU噪声模型,本质上是「白噪声驱动随机游走,随机游走产生零偏」。
我在项目中遇到过一个问题:用IMU做纯积分定位,10秒后位置漂了十几米。查来查去,发现是零偏模型没建对,把白噪声当成了零偏。这个教训让我学会了——一定要区分「噪声」和「零偏」,它们是两回事。
实战技巧:在VIO初始化时,前几帧的IMU数据可以用来估计初始零偏。我习惯取前200个IMU样本的平均值作为初始零偏估计,然后从后续测量中减去。
4.4 Allan方差分析
Allan方差,说白了就是告诉你:在不同时间尺度上,IMU的噪声表现怎么样。
为什么要做这个?因为IMU的噪声不是单纯的白噪声。它里面有:
- 量化噪声:ADC采样带来的
- 角度随机游走:白噪声积分的结果
- 零偏不稳定性:低频漂移
- 速率随机游走:零偏的变化率
- 速率斜坡:温度引起的趋势项
Allan方差曲线长什么样?横轴是时间τ,纵轴是Allan方差σ(τ)。在双对数坐标下,不同噪声类型对应不同斜率的直线:
| 噪声类型 | 斜率 | 物理含义 |
|---|---|---|
| 量化噪声 | -1 | ADC分辨率限制 |
| 角度随机游走 | -1/2 | 白噪声积分 |
| 零偏不稳定性 | 0 | 曲线最低点 |
| 速率随机游走 | +1/2 | 零偏漂移 |
| 速率斜坡 | +1 | 温度等趋势项 |
下面这张图展示了Allan方差分析的核心流程:
实际做Allan方差分析时,我建议你至少采集2小时的静态数据。别偷懒,半小时的数据根本看不出零偏不稳定性。我曾经为了赶进度只采了20分钟,结果Allan方差曲线在长τ段全是噪声,完全没法用。
注意:Allan方差分析的前提是数据平稳。如果温度在采集过程中剧烈变化,或者有振动干扰,分析结果会严重失真。我习惯在恒温环境下做这个实验,或者同时记录温度数据做补偿。
4.5 实战:如何用Allan方差配置VIO参数
好了,理论讲完了,说点实际的。你拿到一个IMU,怎么用Allan方差的结果去配置VIO?
以我最常用的BMI088为例:
- 采集数据:静止放置,100Hz采样,采集3小时
- 计算Allan方差:用Python的allantools库,一行代码搞定
- 读取参数:
- 角度随机游走(ARW):从τ=1s处读取,单位°/√h
- 零偏不稳定性:曲线最低点的值,单位°/h
- 速率随机游走:长τ段的斜率
- 配置VIO:把ARW作为IMU噪声协方差,零偏不稳定性作为零偏随机游走的协方差
代码示例(Python):
import allantools as at
import numpy as np
# 假设data是陀螺仪z轴数据,单位rad/s
# 采样频率100Hz
rate = 100.0
taus, adev, adev_err, adev_n = at.oadev(data, rate=rate, data_type='freq')
# 找到曲线最低点(零偏不稳定性)
min_idx = np.argmin(adev)
bias_instability = adev[min_idx] # 单位rad/s
# 在τ=1s处读取角度随机游走
idx_1s = np.argmin(np.abs(taus - 1.0))
angle_random_walk = adev[idx_1s] # 单位rad/s/√Hz
print(f"零偏不稳定性: {bias_instability:.6f} rad/s")
print(f"角度随机游走: {angle_random_walk:.6f} rad/s/√Hz")
嗯,这里要注意:Allan方差给出的角度随机游走单位是rad/s/√Hz,但VIO里用的协方差矩阵需要的是rad²/s²。记得要平方一下。
我的习惯:每次换IMU型号,或者换了新的硬件平台,我都会重新做一次Allan方差分析。别偷懒,不同批次的IMU参数可能差20%。
好了,这一章的内容就到这里。IMU的原理和噪声模型是VIO的基石,你理解得越深,后面做预积分、做初始化就越顺手。下一章我们聊聊视觉和IMU的联合标定,那个更有意思。
公众号:蓝海资料掘金营,微信deep3321