3、惯性导航系统(INS)原理:加速度计与陀螺仪基础、捷联惯导算法、误差累积特性
各位好,我是老张。今天咱们聊聊惯性导航系统,也就是INS。说实话,这玩意儿是我在应急处理中最依赖,也最头疼的系统。为什么?因为它不依赖任何外部信号,完全靠自己就能算出位置。但代价就是——误差会像滚雪球一样越滚越大。
我刚开始接触惯导时,总觉得这东西很神秘。后来拆过几台坏掉的IMU,才真正明白它就是个物理传感器组合。说白了,就是加速度计测加速度,陀螺仪测角速度,然后通过积分算出位置和姿态。
3.1 加速度计与陀螺仪基础
先说说加速度计。它的原理其实很简单——测量比力。什么是比力?就是物体受到的除了重力以外的合力。你想想看,手机平放桌上,加速度计读数是0吗?不是,它读的是重力加速度g,方向向上。因为桌面给了它一个支撑力。
我在项目中遇到过一件事:有个同事把IMU装在振动很大的设备上,结果加速度计数据全是噪声。后来我建议他加了个低通滤波器,数据才稳定下来。嗯,这里要注意,加速度计对高频振动特别敏感。
陀螺仪呢?它测量的是角速度。早期是机械式的,现在基本都是MEMS(微机电系统)或者光纤陀螺。MEMS便宜但精度差,光纤陀螺贵但稳定。我个人的习惯是:消费级产品用MEMS,工业级用光纤陀螺。
- 加速度计:测量比力(单位:m/s²),包含重力分量
- 陀螺仪:测量角速度(单位:°/s 或 rad/s)
- IMU:惯性测量单元,包含3轴加速度计+3轴陀螺仪
这里有个坑:加速度计不能区分重力和运动加速度。你想想看,如果IMU在自由落体,加速度计读数是0。但如果你把它放在倾斜的桌面上,它读到的重力分量会变化。这就是为什么惯导需要初始对准——先确定重力方向。
3.2 捷联惯导算法
捷联惯导,说白了就是把IMU直接固定在载体上,不搞什么平台。算法负责把传感器数据转换成导航信息。核心就三步:姿态更新、速度更新、位置更新。
我画了个流程图,你看看就明白了:
算法流程其实不复杂。陀螺仪数据用来更新姿态,加速度计数据经过姿态矩阵变换后,扣除重力,再积分得到速度和位置。我个人的习惯是,姿态更新用四元数法,因为它没有万向锁问题。
给你看一段简化的代码,这是姿态更新的核心:
// 四元数姿态更新(简化版)
void updateAttitude(gyro_data_t* gyro, quaternion_t* q, float dt) {
float wx = gyro->x * dt / 2.0f;
float wy = gyro->y * dt / 2.0f;
float wz = gyro->z * dt / 2.0f;
// 四元数微分方程
quaternion_t dq;
dq.w = -q->x * wx - q->y * wy - q->z * wz;
dq.x = q->w * wx + q->y * wz - q->z * wy;
dq.y = q->w * wy - q->x * wz + q->z * wx;
dq.z = q->w * wz + q->x * wy - q->y * wx;
// 更新四元数
q->w += dq.w * dt;
q->x += dq.x * dt;
q->y += dq.y * dt;
q->z += dq.z * dt;
// 归一化
float norm = sqrt(q->w*q->w + q->x*q->x + q->y*q->y + q->z*q->z);
q->w /= norm;
q->x /= norm;
q->y /= norm;
q->z /= norm;
}
3.3 误差累积特性
这是惯导最让人头疼的地方。说白了,误差会随时间累积,而且是指数级的。为什么?因为积分会把误差放大。
你想想看:加速度计有偏置误差,比如0.01 m/s²。第一次积分后,速度误差变成0.01*t。第二次积分后,位置误差变成0.005*t²。也就是说,误差和时间平方成正比。跑10秒,误差0.5米;跑100秒,误差50米;跑1000秒,误差5000米!
我在项目中遇到过最夸张的一次:一个水下机器人用纯惯导导航,跑了30分钟后,位置误差达到了2公里。后来我们加了DVL(多普勒测速仪)辅助,才把误差压下来。
| 误差来源 | 典型值 | 对位置的影响(1小时后) |
|---|---|---|
| 加速度计偏置 | 0.01 m/s² | 约 648 米 |
| 陀螺仪漂移 | 0.1 °/h | 约 1.7 公里(取决于运动) |
| 初始对准误差 | 0.1° | 约 1.7 公里(水平方向) |
| 刻度因子误差 | 0.1% | 约 3.6 公里(匀速运动) |
看到这个表,你就明白为什么惯导不能单独用太久。我个人的经验是:
- 消费级MEMS:纯惯导只能撑30秒到1分钟
- 工业级光纤陀螺:可以撑5-10分钟
- 航海级激光陀螺:能撑30分钟到1小时
误差累积还有一个特点:它是振荡的。因为地球自转和重力作用,惯导系统会有舒勒周期(约84分钟)和傅科周期(随纬度变化)。说白了,误差不是一直往上长,而是像钟摆一样来回晃。但振幅会越来越大,最终发散。
嗯,这里要强调一点:误差累积是惯导的固有特性,无法完全消除。我们能做的只有:
- 提高传感器精度——但成本会指数级上升
- 引入外部辅助——比如GPS、磁力计、气压计
- 算法优化——比如卡尔曼滤波、零速修正
我个人最推荐第三种方案。因为传感器精度受限于物理定律和成本,而算法优化是性价比最高的方式。我在做行人导航时,就靠零速修正(Zupt)把定位误差从每分钟几十米降到了每分钟几米。
- 加速度计和陀螺仪是惯导的「眼睛」,但都有误差
- 捷联惯导算法通过积分计算位置,但积分会放大误差
- 误差累积是惯导的天敌,必须用外部辅助或算法来抑制
好了,关于惯导原理就聊这么多。记住一句话:惯导是个好东西,但别指望它单独撑太久。应急处理时,如果GPS失效,惯导能帮你撑几分钟到几十分钟,但一定要尽快找到其他辅助手段。