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 当前的核心结构如下:
text
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/ # 文档与博客素材
如果画成模块图,大致是这样的:
3. 随包数据:不是只有代码,而是能跑的导航输入
这次整理时没有只放结果文件,而是放了一套真实导航输入数据。位置如下:
text
data_examples/great_msf_20211013/
主要内容包括:
| 类型 | 文件或目录 | 作用 |
|---|---|---|
| 流动站观测 | GNSS/SEPT2860.21O |
动态站 RINEX 观测 |
| 基站观测 | GNSS/R2932860.21o |
RTK/PPK 差分参考站 |
| 广播星历 | GNSS/brdm2860.21p |
SPP、PPK、伪距紧耦合输入生成 |
| IMU 原始数据 | IMU/smallimu_out_2.txt |
INS 机械编排与组合导航 |
| GNSS 真值 | groundtruth/groundtruth_211013_GNSS.txt |
GNSS 轨迹对比 |
| GNSS/INS 真值 | groundtruth/groundtruth_211013_ADIS.txt |
组合导航位置、速度、姿态参考 |
| 精密轨道 | products/sp3/*.SP3 |
PPP 精密轨道 |
| 精密钟差 | products/clk/*.CLK |
PPP 精密钟差 |
| OSB/OBX | products/bia/* |
偏差与姿态辅助产品 |
| ERP/DCB | products/erp/, products/dcb/ |
地球自转与码偏差产品 |
| 模型文件 | model/ |
ATX、EOP、海潮、JPL 星历等 |
这意味着拿到仓库以后,不需要立刻去找外部数据,就能先跑一套真实数据演示。
4. 当前支持的处理链路
CompassFusion 当前更像一个"工程可运行版",而不是宣称所有高精度模型都已经完全成熟的最终科研软件。当前比较稳定的链路如下:
目前可以比较放心展示的能力:
- GNSS SPP / PPP / PPK 基础处理。
- IMU 机械编排。
- GNSS/INS 松耦合。
- SPP-INS 伪距级紧耦合实验。
- XML 配置化运行。
- 真实 GREAT/MSF 数据测试。
- 测试脚本与结果对比。
仍然属于后续增强的能力:
- PPP/RTK 载波相位紧耦合。
- 紧耦合模糊度参数估计与固定。
- 更完整的多系统码偏差、相位偏差和鲁棒异常处理。
- 长时间 GNSS 中断下的惯导误差控制。
5. 统一入口与配置文件
统一入口是:
text
src/run_compass_fusion.py
示例配置是:
text
configs/compass_fusion_great_msf_example.xml
典型运行方式:
powershell
$env:PYTHONPATH = "$PWD\src"
& 'D:\annaconda\envs\BraVL\python.exe' src\run_compass_fusion.py --config configs\compass_fusion_great_msf_example.xml
PPP 示例脚本:
powershell
scripts\run_ppp_great_msf_example.ps1
测试命令:
powershell
$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, blq |
PPP/精密模型所需产品 |
| GNSS 设置 | sys, sat_rm, minimum_elev |
系统选择、剔除卫星、高度角 |
| 滤波设置 | gyro_noise, accel_noise, GateSigma |
IMU 噪声、滤波门限 |
| 杆臂设置 | AntennaLever |
天线到 IMU 的杆臂 |
| 输出设置 | outputs/ins, rate_hz |
输出路径和输出频率 |
6. 测试结果概览
当前发布候选测试结果如下。这里的数值用于说明当前工程状态,不建议把它理解为最终科研性能上限。
| Case | 模式 | 匹配历元 | Median / m | RMS / m | P95 / m | Max / m |
|---|---|---|---|---|---|---|
| GREAT loose | loose | 60 | 0.016 | 0.016 | 0.017 | 0.017 |
| Synthetic tight | tight | 31 | 0.034 | 0.091 | 0.187 | 0.206 |
| Real SPP-INS | loose | 60 | 1.682 | 2.114 | 3.882 | 5.704 |
| Real SPP-INS | tight | 60 | 15.188 | 15.401 | 16.919 | 17.041 |
| Real PPP-INS | loose | 60 | 1.370 | 1.375 | 1.404 | 1.410 |
| Real PPK-INS | loose | 60 | 0.543 | 0.570 | 0.769 | 0.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 的工程主线已经跑通:
但是如果要进一步把"紧耦合"做成可以正式对外宣传的高精度功能,还需要继续做这些工作:
- 把 PPP/RTK 载波相位量测引入紧耦合。
- 在紧耦合滤波器中加入模糊度状态。
- 做整数模糊度固定和部分模糊度选择。
- 做更系统的钟差、系统间偏差和码偏差建模。
- 对真实数据下的异常卫星和粗差进行更强的鲁棒隔离。
9. 如何复现实验
克隆仓库:
powershell
git clone https://github.com/yanghengqi/CompassFusion.git
cd CompassFusion
或者使用 Gitee:
powershell
git clone https://gitee.com/henryyang1314/compass-fusion.git
cd compass-fusion
安装依赖:
powershell
& 'D:\annaconda\envs\BraVL\python.exe' -m pip install -e .
运行示例:
powershell
$env:PYTHONPATH = "$PWD\src"
& 'D:\annaconda\envs\BraVL\python.exe' src\run_compass_fusion.py --config configs\compass_fusion_great_msf_example.xml
运行 PPP 示例:
powershell
scripts\run_ppp_great_msf_example.ps1
运行测试:
powershell
& '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 紧耦合、模糊度固定和真实复杂环境下的鲁棒性。
这也是后续版本最核心的技术路线。