第四章: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小时 分组与平均 按时间τ分组,计算组内均值 计算Allan方差 相邻组差值的方差 改变τ,重复计算 绘制log-log曲线 横轴τ,纵轴σ(τ) 提取噪声参数 从曲线斜率反推噪声类型 配置滤波器参数 设置VIO中的噪声协方差 Allan方差曲线解读: 斜率-1/2 → 角度随机游走(白噪声) 斜率0 → 零偏不稳定性(曲线最低点) 斜率+1/2 → 速率随机游走(零偏漂移)

实际做Allan方差分析时,我建议你至少采集2小时的静态数据。别偷懒,半小时的数据根本看不出零偏不稳定性。我曾经为了赶进度只采了20分钟,结果Allan方差曲线在长τ段全是噪声,完全没法用。

注意:Allan方差分析的前提是数据平稳。如果温度在采集过程中剧烈变化,或者有振动干扰,分析结果会严重失真。我习惯在恒温环境下做这个实验,或者同时记录温度数据做补偿。

4.5 实战:如何用Allan方差配置VIO参数

好了,理论讲完了,说点实际的。你拿到一个IMU,怎么用Allan方差的结果去配置VIO?

以我最常用的BMI088为例:

  1. 采集数据:静止放置,100Hz采样,采集3小时
  2. 计算Allan方差:用Python的allantools库,一行代码搞定
  3. 读取参数
    • 角度随机游走(ARW):从τ=1s处读取,单位°/√h
    • 零偏不稳定性:曲线最低点的值,单位°/h
    • 速率随机游走:长τ段的斜率
  4. 配置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