3. 松组合架构:定义、系统框图与数据流

好,咱们今天聊聊松组合。说实话,这是导航算法里最“友好”的一种组合方式了。我刚入行那会儿,第一个实战项目就是做松组合,当时觉得——嗯,这玩意儿挺直观的。

3.1 什么是松组合?

松组合,英文叫 Loosely Coupled Integration。说白了,就是让 GPS 和 INS 各干各的,然后在结果层面做“融合”。

具体来说:

  • GPS 自己算出一套位置、速度(通常是卡尔曼滤波后的结果)
  • INS 自己通过加速度计和陀螺仪积分出一套位置、速度
  • 然后我们把这两套结果拿过来,做个差值,喂给一个卡尔曼滤波器
  • 滤波器估计出 INS 的误差,再反馈回去修正

你看,整个过程就像两个独立的系统在“松松散散”地合作——各算各的,最后对一下答案。这也是“松组合”这个名字的由来。

核心特点:GPS 和 INS 各自独立导航,组合发生在导航结果层面(位置、速度),而不是原始观测层面。

3.2 系统框图

我习惯用一张图来理解松组合的架构。下面这个 SVG 是我自己画的,你一看就明白。

松组合导航系统框图 GPS 接收机 GPS 导航解算 IMU(加速度计+陀螺) INS 导航解算 位置/速度 (GPS) 位置/速度 (INS) 卡尔曼滤波器 误差估计(位置/速度/姿态) 反馈修正 图例 数据流 反馈修正 箭头方向

这张图我画得比较细。你看,左边是 GPS 通道,右边是 INS 通道,各自独立解算。然后在中间那个减法器里做差,差值送给卡尔曼滤波器。滤波器估计出误差后,再反馈回去修正 INS 的解算结果。

一个小技巧:我在项目里习惯把反馈修正画成虚线,这样一眼就能区分“数据流”和“反馈流”。团队评审时,大家看图的效率会高很多。

3.3 数据流详解:位置/速度松耦合

咱们把数据流拆开来看。松组合里,核心的数据流就两条:

3.3.1 前向数据流(GPS → 滤波器)

  • GPS 输出:经度、纬度、高度(位置),以及北向、东向、地向速度
  • INS 输出:同样格式的位置和速度(由 IMU 积分得到)
  • 差值计算:ΔP = P_GPS − P_INS,ΔV = V_GPS − V_INS
  • 滤波器输入:这个 ΔP 和 ΔV 作为观测向量 z

说白了,卡尔曼滤波器看到的“观测值”就是 GPS 和 INS 之间的差异。如果 INS 没误差,那这个差值应该只是 GPS 的噪声。但 INS 有漂移,所以差值里就包含了 INS 的误差信息。

3.3.2 反馈数据流(滤波器 → INS)

  • 滤波器输出:位置误差、速度误差、姿态误差、陀螺零偏、加速度计零偏
  • 反馈方式:用估计出的误差去修正 INS 的导航解
  • 修正公式:P_corrected = P_INS − δP,V_corrected = V_INS − δV

注意:我曾经在一个项目里吃过亏——反馈修正的频率太高了。INS 的误差变化其实很慢,你每毫秒都去修正,反而会把高频噪声引入 INS 解算。我建议反馈周期设在 1~10 秒之间,具体看你的 IMU 质量。

3.4 松组合的优缺点

聊完原理,说说实际感受。松组合最大的好处就是——简单、稳定、好调试

维度 优点 缺点
实现难度 低。GPS 和 INS 各自独立,可以分别调试 ——
计算量 小。滤波器状态量少(通常 15 维) ——
可靠性 高。GPS 失效时,INS 仍可独立工作 GPS 信号差时,组合效果会明显下降
精度 —— 不如紧组合。因为 GPS 内部已经滤波过一次,信息有损失
动态适应性 —— 高动态场景下,GPS 输出延迟会导致时序问题

我个人觉得,松组合特别适合那些“GPS 信号大部分时间都挺好”的场景。比如车载导航、无人机巡航。但如果你要做高精度测绘或者城市峡谷里的导航,那松组合可能就不太够用了。

3.5 一个简单的松组合伪代码

最后,给一段伪代码。你一看就明白整个流程了。

// 松组合主循环
while (running) {
    // 1. 读取 IMU 数据
    imu_data = read_imu();
    
    // 2. INS 解算(机械编排)
    ins.navigate(imu_data);  // 更新位置、速度、姿态
    
    // 3. 如果有新的 GPS 数据
    if (gps_available()) {
        gps_data = read_gps();
        
        // 4. 计算观测差值
        dz.position = gps_data.position - ins.position;
        dz.velocity = gps_data.velocity - ins.velocity;
        
        // 5. 卡尔曼滤波更新
        kf.predict();          // 时间更新
        kf.update(dz);         // 量测更新
        
        // 6. 反馈修正 INS
        ins.correct(kf.x_hat); // 用估计的误差修正
    }
    
    // 7. 输出导航结果
    output(ins.position, ins.velocity);
}

你看,核心逻辑就这么几行。我当年第一次跑通这个循环时,心里还挺激动的——两个独立的系统,就这么“松”地组合在一起,效果居然比单独用任何一个都好。

总结一下:松组合的核心思想就是“先独立解算,再融合结果”。它简单、可靠、易实现,是入门组合导航的最佳选择。但如果你追求极致精度,或者工作在恶劣的 GNSS 环境下,那就要考虑紧组合甚至深组合了。


公众号:蓝海资料掘金营,微信deep3321