3、惯性导航系统(INS)原理:加速度计与陀螺仪基础、捷联惯导算法、误差累积特性

各位好,我是老张。今天咱们聊聊惯性导航系统,也就是INS。说实话,这玩意儿是我在应急处理中最依赖,也最头疼的系统。为什么?因为它不依赖任何外部信号,完全靠自己就能算出位置。但代价就是——误差会像滚雪球一样越滚越大。

我刚开始接触惯导时,总觉得这东西很神秘。后来拆过几台坏掉的IMU,才真正明白它就是个物理传感器组合。说白了,就是加速度计测加速度,陀螺仪测角速度,然后通过积分算出位置和姿态。

3.1 加速度计与陀螺仪基础

先说说加速度计。它的原理其实很简单——测量比力。什么是比力?就是物体受到的除了重力以外的合力。你想想看,手机平放桌上,加速度计读数是0吗?不是,它读的是重力加速度g,方向向上。因为桌面给了它一个支撑力。

我在项目中遇到过一件事:有个同事把IMU装在振动很大的设备上,结果加速度计数据全是噪声。后来我建议他加了个低通滤波器,数据才稳定下来。嗯,这里要注意,加速度计对高频振动特别敏感。

陀螺仪呢?它测量的是角速度。早期是机械式的,现在基本都是MEMS(微机电系统)或者光纤陀螺。MEMS便宜但精度差,光纤陀螺贵但稳定。我个人的习惯是:消费级产品用MEMS,工业级用光纤陀螺。

核心概念:
  • 加速度计:测量比力(单位:m/s²),包含重力分量
  • 陀螺仪:测量角速度(单位:°/s 或 rad/s)
  • IMU:惯性测量单元,包含3轴加速度计+3轴陀螺仪

这里有个坑:加速度计不能区分重力和运动加速度。你想想看,如果IMU在自由落体,加速度计读数是0。但如果你把它放在倾斜的桌面上,它读到的重力分量会变化。这就是为什么惯导需要初始对准——先确定重力方向。

避坑指南: 我曾经在无人机上遇到过一个问题:起飞前IMU没放平,结果导航系统以为飞机在倾斜,自动调整姿态导致炸机。所以,初始对准一定要做,而且要在静止状态下做。

3.2 捷联惯导算法

捷联惯导,说白了就是把IMU直接固定在载体上,不搞什么平台。算法负责把传感器数据转换成导航信息。核心就三步:姿态更新、速度更新、位置更新。

我画了个流程图,你看看就明白了:

捷联惯导算法流程图 IMU 原始数据 预处理 去偏置、滤波、标定 陀螺仪数据 角速度 ω 加速度计数据 比力 f 姿态更新 四元数/方向余弦矩阵 速度更新 积分加速度 → 速度 位置更新 积分速度 → 位置 反馈修正

算法流程其实不复杂。陀螺仪数据用来更新姿态,加速度计数据经过姿态矩阵变换后,扣除重力,再积分得到速度和位置。我个人的习惯是,姿态更新用四元数法,因为它没有万向锁问题。

给你看一段简化的代码,这是姿态更新的核心:

// 四元数姿态更新(简化版)
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;
}
经验之谈: 四元数归一化这一步千万别省。我见过有人偷懒没做归一化,结果跑了10分钟后姿态完全乱掉。归一化虽然简单,但能保证四元数始终是单位四元数,避免数值漂移。

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小时
避坑指南: 我曾经犯过一个错误:以为陀螺仪漂移是线性的,直接用固定值补偿。结果发现温度变化时漂移会变。后来我加了温度补偿模型,才把漂移从0.5°/h降到0.05°/h。所以,如果你要做高精度惯导,温度补偿是必须的。

误差累积还有一个特点:它是振荡的。因为地球自转和重力作用,惯导系统会有舒勒周期(约84分钟)和傅科周期(随纬度变化)。说白了,误差不是一直往上长,而是像钟摆一样来回晃。但振幅会越来越大,最终发散。

嗯,这里要强调一点:误差累积是惯导的固有特性,无法完全消除。我们能做的只有:

  1. 提高传感器精度——但成本会指数级上升
  2. 引入外部辅助——比如GPS、磁力计、气压计
  3. 算法优化——比如卡尔曼滤波、零速修正

我个人最推荐第三种方案。因为传感器精度受限于物理定律和成本,而算法优化是性价比最高的方式。我在做行人导航时,就靠零速修正(Zupt)把定位误差从每分钟几十米降到了每分钟几米。

核心总结:
  • 加速度计和陀螺仪是惯导的「眼睛」,但都有误差
  • 捷联惯导算法通过积分计算位置,但积分会放大误差
  • 误差累积是惯导的天敌,必须用外部辅助或算法来抑制

好了,关于惯导原理就聊这么多。记住一句话:惯导是个好东西,但别指望它单独撑太久。应急处理时,如果GPS失效,惯导能帮你撑几分钟到几十分钟,但一定要尽快找到其他辅助手段。

可可精品资料库