1. 为什么要开发 CompassFusion
在 GNSS/INS 组合导航的日常研究与开发中,不少同行可能都有类似的困扰:算法模块、导航数据、配置参数和测试脚本分散在多个目录中。单独看某个模块似乎都能正常运行,但真要复现一次完整的组合导航实验时,却需要四处搜寻 RINEX 文件、广播星历、IMU 数据以及真值轨迹,还得逐一核对配置文件和对比脚本——整个过程相当耗时费力。
CompassFusion 的设计目标非常明确:将这些零散的内容整合成一个结构清晰、可独立运行的完整软件包。具体来说,主要聚焦以下几个方面:
- 保留 GNSS 的基础处理能力:SPP、PPP、PPK 等核心定位模式。
- 集成 INS 的机械编排模块,实现惯导解算。
- 搭建 GNSS/INS 松耦合与伪距级紧耦合的实验框架,便于算法验证。
- 提供统一的 XML 配置入口,告别以往零散的参数管理方式。
- 随包附带一套真实的 GREAT/MSF 数据样例,开箱即可运行。
- 配备测试脚本、结果图示与数据说明文档,方便快速复现和验证实验结果。
项目地址:
- GitHub:
- Gitee:
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/ # 文档与博客素材
若将其绘制成模块图,各组件之间的关联关系会更加清晰明了:
3. 随包数据:不仅是代码,更是可运行的导航输入
本次整合的关键思路在于,不能只提供一堆最终结果文件。我们随包放置了一套真实的导航输入数据,存放路径如下:
复制代码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. 统一入口与配置文件说明
统一程序入口为:
复制代码src/run_compass_fusion.py
示例配置文件位于:
复制代码configs/compass_fusion_great_msf_example.xml
典型的运行命令如下:
复制代码$env:PYTHONPATH = "$PWDsrc"
& 'D:annacondaenvsBraVLpython.exe' srcrun_compass_fusion.py --config configscompass_fusion_great_msf_example.xml
PPP 示例脚本:
复制代码scriptsrun_ppp_great_msf_example.ps1
测试执行命令:
复制代码$env:PYTHONPATH = "$PWDsrc"
& 'D:annacondaenvsBraVLpython.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 位置和速度对组合导航的精度起着决定性作用。
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. 如何复现实验
想亲自跑一遍实验?操作步骤非常简单:
克隆仓库:
复制代码git clone
cd CompassFusion
或者使用 Gitee 镜像:
复制代码git clone
cd compass-fusion
安装依赖:
复制代码& 'D:annacondaenvsBraVLpython.exe' -m pip install -e .
运行示例:
复制代码$env:PYTHONPATH = "$PWDsrc"
& 'D:annacondaenvsBraVLpython.exe' srcrun_compass_fusion.py --config configscompass_fusion_great_msf_example.xml
运行 PPP 示例:
复制代码scriptsrun_ppp_great_msf_example.ps1
运行测试:
复制代码& 'D:annacondaenvsBraVLpython.exe' -m pytest tests
10. 当前版本的定位
这里需要明确一点,当前版本更适合被定义为一个“工程基线版本”。
它并非所有模型都已完美收官的最终版本,而是一个将 GNSS、INS、松耦合、紧耦合入口、真实数据以及测试脚本有效组织到一起的工程基础。这个版本的核心价值体现在:
- 能够正常运行。
- 数据链路清晰透明。
- 配置入口直观明确。
- 测试结果可复现、可验证。
- 后续可以在同一框架下,继续补齐 PPP/RTK 紧耦合、模糊度固定以及更全面的真实数据测试。
11. 后续计划
后续的推进方向也十分明确:
- 完善真实 SPP 紧耦合的稳定性与精度。
- 实现 PPP/RTK 载波相位紧耦合。
- 加入紧耦合模糊度状态与整数固定功能。
- 完善多系统偏差模型。
- 增加 GNSS 中断场景下的 INS 约束测试。
- 补充更多公开数据集的自动化测试用例。
- 增加更完善的结果图自动生成脚本。
12. 小结
总体而言,CompassFusion 已经从一个分散的实验工程,整理成了一个可独立发布、可复现实验、也能持续迭代的 GNSS/INS 组合导航软件包。
如果只看当前最稳定的链路,松耦合已经具备了演示和继续开发的基础;如果展望未来的方向,真正值得投入精力的,是 PPP/RTK 紧耦合、模糊度固定以及在真实复杂环境下的鲁棒性提升。
这也是后续版本最核心的技术演进路线。
