IMU惯性导航基础:加速度计与陀螺仪原理

做无人机定位,IMU是绕不开的核心传感器。我最早接触IMU是在一个四旋翼飞控项目上,当时觉得这东西不就是测个加速度和角速度嘛,能有多复杂?结果一上手就被各种漂移和噪声教做人了。今天咱们就把IMU的底裤扒干净,从原理到算法再到标定,一条线捋清楚。

加速度计与陀螺仪的工作原理

先说说加速度计。它测量的是比力,不是单纯的加速度。什么意思呢?就是物体受到的合力减去重力。你想想看,无人机悬停时,加速度计测到的是1g向上的力,而不是0。这个细节我当年在实验室里栽过跟头——以为静止时加速度应该是0,结果数据死活对不上。

加速度计内部结构,常见的是MEMS电容式。说白了就是有个质量块挂在弹簧上,加速度让质量块位移,改变电容值。我习惯把这种传感器想象成「弹簧秤」,只不过它称的是惯性力。

陀螺仪测量角速度,原理是科里奥利效应。MEMS陀螺仪里有个振动的质量块,当它旋转时,科里奥利力会让质量块在垂直方向产生位移。这个位移很小,但通过电容检测能读出来。嗯,这里要注意:陀螺仪测的是角速度,不是角度。要得到角度,得积分。

关键区别:加速度计测比力,陀螺仪测角速度。两者都不能直接给出位置或姿态,需要算法融合。

捷联惯导算法

捷联惯导,就是把IMU「绑」在无人机上,没有物理平台,全靠数学计算。我参与过一个物流无人机项目,用的就是捷联方案。说实话,刚开始看到那些四元数、方向余弦矩阵,头都大了。但后来发现,核心就三步:姿态更新、速度更新、位置更新。

姿态更新

姿态更新最常用的是四元数法。为什么用四元数?因为它没有欧拉角的万向锁问题,计算量也比方向余弦矩阵小。更新公式很简单:

q_new = q_old + 0.5 * dt * q_old ⊗ ω

其中ω是陀螺仪测的角速度,⊗表示四元数乘法。每次更新后要归一化,防止误差累积。我见过有人忘了归一化,结果姿态越算越偏,最后无人机直接翻了个跟头。

速度与位置更新

速度更新需要把加速度计测的比力转换到导航坐标系,再减去重力。公式如下:

v_new = v_old + dt * (C(q) * a_accel - g)

C(q)是姿态矩阵,把加速度从机体坐标系转到导航坐标系。位置更新就更直接了:

p_new = p_old + dt * v_new

看起来简单吧?但实际跑起来,你会发现积分误差像滚雪球一样越来越大。这就是为什么纯惯导只能撑几十秒,必须配合GPS或视觉做修正。

我的经验:捷联惯导的更新频率至少要200Hz以上,否则高频振动会混叠进导航解算。我习惯用400Hz,留点余量。

IMU误差模型与标定

IMU不是完美的,它有各种误差。我把它分成两类:确定性误差和随机误差。确定性误差可以通过标定消除,随机误差只能靠滤波。

确定性误差

主要包括:

  • 零偏(Bias):静止时输出不为零。加速度计零偏一般在mg级别,陀螺仪在°/h级别。
  • 尺度因子(Scale Factor):输入输出比例不准确。比如输入1g,输出0.98g。
  • 交叉耦合(Cross-axis):一个轴的输入在其他轴上产生输出。说白了就是轴没对准。

标定这些误差,最经典的方法是六位置法。把IMU放在六个正交方向上,采集数据,然后解方程。我曾经用转台做过一次高精度标定,结果发现手工摆放的误差比传感器本身的误差还大。后来我改用3D打印的夹具,精度才上去。

误差类型 典型值(消费级MEMS) 标定后残余
加速度计零偏 ±50 mg < 5 mg
陀螺仪零偏 ±10 °/s < 0.1 °/s
尺度因子误差 ±1% < 0.1%
交叉耦合 ±2% < 0.2%

随机误差

随机误差主要是角度随机游走(ARW)和速率随机游走(RRW)。这些可以用Allan方差分析。我习惯用艾伦方差图来评估IMU的噪声特性,横轴是相关时间,纵轴是方差。从图上能看出:

  • 斜率-1/2的部分是角度随机游走
  • 斜率+1/2的部分是速率随机游走
  • 最低点是零偏稳定性

避坑指南:我曾经在标定时忽略了温度影响,结果冬天和夏天的零偏差了3倍。后来我加了一个温控模型,把温度补偿进去,效果立竿见影。记住:MEMS IMU对温度非常敏感,标定一定要在目标温度范围内做。

IMU误差模型与标定流程

下面这张图是我自己总结的标定流程,每次做新项目都按这个来:

IMU标定与误差补偿流程 原始IMU数据 六位置法采集 零偏/尺度/交叉耦合解算 Allan方差分析 温度补偿模型 六位置法 X+/X- Y+/Y- Z+/Z- 每个位置静止30秒 取均值作为观测值 Allan方差 识别噪声类型 评估零偏稳定性

标定完成后,误差补偿公式很简单:

a_corrected = S_a * (a_raw - b_a - T_a * a_raw)
w_corrected = S_g * (w_raw - b_g - T_g * w_raw)

其中S是尺度因子矩阵,b是零偏,T是交叉耦合矩阵。把这些参数写进固件里,每次上电先做一次初始化标定,然后实时补偿。我习惯把标定参数存在EEPROM里,换传感器时重新标定一次。

实用技巧:如果你没有转台,可以用「静态+旋转」的简易标定法。把IMU静止放几分钟,估算零偏;然后手动旋转每个轴,用最小二乘法拟合尺度因子。精度虽然不如转台,但够用。

好了,IMU的基础就这些。加速度计和陀螺仪的原理搞清楚了,捷联惯导算法能跑通了,误差模型和标定也做完了,接下来就可以把IMU数据喂给融合滤波器了。记住:IMU是定位系统的「内耳」,它告诉你身体怎么动,但不知道自己在哪。想知道在哪,得靠下一层的传感器融合。