第四章:IMU惯性导航——IMU器件原理与捷联惯导算法
各位同学,欢迎来到第四章。这一章我们聊聊IMU,也就是惯性测量单元。说实话,IMU是V2X定位里最“磨人”的传感器。它不像GPS那样直接告诉你位置,而是靠“猜”——猜你从A点怎么走到B点的。嗯,这里面的门道可不少。
4.1 IMU器件原理:加速度计与陀螺仪
IMU的核心就两个东西:加速度计和陀螺仪。我习惯把它们比作“感觉器官”。加速度计感受的是“推背感”,陀螺仪感受的是“旋转感”。
4.1.1 加速度计的工作原理
加速度计测量的是比力,不是单纯的运动加速度。什么意思呢?你想想看,静止放在桌面上时,加速度计测到的是1g(重力加速度),而不是0。这个坑我刚开始做项目时踩过——以为静止时加速度就是0,结果算出来的位置飞到了天上去。
常见的MEMS加速度计内部有个质量块,像弹簧一样挂着。外界有加速度时,质量块会偏移,电容值就变了。测出电容变化,反推加速度。说白了,就是个微型的“弹簧秤”。
关键点:加速度计输出的是“比力”,即物体受到的合力减去重力。公式上:a_measured = a_true + g。所以做惯导解算时,第一步就是扣除重力分量。
4.1.2 陀螺仪的工作原理
陀螺仪测量角速度,单位是°/s。MEMS陀螺仪用的是科里奥利效应——一个振动的质量块,如果发生旋转,会产生一个垂直于振动方向的力。测这个力的大小,就知道转得多快了。
我记得第一次看陀螺仪数据时,发现静止时输出也不是0,而是有个小偏置。我当时以为是传感器坏了,后来才知道——这就是零偏,所有陀螺仪都有的毛病。
个人经验:选型时,我建议重点关注陀螺仪的零偏稳定性和角度随机游走。这两个参数直接决定了你能“纯惯导”撑多久。消费级的IMU可能几秒就飘了,战术级的能撑几分钟。
4.2 捷联惯导算法
捷联惯导,说白了就是把IMU“绑”在车身上,用数学方法模拟出一个虚拟的导航平台。没有物理转台,全靠算。
4.2.1 姿态更新
姿态是惯导的核心。你连车头朝哪都不知道,后面算位置全是扯淡。姿态更新用的是陀螺仪的角速度积分。
常用的方法有:欧拉角法、方向余弦法、四元数法。我个人强烈推荐四元数法——没有万向锁问题,计算量也小。
// 四元数姿态更新示例(离散化)
// q: 当前姿态四元数, w: 角速度(rad/s), dt: 采样间隔
void quaternion_update(double q[4], double w[3], double dt) {
double wx = w[0], wy = w[1], wz = w[2];
double norm = sqrt(wx*wx + wy*wy + wz*wz);
double half_theta = 0.5 * norm * dt;
// 小角度近似,实际项目建议用精确公式
double s = sin(half_theta) / norm;
double qw = cos(half_theta);
double qx = wx * s;
double qy = wy * s;
double qz = wz * s;
// 四元数乘法更新
double q0 = q[0], q1 = q[1], q2 = q[2], q3 = q[3];
q[0] = q0*qw - q1*qx - q2*qy - q3*qz;
q[1] = q0*qx + q1*qw + q2*qz - q3*qy;
q[2] = q0*qy - q1*qz + q2*qw + q3*qx;
q[3] = q0*qz + q1*qy - q2*qx + q3*qw;
// 归一化
double inv_norm = 1.0 / sqrt(q[0]*q[0] + q[1]*q[1] + q[2]*q[2] + q[3]*q[3]);
q[0] *= inv_norm; q[1] *= inv_norm; q[2] *= inv_norm; q[3] *= inv_norm;
}
注意:四元数一定要记得归一化!我曾经因为忘记归一化,导致姿态越算越歪,最后定位误差累积到几十米。查了两天才找到这个bug。
4.2.2 速度与位置更新
有了姿态,就可以把加速度计的比力从载体坐标系转换到导航坐标系,然后扣除重力,再积分得到速度和位置。
公式很简单:
- 速度更新:v_new = v_old + (C * a_measured - g) * dt
- 位置更新:p_new = p_old + v_avg * dt
其中C是姿态矩阵,把载体坐标系的加速度转到导航坐标系。这里有个细节——速度更新时,建议用梯形积分,比矩形积分更准。
4.3 IMU误差模型
IMU不是完美的。它有一堆误差,你得了解它们,才能在融合算法里补偿掉。
4.3.1 确定性误差
| 误差类型 | 描述 | 典型值(消费级) |
|---|---|---|
| 零偏(Bias) | 静止时输出不为0的常值偏移 | 加速度计:±50 mg 陀螺仪:±5 °/s |
| 比例因子(Scale Factor) | 输入输出比例不准确 | 0.1% ~ 1% |
| 轴间对准误差 | 三个轴不是严格正交 | 0.1° ~ 1° |
这些误差可以在实验室标定出来,然后做硬补偿。我建议每次上电后做一次静态初始化,估算零偏。
4.3.2 随机误差
随机误差才是真正头疼的。它们没法完全消除,只能用滤波算法去估计。
- 角度随机游走(ARW):陀螺仪噪声积分后,角度误差像随机游走一样增长。单位是°/√h。
- 速度随机游走(VRW):加速度计噪声积分后,速度误差增长。单位是m/s/√h。
- 零偏不稳定性(Bias Instability):零偏随时间缓慢漂移,是惯导精度的核心指标。
避坑指南:我曾经在一个项目中,只关注了零偏,忽略了角度随机游走。结果纯惯导模式下,前10秒还行,30秒后角度误差就大到不可接受。后来换了低ARW的IMU,问题才解决。选型时,这两个指标都要看。
4.4 零偏与噪声特性
零偏和噪声,是IMU误差模型里最重要的两个概念。我单独拿出来讲,因为它们在融合算法里是状态量。
4.4.1 零偏的建模
零偏不是常数,它会缓慢变化。通常建模为一阶马尔可夫过程或随机游走。在卡尔曼滤波里,我们把零偏作为状态变量,实时估计和补偿。
零偏的典型特性:
- 上电重复性:每次上电的零偏可能不同
- 温度相关性:温度变化1°C,零偏可能漂移几mg
- 长期稳定性:好的IMU,零偏几个月漂移不超过0.1°/s
我的习惯:每次上电后,让车辆静止5秒钟,采集IMU数据取平均,作为初始零偏估计。虽然不完美,但比直接用出厂标定值好很多。尤其是在温度变化大的场景下。
4.4.2 噪声特性分析
IMU噪声通常用Allan方差来分析。你可以把IMU静止放几个小时,采集数据,然后画Allan方差曲线。从曲线上能读出ARW、零偏不稳定性、量化噪声等参数。
为什么要做这个?因为你要给卡尔曼滤波设置噪声协方差矩阵。设小了,滤波发散;设大了,滤波太保守,定位精度差。
// Allan方差计算简化流程
// 1. 采集N个静止数据点,采样率fs
// 2. 对不同的聚类时间tau = m/fs,计算方差
// 3. 在log-log图上,斜率-1/2处读出ARW
// 4. 曲线最低点读出零偏不稳定性
// 伪代码示意
for (int m = 1; m < N/2; m *= 2) {
double tau = m / fs;
double sum_var = 0;
for (int k = 0; k < N - 2*m; k += m) {
double theta1 = mean(data, k, k+m);
double theta2 = mean(data, k+m, k+2*m);
sum_var += (theta2 - theta1) * (theta2 - theta1);
}
allan_var[m] = sum_var / (2 * (N/m - 1));
}
注意:Allan方差分析需要足够长的静态数据。我建议至少采集2小时。如果只采集几分钟,低频噪声特性根本看不出来。别问我怎么知道的——我当年就因为这个,把滤波器的噪声参数设错了,导致定位精度一直上不去。
4.5 本章小结
这一章我们聊了IMU的核心原理和误差特性。总结几个要点:
- 加速度计测比力,陀螺仪测角速度,两者都有零偏和噪声
- 捷联惯导的核心是姿态更新,推荐用四元数法
- IMU误差分确定性和随机性,随机误差用Allan方差分析
- 零偏是卡尔曼滤波里的重要状态量,需要实时估计
下一章,我们会把这些IMU数据和GPS、视觉等传感器融合起来。嗯,那才是真正有意思的部分。到时候见。