CompassFusion:一个从 GNSS 到 GNSS/INS 组合导航的独立工程包

CompassFusion:一个从 GNSS 到 GNSS/INS 组合导航的独立工程包

1. 为什么做 CompassFusion

在 GNSS/INS 组合导航实验里,经常会遇到一个现实问题:算法、数据、配置和测试脚本分散在不同目录里。单独看某一个模块时似乎能跑,但一旦想复现实验,就需要重新找 RINEX、星历、IMU、真值、配置文件和对比脚本。

CompassFusion的目标是把这些内容整理成一个更完整的独立软件包:

  • 保留 GNSS 基础处理能力:SPP、PPP、PPK。
  • 加入 INS 机械编排。
  • 实现 GNSS/INS 松耦合与伪距级紧耦合实验框架。
  • 提供统一 XML 配置入口。
  • 随包提供一套真实 GREAT/MSF 数据样例。
  • 提供测试脚本、结果图和数据说明,方便复现实验。

项目地址:

  • GitHub:https://github.com/yanghengqi/CompassFusion
  • Gitee:https://gitee.com/henryyang1314/compass-fusion

2. 软件整体结构

CompassFusion 当前的核心结构如下:

CompassFusion ├── src/ │ ├── run_compass_fusion.py # 统一 XML 入口 │ ├── run_spp.py # SPP 入口 │ ├── run_ppp.py # PPP 入口 │ ├── run_ppk.py # PPK 入口 │ └── compass/ │ ├── core/ # 坐标、常量、基础类型 │ ├── gnss/ # SPP/PPP/PPK/精密产品/偏差模型 │ ├── ins/ # 机械编排、松耦合、紧耦合 │ └── io/ # RINEX 与输入解析 ├── configs/ # XML 配置 ├── data_examples/ # 随包真实数据样例 ├── scripts/ # 批处理、导出、诊断脚本 ├── tests/ # 回归测试 └── docs/ # 文档与博客素材

如果画成模块图,大致是这样的:

RINEX observations

GNSS front-end

Broadcast ephemeris

Precise products
SP3 / CLK / OSB / ERP

IMU raw data

INS mechanization

Reference trajectory

Evaluation

SPP

PPP

PPK

GNSS P/V

Loose coupling

Pseudorange ranges

Tight coupling

3. 随包数据:不是只有代码,而是能跑的导航输入

这次整理时没有只放结果文件,而是放了一套真实导航输入数据。位置如下:

data_examples/great_msf_20211013/

主要内容包括:

类型文件或目录作用
流动站观测GNSS/SEPT2860.21O动态站 RINEX 观测
基站观测GNSS/R2932860.21oRTK/PPK 差分参考站
广播星历GNSS/brdm2860.21pSPP、PPK、伪距紧耦合输入生成
IMU 原始数据IMU/smallimu_out_2.txtINS 机械编排与组合导航
GNSS 真值groundtruth/groundtruth_211013_GNSS.txtGNSS 轨迹对比
GNSS/INS 真值groundtruth/groundtruth_211013_ADIS.txt组合导航位置、速度、姿态参考
精密轨道products/sp3/*.SP3PPP 精密轨道
精密钟差products/clk/*.CLKPPP 精密钟差
OSB/OBXproducts/bia/*偏差与姿态辅助产品
ERP/DCBproducts/erp/,products/dcb/地球自转与码偏差产品
模型文件model/ATX、EOP、海潮、JPL 星历等

这意味着拿到仓库以后,不需要立刻去找外部数据,就能先跑一套真实数据演示。

4. 当前支持的处理链路

CompassFusion 当前更像一个“工程可运行版”,而不是宣称所有高精度模型都已经完全成熟的最终科研软件。当前比较稳定的链路如下:

Raw GNSS / IMU data

SPP

PPP

PPK

INS mechanization

SPP-INS loose coupling

PPP-INS loose coupling

PPK-INS loose coupling

SPP-INS pseudorange tight coupling

Trajectory output

目前可以比较放心展示的能力:

  • GNSS SPP / PPP / PPK 基础处理。
  • IMU 机械编排。
  • GNSS/INS 松耦合。
  • SPP-INS 伪距级紧耦合实验。
  • XML 配置化运行。
  • 真实 GREAT/MSF 数据测试。
  • 测试脚本与结果对比。

仍然属于后续增强的能力:

  • PPP/RTK 载波相位紧耦合。
  • 紧耦合模糊度参数估计与固定。
  • 更完整的多系统码偏差、相位偏差和鲁棒异常处理。
  • 长时间 GNSS 中断下的惯导误差控制。

5. 统一入口与配置文件

统一入口是:

src/run_compass_fusion.py

示例配置是:

configs/compass_fusion_great_msf_example.xml

典型运行方式:

$env:PYTHONPATH ="$PWD\src"&'D:\annaconda\envs\BraVL\python.exe'src\run_compass_fusion.py--config configs\compass_fusion_great_msf_example.xml

PPP 示例脚本:

scripts\run_ppp_great_msf_example.ps1

测试命令:

$env:PYTHONPATH ="$PWD\src"&'D:\annaconda\envs\BraVL\python.exe'-m pytest tests

配置文件中可以调整的内容包括:

配置类别示例参数说明
基本模式mode=loose/tight/mechanization选择机械编排、松耦合或紧耦合
时间范围start_sow,end_sow选择处理时间段
输入文件rinexo,rinexn,imu,truth指定观测、星历、IMU 和真值
精密产品sp3,clk,bias,atx,EOP,blqPPP/精密模型所需产品
GNSS 设置sys,sat_rm,minimum_elev系统选择、剔除卫星、高度角
滤波设置gyro_noise,accel_noise,GateSigmaIMU 噪声、滤波门限
杆臂设置AntennaLever天线到 IMU 的杆臂
输出设置outputs/ins,rate_hz输出路径和输出频率

6. 测试结果概览

当前发布候选测试结果如下。这里的数值用于说明当前工程状态,不建议把它理解为最终科研性能上限。

Case模式匹配历元Median / mRMS / mP95 / mMax / m
GREAT looseloose600.0160.0160.0170.017
Synthetic tighttight310.0340.0910.1870.206
Real SPP-INSloose601.6822.1143.8825.704
Real SPP-INStight6015.18815.40116.91917.041
Real PPP-INSloose601.3701.3751.4041.410
Real PPK-INSloose600.5430.5700.7690.771

从这个表可以看出:

  • GREAT 松耦合示例已经能达到厘米级对齐效果。
  • 合成紧耦合可以稳定跑通,误差在分米级。
  • 真实 SPP 松耦合是米级,这符合单点定位作为组合输入的预期。
  • 真实 SPP 紧耦合当前仍明显偏大,说明伪距紧耦合还需要继续完善钟差、系统间偏差、量测权和异常剔除。
  • PPK-INS 松耦合优于 SPP-INS,说明高质量 GNSS P/V 对组合导航很关键。

7. 结果图展示

7.1 GREAT 松耦合结果

GREAT 松耦合样例误差非常小,主要用于验证 INS 机械编排、杆臂、时间同步和松耦合框架是否正确。

误差累计分布:

7.2 合成紧耦合结果

合成紧耦合用于验证伪距量测更新、滤波状态传播、钟差初始化和量测门限逻辑。

7.3 真实 SPP-INS 松耦合

真实 SPP-INS 松耦合使用 RINEX 派生的 SPP 位置速度作为 GNSS 输入。误差在米级,主要反映 SPP 本身的观测质量和模型误差。

7.4 真实 SPP-INS 紧耦合

真实 SPP 紧耦合目前还不是最终状态。当前结果偏大,主要原因可能包括:

  • 多系统接收机钟差与系统间偏差建模仍不够完整。
  • 伪距异常值、低高度角卫星和 NLOS 风险需要更强鲁棒处理。
  • 伪距量测权与 INS 过程噪声还需要针对真实数据重新标定。
  • 目前还没有引入载波相位紧耦合和模糊度状态。

7.5 真实 PPP-INS 与 PPK-INS 松耦合

PPP-INS 松耦合:

PPK-INS 松耦合:

8. 一个比较实用的结论

从目前结果看,CompassFusion 的工程主线已经跑通:

Raw data

GNSS solution

GNSS/INS loose coupling

IMU mechanization

Evaluation plots

但是如果要进一步把“紧耦合”做成可以正式对外宣传的高精度功能,还需要继续做这些工作:

  • 把 PPP/RTK 载波相位量测引入紧耦合。
  • 在紧耦合滤波器中加入模糊度状态。
  • 做整数模糊度固定和部分模糊度选择。
  • 做更系统的钟差、系统间偏差和码偏差建模。
  • 对真实数据下的异常卫星和粗差进行更强的鲁棒隔离。

9. 如何复现实验

克隆仓库:

git clone https://github.com/yanghengqi/CompassFusion.git cd CompassFusion

或者使用 Gitee:

git clone https://gitee.com/henryyang1314/compass-fusion.git cd compass-fusion

安装依赖:

&'D:\annaconda\envs\BraVL\python.exe'-m pip install-e.

运行示例:

$env:PYTHONPATH ="$PWD\src"&'D:\annaconda\envs\BraVL\python.exe'src\run_compass_fusion.py--config configs\compass_fusion_great_msf_example.xml

运行 PPP 示例:

scripts\run_ppp_great_msf_example.ps1

运行测试:

&'D:\annaconda\envs\BraVL\python.exe'-m pytest tests

10. 当前版本的定位

我更倾向于把当前版本称为:

CompassFusion v0.1 engineering release candidate

它不是一个“所有模型都已经完全完成”的最终版,而是一个把 GNSS、INS、松耦合、紧耦合入口、真实数据和测试脚本组织到一起的工程基线版本。

这个版本的价值在于:

  • 能跑。
  • 数据链路清楚。
  • 配置入口清楚。
  • 测试结果可复现。
  • 后续可以继续在同一个框架下补 PPP/RTK 紧耦合、模糊度固定和更完整的真实数据测试。

11. 后续计划

后续我计划继续推进:

  • 完善真实 SPP 紧耦合稳定性。
  • 实现 PPP/RTK 载波相位紧耦合。
  • 加入紧耦合模糊度状态与整数固定。
  • 完善多系统偏差模型。
  • 增加 GNSS 中断场景下的 INS 约束测试。
  • 补充更多公开数据集的自动化测试。
  • 增加更完整的结果图自动生成脚本。

12. 小结

CompassFusion 目前已经从一个分散的实验工程,整理成了一个可以独立发布、可以复现实验、也可以继续迭代的 GNSS/INS 软件包。

如果只看当前最稳的链路,松耦合已经具备演示和继续开发的基础;如果看未来方向,真正值得投入的是 PPP/RTK 紧耦合、模糊度固定和真实复杂环境下的鲁棒性。

这也是后续版本最核心的技术路线。