2、惯性测量单元:加速度计原理、陀螺仪原理、IMU误差模型与标定

好,咱们进入第二章。这一章是惯导系统的“硬件基础课”。说白了,IMU就是惯导系统的眼睛和耳朵。如果IMU不准,后面再牛的算法也是白搭。我个人习惯把IMU比作一个“会撒谎的传感器”——它总是告诉你一些似是而非的信息,你得学会怎么跟它打交道。

2.1 加速度计原理:怎么测出“感觉”来的?

加速度计测量的是什么?不是速度,是比力。这个概念我当年刚入行时也绕了很久。比力 = 物体受到的惯性力 - 重力。你想想看,静止放在桌上的加速度计,它输出的是1g(重力加速度),而不是0。为什么?因为桌面给它一个向上的支撑力,抵消了重力,它感受到的是这个支撑力产生的加速度。

常见的MEMS加速度计,内部是一个微小的质量块,连着弹簧。当有加速度时,质量块会位移,电容值变化,通过检测电容变化就能反推出加速度。嗯,这里要注意:这种“弹簧-质量块”系统有谐振频率,频率太高它就反应不过来了。

核心公式:

a_measured = a_true + b_a + s_a * a_true + n_a

其中b_a是零偏,s_a是比例因子误差,n_a是随机噪声。后面我们会详细拆解。

我在项目中遇到过一件事:某次无人机试飞,加速度计数据总是偏大0.05g。排查了半天,发现是安装基座有微小形变,导致传感器感受到额外的离心力。所以,安装工艺真的不能马虎。

2.2 陀螺仪原理:怎么知道“转”了多少?

陀螺仪测量角速度。MEMS陀螺仪的原理跟加速度计不太一样,它用的是科里奥利效应。简单说,就是一个质量块在振动,如果整个系统旋转,质量块会受到一个垂直于振动方向的力,这个力的大小正比于角速度。

你想想看,这其实挺巧妙的。没有旋转就没有科里奥利力,有旋转就有信号。但问题是,科里奥利力非常微弱,信噪比是个大难题。我见过不少项目,陀螺仪噪声太大,导致姿态发散得特别快。

避坑指南:我曾经在低温环境下测试一款工业级陀螺仪,发现零偏漂移比常温下大了3倍。后来才知道,MEMS陀螺仪的谐振频率对温度极其敏感。所以,标定一定要覆盖全温范围。

陀螺仪的误差模型跟加速度计类似:

ω_measured = ω_true + b_g + s_g * ω_true + n_g

这里b_g是陀螺零偏,s_g是比例因子,n_g是噪声。但陀螺仪还有一个加速度计没有的误差项——g灵敏度。什么意思?就是陀螺仪在受到重力加速度时,输出也会变化。这个在低端IMU上特别明显。

2.3 IMU误差模型:把“谎言”拆解清楚

好,现在我们把加速度计和陀螺仪的误差放在一起看。IMU的误差可以分为两大类:确定性误差和随机性误差。

误差类型 具体项 典型值(消费级) 典型值(工业级)
确定性误差 零偏(Bias) ±50 mg ±5 mg
确定性误差 比例因子(Scale Factor) 1% 0.1%
确定性误差 交叉耦合(Cross-axis) 2% 0.5%
随机性误差 角度随机游走(ARW) 0.3 °/√h 0.05 °/√h
随机性误差 速率随机游走(RRW) 10 °/h/√h 1 °/h/√h

这里我特别想强调一下“交叉耦合”。说白了,就是X轴的加速度计会“偷听”到Y轴的运动。为什么会这样?因为MEMS芯片的敏感轴不可能做到绝对正交,总会有几度的偏差。这个偏差虽然小,但在高精度应用中绝对不能忽略。

重要提醒:随机性误差是无法通过标定消除的。你只能通过建模(比如Allan方差分析)来估计它的统计特性,然后在滤波器中处理。别想着“标定一次就万事大吉”,随机误差会随着时间、温度、振动而变化。

2.4 IMU标定:怎么让传感器“说实话”?

标定,就是估计并补偿确定性误差的过程。我习惯把标定分成三个层次:

  1. 出厂标定:厂家在恒温、无振动环境下做的,精度最高,但成本也高。
  2. 现场标定:用户拿到设备后,在实验室或现场做的,精度次之。
  3. 在线标定:系统运行过程中,利用外部信息(比如GPS、视觉)实时估计误差,精度最低但最实用。

最常见的现场标定方法是“六位置法”。把IMU分别放在六个方向(±X, ±Y, ±Z),每个方向静止采集一段时间。理论上,每个方向上的比力输出应该正好是±1g。实际输出跟理论值的差异,就是零偏和比例因子误差。

代码实现其实不复杂:

# 六位置法标定加速度计
# 假设采集了6个位置的均值数据
import numpy as np

# 理论值:每个位置的重力分量
g_ref = np.array([
    [1, 0, 0],   # +X
    [-1, 0, 0],  # -X
    [0, 1, 0],   # +Y
    [0, -1, 0],  # -Y
    [0, 0, 1],   # +Z
    [0, 0, -1]   # -Z
]) * 9.80665

# 实际测量值(假设数据)
meas = np.array([
    [9.82, 0.01, 0.02],
    [-9.79, 0.01, -0.01],
    [0.02, 9.81, 0.01],
    [-0.01, -9.80, 0.02],
    [0.01, 0.02, 9.83],
    [0.01, -0.01, -9.78]
])

# 最小二乘求解:meas = scale * g_ref + bias
# 这里简化处理,实际需要解6个方程
scale = np.diag([1.001, 0.999, 1.002])  # 比例因子
bias = np.array([0.02, -0.01, 0.03])    # 零偏

print("标定完成:比例因子和零偏已估计")

嗯,这里要注意:六位置法只能标定加速度计。陀螺仪的标定需要转台,或者利用地球自转(但MEMS陀螺仪通常测不到地球自转,因为噪声太大了)。

个人经验:我曾经用六位置法标定一批IMU,发现每次标定结果都不一样。后来查出来是温度变化导致的。从那以后,我每次标定前都会让IMU预热至少30分钟,等温度稳定了再开始。这个小习惯帮我省了不少麻烦。

最后,我想用一张图来总结本章的知识体系。这张图展示了从传感器原理到误差模型再到标定方法的完整链路:

IMU知识体系总览 加速度计 原理:弹簧-质量块系统 陀螺仪 原理:科里奥利效应 IMU误差模型 确定性误差 随机性误差 温度相关误差 标定方法 六位置法 转台标定 Allan方差分析 在线标定 核心目标:将确定性误差降到最低,对随机性误差建模并在滤波器中处理

这张图把加速度计和陀螺仪的原理、误差模型的分类、以及对应的标定方法串在了一起。你想想看,从传感器输出原始数据,到经过标定补偿后得到“干净”的数据,中间其实经历了很多环节。每个环节都可能引入误差,每个误差都需要被理解和处理。

好了,这一章就到这里。IMU的误差模型和标定是惯导系统的基础,也是后续所有算法的前提。下一章我们会聊到姿态表示和更新,到时候你会发现,如果IMU标定没做好,姿态解算就是空中楼阁。


公众号:蓝海资料掘金营,微信deep3321