第2章 惯性导航基础(上):IMU工作原理、加速度计与陀螺仪、比力方程与角速度测量

各位同学,咱们今天聊聊惯性导航的“心脏”——IMU。说实话,我入行那会儿,第一次拆开IMU的屏蔽罩,看着里面那块小小的MEMS芯片,心里直犯嘀咕:就这玩意儿,能扛得住导弹过载?后来干久了才明白,越精密的东西,原理往往越朴素。

2.1 IMU到底是个啥?

IMU,全称Inertial Measurement Unit,惯性测量单元。说白了,它就是一套“加速度计+陀螺仪”的组合拳。加速度计测你“动了多少”,陀螺仪测你“转了多少”。

我个人习惯把IMU比作一个盲人坐在车里——他感觉不到周围环境,但能通过屁股底下的推背感和身体倾斜,判断车在加速还是转弯。嗯,IMU就是那个盲人,只不过它用的是硅基微机械结构,不是屁股。

核心要点:IMU不依赖任何外部信号,完全靠自身惯性敏感元件推算运动。这是它和GPS、视觉传感器最本质的区别。

2.2 加速度计:比力方程的物理直觉

加速度计测的不是“加速度”,而是“比力”。这两个概念,我当年在实验室里绕了很久才绕明白。

比力方程长这样:

f = a - g

其中f是比力(加速度计输出),a是物体相对于惯性空间的绝对加速度,g是重力加速度。

你想想看,如果我把加速度计平放在桌上,它输出的是多少?是0吗?不对。它输出的是1g,方向向上。为什么?因为桌面给它一个向上的支撑力,抵消了重力。加速度计测的其实是这个“支撑力”对应的等效加速度。

避坑指南:我曾经在车载测试中,把加速度计静置时的1g输出当成了零偏,结果导航解算直接飞了。记住:加速度计永远测不到自由落体状态下的重力——因为它和重力加速度方向相反,正好抵消。

实际项目中,加速度计的输出模型可以写成:

f_meas = f_true + b_a + s_a * f_true + n_a

其中b_a是零偏,s_a是刻度因子误差,n_a是随机噪声。嗯,这里要注意,零偏是温度的函数,我见过最夸张的MEMS加速度计,温度从-40℃到85℃,零偏能漂移几十个mg。

2.3 陀螺仪:角速度测量的门道

陀螺仪测角速度,原理上比加速度计更“绕”。MEMS陀螺仪用的是科里奥利效应——一个振动的质量块,在旋转时会受到一个垂直于振动方向和旋转轴方向的力。

为什么会这样?简单说:旋转坐标系下,运动物体的表观加速度会多出一项。这个多出来的项,就是科里奥利加速度。陀螺仪就是靠测量这个加速度反推角速度的。

陀螺仪的输出模型:

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

和加速度计很像,但有一个关键区别:陀螺仪的零偏b_g随时间缓慢变化,这叫“角速率随机游走”。我做过一个实验,把陀螺仪静置24小时,零偏漂移了0.5°/s。你想想,如果导航系统里不补偿这个漂移,姿态误差会随时间累积到不可接受的程度。

参数 加速度计 陀螺仪
测量物理量 比力(含重力) 角速度
主要误差源 零偏、刻度因子、噪声 零偏、刻度因子、随机游走
温度敏感性 高(需温补) 极高(需温补+标定)
静态输出 1g(垂直方向) 0(理想情况)

2.4 比力方程与导航解算的关系

比力方程是惯性导航的“牛顿第二定律”。在导航坐标系下,它长这样:

a_n = C_b^n * f_b - (2ω_ie^n + ω_en^n) × v_n + g_n

别被这一堆符号吓到。我拆开讲:

  • C_b^n * f_b:把IMU测到的比力从载体坐标系转到导航坐标系。这一步靠陀螺仪提供的姿态矩阵完成。
  • (2ω_ie^n + ω_en^n) × v_n:地球自转和载体运动引起的哥氏加速度。车载导航中,这部分量级很小,但跑高速时不能忽略。
  • g_n:重力加速度,已知量。

说白了,导航解算就是三步:

  1. 用陀螺仪积分算姿态
  2. 用姿态把加速度计比力转到导航系
  3. 扣除重力和哥氏项,积分得速度和位置

警告:千万不要把加速度计的输出直接积分!我见过新手直接把IMU原始数据积分,结果位置误差以二次方增长。记住:必须先扣除重力,再扣除零偏,最后积分。

2.5 知识体系总览

下面这张图,是我自己画的知识结构。每次带新人,我都先让他们看这张图,再动手写代码。

惯性导航基础(上)知识体系 IMU 惯性测量单元 加速度计 陀螺仪 比力方程 f = a - g 误差模型:零偏+刻度+噪声 科里奥利效应 角速率随机游走 导航解算:姿态→速度→位置 a_n = C_b^n·f_b - 哥氏项 + g_n 积分:速度 = ∫a dt,位置 = ∫v dt

这张图把本章的核心逻辑串起来了:IMU提供原始测量,加速度计和陀螺仪各有各的物理原理和误差特性,最终通过比力方程和积分,得到导航结果。

2.6 实战中的几个坑

最后,分享几个我在项目中踩过的坑:

  • 零偏标定不能省:我曾经图省事,直接用芯片手册上的零偏值,结果导航精度差了3倍。后来老老实实做六位置标定,才把零偏误差压到0.5mg以内。
  • 温度补偿要分段:MEMS器件的零偏-温度曲线不是线性的。我试过用二次多项式拟合,效果比线性好很多。但温度变化剧烈时,还得上分段线性插值。
  • 陀螺仪积分要防饱和:角速度积分得到角度,但积分时间长了,数值误差会累积。我习惯在每次姿态更新后,对四元数做归一化,防止数值漂移。

个人经验:如果你刚开始做IMU驱动,建议先写一个简单的数据记录程序,把加速度计和陀螺仪的原始数据存下来,然后用Python离线分析。看看静态时的噪声分布,看看转动时的响应特性。这比直接上手写导航算法要稳妥得多。

好了,这一章就到这里。IMU的原理看似简单,但真正用好它,需要你对误差模型、温度特性、积分算法都有深刻理解。下一章我们接着聊惯性导航的“姿态表示”——四元数、欧拉角、旋转矩阵,这些数学工具才是把IMU数据变成可用导航信息的桥梁。


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