第三章 惯性导航系统(INS)基础:IMU工作原理、加速度计与陀螺仪、惯性导航解算(捷联式)
各位同学,今天我们来聊聊惯性导航系统。说实话,这是整个组合导航里最“硬核”的部分之一。我当年刚接触INS时,也被那些积分、坐标系变换搞得头晕。但别怕,咱们一步步拆开看。
3.1 IMU到底是个啥?
IMU,全称Inertial Measurement Unit,惯性测量单元。说白了,它就是一套传感器组合,核心就两个东西:加速度计和陀螺仪。
加速度计测什么?测的是比力。不是速度,是加速度。你想想看,你坐在车里一脚油门踩下去,身体往后仰——那就是加速度计感受到的力。但注意,它测的是“比力”,包含了重力分量。所以静止时它读数是1g,不是0。
陀螺仪呢?测角速度。就是物体转得有多快。单位是度每秒或者弧度每秒。我习惯用弧度,因为后面积分方便。
核心概念:IMU不依赖任何外部信号,完全自主工作。这是它最大的优势,也是最大的挑战——误差会随时间累积。
3.2 加速度计与陀螺仪的工作原理
先讲加速度计。常见的MEMS加速度计,内部是一个微小的质量块,连着弹簧。当有加速度时,质量块会偏移,电容值变化,通过测量电容就能反推出加速度。嗯,原理其实挺简单的。
但实际项目中,我遇到过一个大坑:零偏稳定性。你放那儿不动,它读数也不是完美的0。不同温度下零偏还会漂。我曾经在一个项目中,因为没做温度补偿,车辆静止时导航解算出来的速度一直在增加——这显然不对。
再讲陀螺仪。同样MEMS原理,用的是科里奥利效应。一个振动的质量块,当它旋转时,会受到一个垂直于振动方向的力,这个力的大小与角速度成正比。
陀螺仪最怕什么?角速率随机游走。这个术语听着吓人,其实就是噪声积分后变成了角度误差。我建议你在选型时,重点关注这两个指标:
| 指标 | 含义 | 典型值(消费级) | 典型值(工业级) |
|---|---|---|---|
| 零偏稳定性 | 静止时输出的波动 | 10-100 deg/h | 0.1-1 deg/h |
| 角度随机游走 | 噪声积分导致的误差 | 0.1-1 deg/√h | 0.01-0.1 deg/√h |
我的经验:消费级IMU做纯惯性导航,几秒钟就飘得没边了。所以组合导航里,IMU主要用来做短时间的高频更新,长期靠GNSS来修正。
3.3 捷联式惯性导航解算
捷联式,英文叫Strapdown。什么意思?就是把IMU直接“绑”在载体上,不搞什么物理平台了。计算全靠数学。
解算的核心流程,我总结为三步:
- 姿态更新:用陀螺仪的角速度积分,得到当前的姿态(横滚、俯仰、航向)。
- 速度更新:把加速度计的比力转换到导航坐标系,减去重力,再积分得到速度。
- 位置更新:对速度积分,得到位置。
你看,全是积分。积分这东西,误差会累积。所以为什么INS不能长时间独立工作?原因就在这里。
下面我画了一张图,帮你理解整个解算流程:
3.4 姿态表示方法
姿态怎么表示?常用的有三种:欧拉角、方向余弦矩阵、四元数。
欧拉角最直观,横滚、俯仰、航向,一看就懂。但有个致命问题——万向锁。当俯仰角接近±90度时,横滚和航向会耦合,丢失一个自由度。我在做无人机项目时就踩过这个坑,飞机垂直爬升时姿态解算直接炸了。
所以实际工程中,我强烈建议用四元数。它没有奇异性,计算效率也高。虽然不直观,但计算机处理起来很舒服。
注意:四元数需要归一化!每次更新后都要做归一化,否则数值误差会累积,导致姿态发散。我曾经见过一个同事,代码里忘了归一化,跑了几分钟姿态就飘到天上去了。
3.5 一个简单的姿态更新代码示例
下面是一个用四元数做姿态更新的核心代码片段。我习惯用C++写,但原理都一样:
// 四元数姿态更新(简化版)
// gyro: 三轴角速度 (rad/s)
// dt: 采样间隔 (s)
// q: 当前姿态四元数 [w, x, y, z]
void updateAttitude(const double gyro[3], double dt, double q[4]) {
double wx = gyro[0] * dt / 2.0;
double wy = gyro[1] * dt / 2.0;
double wz = gyro[2] * dt / 2.0;
// 构造增量四元数
double dq[4];
dq[0] = 1.0;
dq[1] = wx;
dq[2] = wy;
dq[3] = wz;
// 四元数乘法
double new_q[4];
new_q[0] = q[0]*dq[0] - q[1]*dq[1] - q[2]*dq[2] - q[3]*dq[3];
new_q[1] = q[0]*dq[1] + q[1]*dq[0] + q[2]*dq[3] - q[3]*dq[2];
new_q[2] = q[0]*dq[2] - q[1]*dq[3] + q[2]*dq[0] + q[3]*dq[1];
new_q[3] = q[0]*dq[3] + q[1]*dq[2] - q[2]*dq[1] + q[3]*dq[0];
// 归一化
double norm = sqrt(new_q[0]*new_q[0] + new_q[1]*new_q[1] +
new_q[2]*new_q[2] + new_q[3]*new_q[3]);
q[0] = new_q[0] / norm;
q[1] = new_q[1] / norm;
q[2] = new_q[2] / norm;
q[3] = new_q[3] / norm;
}
小技巧:实际项目中,陀螺仪数据通常会有高频噪声。我建议在积分前先做低通滤波,或者用多采样率积分。别小看这一步,它能显著提升姿态精度。
3.6 惯性导航的误差来源
最后聊聊误差。INS的误差源主要有这么几个:
- 零偏误差:静止时输出不为零,积分后变成角度/速度斜坡误差。
- 比例因子误差:输入输出不成线性,导致缩放偏差。
- 安装误差:IMU安装时与载体坐标系不对齐。
- 噪声:白噪声、随机游走等。
这些误差怎么处理?嗯,这就是组合导航要干的事了。用GNSS、视觉、激光雷达等外部信息,来估计和补偿IMU的误差。说白了,IMU负责“快”,其他传感器负责“准”。
好了,这一章的内容就到这里。记住一句话:惯性导航是积分艺术,也是误差管理艺术。理解了这个,后面学组合导航就会轻松很多。
公众号:蓝海资料掘金营,微信deep3321