在 GNSS/INS 组合导航实验里,经常会遇到一个现实问题:算法、数据、配置和测试脚本分散在不同目录里。单独看某一个模块时似乎能跑,但一旦想复现实验,就需要重新找 RINEX、星历、IMU、真值、配置文件和对比脚本。
CompassFusion 的目标是把这些内容整理成一个更完整的独立软件包:
项目地址:
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/ # 文档与博客素材
如果画成模块图,大致是这样的:
这次整理时没有只放结果文件,而是放了一套真实导航输入数据。位置如下:
复制代码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 星历等 |
这意味着拿到仓库以后,不需要立刻去找外部数据,就能先跑一套真实数据演示。
CompassFusion 当前更像一个“工程可运行版”,而不是宣称所有高精度模型都已经完全成熟的最终科研软件。当前比较稳定的链路如下:
目前可以比较放心展示的能力:
仍然属于后续增强的能力:
统一入口是:
复制代码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 | 输出路径和输出频率 |
当前发布候选测试结果如下。这里的数值用于说明当前工程状态,不建议把它理解为最终科研性能上限。
| 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 松耦合样例误差非常小,主要用于验证 INS 机械编排、杆臂、时间同步和松耦合框架是否正确。

误差累计分布:

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


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

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

PPP-INS 松耦合:

PPK-INS 松耦合:

从目前结果看,CompassFusion 的工程主线已经跑通:
但是如果要进一步把“紧耦合”做成可以正式对外宣传的高精度功能,还需要继续做这些工作:
克隆仓库:
复制代码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
我更倾向于把当前版本称为:
它不是一个“所有模型都已经完全完成”的最终版,而是一个把 GNSS、INS、松耦合、紧耦合入口、真实数据和测试脚本组织到一起的工程基线版本。
这个版本的价值在于:
后续我计划继续推进:
CompassFusion 目前已经从一个分散的实验工程,整理成了一个可以独立发布、可以复现实验、也可以继续迭代的 GNSS/INS 软件包。
如果只看当前最稳的链路,松耦合已经具备演示和继续开发的基础;如果看未来方向,真正值得投入的是 PPP/RTK 紧耦合、模糊度固定和真实复杂环境下的鲁棒性。
这也是后续版本最核心的技术路线。