游乐游手机版
首页/编程语言/文章详情

CompassFusion实现从GNSS到GNSS/INS组合导航的独立软件工程包方案

时间:2026-06-27 06:43
CompassFusion是一个整合GNSS与INS组合导航的独立工程包,集成SPP、PPP、PPK、IMU机械编排、松耦合及伪距级紧耦合框架,提供统一XML配置入口和真实数据样例。松耦合链路稳定输出合理结果,紧耦合需继续完善钟差建模与异常处理,旨在构建可复现的工程基线版本。

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.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 当前定位更偏向于一个“工程可运行版本”,而非号称所有高精度模型都已完全成熟的最终科研软件。目前相对稳定的处理链路包括:

可以稳定展示的功能如下:

  • 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, 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 位置和速度对组合导航的精度起着决定性作用。

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 紧耦合、模糊度固定以及在真实复杂环境下的鲁棒性提升。

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

来源:https://juejin.cn/post/7654760064243466255
上一篇dumpcap在故障排查中的具体应用方法与操作步骤详解 下一篇JDK 1.7 安装配置教程与基础使用指南
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
CentOS与Golang打包常见兼容性问题探讨
编程语言 · 2026-07-01

CentOS与Golang打包常见兼容性问题探讨

CentOS与Golang打包的兼容性问题集中在glibc版本不匹配、交叉编译环境变量错误、依赖库缺失及Go依赖管理不规范。可通过Docker容器编译、选择兼容Go版本、正确设置GOOS GOARCH环境变量、安装对应开发包及使用GoModules解决。

CentOS中Fortran与Python如何协同工作从入门到实战完整教程
编程语言 · 2026-07-01

CentOS中Fortran与Python如何协同工作从入门到实战完整教程

在CentOS中,Fortran与Python可通过f2py、SWIG、共享库调用或subprocess协同。f2py封装Fortran为Python模块,支持数组运算;共享库需手动对齐数据类型;系统调用适合独立计算。

CentOS中Golang打包优化方法
编程语言 · 2026-07-01

CentOS中Golang打包优化方法

在CentOS中优化Golang编译打包,可显著提升编译速度并减小二进制文件体积。关键技巧包括:设置环境变量、使用Go模块管理依赖、编译时添加-ldflags= "-s-w "去除调试信息、利用UPX工具压缩、运行strip清理符号表,以及优化cgo内C代码的编译选项。综合运用这些方法能有效优化最终程序。

在CentOS系统中cpustat与其他工具协同使用的完整方法
编程语言 · 2026-07-01

在CentOS系统中cpustat与其他工具协同使用的完整方法

cpustat作为sysstat包的CPU监控工具,可通过管道与grep等命令配合过滤数据,利用脚本自动记录带时间戳的日志,或结合图形工具查看,也可格式化输出后接入Zabbix、Grafana等Web监控系统,实现可视化与告警。

CentOS中readdir与其他Linux发行版的差异
编程语言 · 2026-07-01

CentOS中readdir与其他Linux发行版的差异

CentOS基于RHEL,与Ubuntu、Debian、Fedora在包管理器(yum dnfvsapt)、默认文件系统(XFSvsext4)等存在差异,但readdir等系统调用遵循POSIX标准,行为一致。