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 当前的核心结构如下:

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/                           # 文档与博客素材

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

flowchart LR A[&#34;RINEX observations&#34;] --> B[&#34;GNSS front-end&#34;] C[&#34;Broadcast ephemeris&#34;] --> B D[&#34;Precise products<br/>SP3 / CLK / OSB / ERP&#34;] --> B E[&#34;IMU raw data&#34;] --> F[&#34;INS mechanization&#34;] G[&#34;Reference trajectory&#34;] --> H[&#34;Evaluation&#34;] B --> B1[&#34;SPP&#34;] B --> B2[&#34;PPP&#34;] B --> B3[&#34;PPK&#34;] B1 --> I[&#34;GNSS P/V&#34;] B2 --> I B3 --> I I --> J[&#34;Loose coupling&#34;] B1 --> K[&#34;Pseudorange ranges&#34;] K --> L[&#34;Tight coupling&#34;] F --> J F --> L J --> H L --> H

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

flowchart TD A[&#34;Raw GNSS / IMU data&#34;] --> B[&#34;SPP&#34;] A --> C[&#34;PPP&#34;] A --> D[&#34;PPK&#34;] A --> E[&#34;INS mechanization&#34;] B --> F[&#34;SPP-INS loose coupling&#34;] C --> G[&#34;PPP-INS loose coupling&#34;] D --> H[&#34;PPK-INS loose coupling&#34;] B --> I[&#34;SPP-INS pseudorange tight coupling&#34;] E --> F E --> G E --> H E --> I F --> J[&#34;Trajectory output&#34;] G --> J H --> J I --> J

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

  • 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 的工程主线已经跑通:

flowchart LR A[&#34;Raw data&#34;] --> B[&#34;GNSS solution&#34;] B --> C[&#34;GNSS/INS loose coupling&#34;] A --> D[&#34;IMU mechanization&#34;] D --> C C --> E[&#34;Evaluation plots&#34;]

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

  • 把 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 紧耦合、模糊度固定和真实复杂环境下的鲁棒性。

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

相关推荐
zzzzzz3108 小时前
当产品经理说这个很简单:我用Python自动化处理奇葩需求的实战指南
python·pycharm·产品经理
雪隐8 小时前
个人电脑玩AI-06让5060 Ti给你打工——不光能画画,Qwen3-TTS还能学人说话,连我老板都信了!
人工智能·后端·python
兵慌码乱20 小时前
面向桌面端的资产管理系统分层架构设计与核心模块实现
python·系统架构·sqlite·pyqt5·数据库设计·桌面应用开发·mvc架构
hboot21 小时前
AI工程师第三课 - 机器学习基础
python·scikit-learn·kaggle
顾林海1 天前
Agent入门阶段-编程基础-Python:流程控制
python·agent·ai编程
呱呱复呱呱1 天前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django
曲幽1 天前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
荣码1 天前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
兵慌码乱2 天前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理