1. 为什么做 CompassFusion在 GNSS/INS 组合导航实验里经常会遇到一个现实问题算法、数据、配置和测试脚本分散在不同目录里。单独看某一个模块时似乎能跑但一旦想复现实验就需要重新找 RINEX、星历、IMU、真值、配置文件和对比脚本。CompassFusion的目标是把这些内容整理成一个更完整的独立软件包保留 GNSS 基础处理能力SPP、PPP、PPK。加入 INS 机械编排。实现 GNSS/INS 松耦合与伪距级紧耦合实验框架。提供统一 XML 配置入口。随包提供一套真实 GREAT/MSF 数据样例。提供测试脚本、结果图和数据说明方便复现实验。项目地址GitHubhttps://github.com/yanghengqi/CompassFusionGiteehttps://gitee.com/henryyang1314/compass-fusion2. 软件整体结构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/ # 文档与博客素材如果画成模块图大致是这样的RINEX observationsGNSS front-endBroadcast ephemerisPrecise productsSP3 / CLK / OSB / ERPIMU raw dataINS mechanizationReference trajectoryEvaluationSPPPPPPPKGNSS P/VLoose couplingPseudorange rangesTight coupling3. 随包数据不是只有代码而是能跑的导航输入这次整理时没有只放结果文件而是放了一套真实导航输入数据。位置如下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 当前更像一个“工程可运行版”而不是宣称所有高精度模型都已经完全成熟的最终科研软件。当前比较稳定的链路如下Raw GNSS / IMU dataSPPPPPPPKINS mechanizationSPP-INS loose couplingPPP-INS loose couplingPPK-INS loose couplingSPP-INS pseudorange tight couplingTrajectory output目前可以比较放心展示的能力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 $PWD\srcD:\annaconda\envs\BraVL\python.exesrc\run_compass_fusion.py--config configs\compass_fusion_great_msf_example.xmlPPP 示例脚本scripts\run_ppp_great_msf_example.ps1测试命令$env:PYTHONPATH $PWD\srcD:\annaconda\envs\BraVL\python.exe-m pytest tests配置文件中可以调整的内容包括配置类别示例参数说明基本模式modeloose/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 / mGREAT looseloose600.0160.0160.0170.017Synthetic tighttight310.0340.0910.1870.206Real SPP-INSloose601.6822.1143.8825.704Real SPP-INStight6015.18815.40116.91917.041Real PPP-INSloose601.3701.3751.4041.410Real PPK-INSloose600.5430.5700.7690.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 的工程主线已经跑通Raw dataGNSS solutionGNSS/INS loose couplingIMU mechanizationEvaluation plots但是如果要进一步把“紧耦合”做成可以正式对外宣传的高精度功能还需要继续做这些工作把 PPP/RTK 载波相位量测引入紧耦合。在紧耦合滤波器中加入模糊度状态。做整数模糊度固定和部分模糊度选择。做更系统的钟差、系统间偏差和码偏差建模。对真实数据下的异常卫星和粗差进行更强的鲁棒隔离。9. 如何复现实验克隆仓库git clone https://github.com/yanghengqi/CompassFusion.git cd CompassFusion或者使用 Giteegit clone https://gitee.com/henryyang1314/compass-fusion.git cd compass-fusion安装依赖D:\annaconda\envs\BraVL\python.exe-m pip install-e.运行示例$env:PYTHONPATH $PWD\srcD:\annaconda\envs\BraVL\python.exesrc\run_compass_fusion.py--config configs\compass_fusion_great_msf_example.xml运行 PPP 示例scripts\run_ppp_great_msf_example.ps1运行测试D:\annaconda\envs\BraVL\python.exe-m pytest tests10. 当前版本的定位我更倾向于把当前版本称为CompassFusion v0.1 engineering release candidate它不是一个“所有模型都已经完全完成”的最终版而是一个把 GNSS、INS、松耦合、紧耦合入口、真实数据和测试脚本组织到一起的工程基线版本。这个版本的价值在于能跑。数据链路清楚。配置入口清楚。测试结果可复现。后续可以继续在同一个框架下补 PPP/RTK 紧耦合、模糊度固定和更完整的真实数据测试。11. 后续计划后续我计划继续推进完善真实 SPP 紧耦合稳定性。实现 PPP/RTK 载波相位紧耦合。加入紧耦合模糊度状态与整数固定。完善多系统偏差模型。增加 GNSS 中断场景下的 INS 约束测试。补充更多公开数据集的自动化测试。增加更完整的结果图自动生成脚本。12. 小结CompassFusion 目前已经从一个分散的实验工程整理成了一个可以独立发布、可以复现实验、也可以继续迭代的 GNSS/INS 软件包。如果只看当前最稳的链路松耦合已经具备演示和继续开发的基础如果看未来方向真正值得投入的是 PPP/RTK 紧耦合、模糊度固定和真实复杂环境下的鲁棒性。这也是后续版本最核心的技术路线。
CompassFusion:一个从 GNSS 到 GNSS/INS 组合导航的独立工程包
1. 为什么做 CompassFusion在 GNSS/INS 组合导航实验里经常会遇到一个现实问题算法、数据、配置和测试脚本分散在不同目录里。单独看某一个模块时似乎能跑但一旦想复现实验就需要重新找 RINEX、星历、IMU、真值、配置文件和对比脚本。CompassFusion的目标是把这些内容整理成一个更完整的独立软件包保留 GNSS 基础处理能力SPP、PPP、PPK。加入 INS 机械编排。实现 GNSS/INS 松耦合与伪距级紧耦合实验框架。提供统一 XML 配置入口。随包提供一套真实 GREAT/MSF 数据样例。提供测试脚本、结果图和数据说明方便复现实验。项目地址GitHubhttps://github.com/yanghengqi/CompassFusionGiteehttps://gitee.com/henryyang1314/compass-fusion2. 软件整体结构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/ # 文档与博客素材如果画成模块图大致是这样的RINEX observationsGNSS front-endBroadcast ephemerisPrecise productsSP3 / CLK / OSB / ERPIMU raw dataINS mechanizationReference trajectoryEvaluationSPPPPPPPKGNSS P/VLoose couplingPseudorange rangesTight coupling3. 随包数据不是只有代码而是能跑的导航输入这次整理时没有只放结果文件而是放了一套真实导航输入数据。位置如下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 当前更像一个“工程可运行版”而不是宣称所有高精度模型都已经完全成熟的最终科研软件。当前比较稳定的链路如下Raw GNSS / IMU dataSPPPPPPPKINS mechanizationSPP-INS loose couplingPPP-INS loose couplingPPK-INS loose couplingSPP-INS pseudorange tight couplingTrajectory output目前可以比较放心展示的能力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 $PWD\srcD:\annaconda\envs\BraVL\python.exesrc\run_compass_fusion.py--config configs\compass_fusion_great_msf_example.xmlPPP 示例脚本scripts\run_ppp_great_msf_example.ps1测试命令$env:PYTHONPATH $PWD\srcD:\annaconda\envs\BraVL\python.exe-m pytest tests配置文件中可以调整的内容包括配置类别示例参数说明基本模式modeloose/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 / mGREAT looseloose600.0160.0160.0170.017Synthetic tighttight310.0340.0910.1870.206Real SPP-INSloose601.6822.1143.8825.704Real SPP-INStight6015.18815.40116.91917.041Real PPP-INSloose601.3701.3751.4041.410Real PPK-INSloose600.5430.5700.7690.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 的工程主线已经跑通Raw dataGNSS solutionGNSS/INS loose couplingIMU mechanizationEvaluation plots但是如果要进一步把“紧耦合”做成可以正式对外宣传的高精度功能还需要继续做这些工作把 PPP/RTK 载波相位量测引入紧耦合。在紧耦合滤波器中加入模糊度状态。做整数模糊度固定和部分模糊度选择。做更系统的钟差、系统间偏差和码偏差建模。对真实数据下的异常卫星和粗差进行更强的鲁棒隔离。9. 如何复现实验克隆仓库git clone https://github.com/yanghengqi/CompassFusion.git cd CompassFusion或者使用 Giteegit clone https://gitee.com/henryyang1314/compass-fusion.git cd compass-fusion安装依赖D:\annaconda\envs\BraVL\python.exe-m pip install-e.运行示例$env:PYTHONPATH $PWD\srcD:\annaconda\envs\BraVL\python.exesrc\run_compass_fusion.py--config configs\compass_fusion_great_msf_example.xml运行 PPP 示例scripts\run_ppp_great_msf_example.ps1运行测试D:\annaconda\envs\BraVL\python.exe-m pytest tests10. 当前版本的定位我更倾向于把当前版本称为CompassFusion v0.1 engineering release candidate它不是一个“所有模型都已经完全完成”的最终版而是一个把 GNSS、INS、松耦合、紧耦合入口、真实数据和测试脚本组织到一起的工程基线版本。这个版本的价值在于能跑。数据链路清楚。配置入口清楚。测试结果可复现。后续可以继续在同一个框架下补 PPP/RTK 紧耦合、模糊度固定和更完整的真实数据测试。11. 后续计划后续我计划继续推进完善真实 SPP 紧耦合稳定性。实现 PPP/RTK 载波相位紧耦合。加入紧耦合模糊度状态与整数固定。完善多系统偏差模型。增加 GNSS 中断场景下的 INS 约束测试。补充更多公开数据集的自动化测试。增加更完整的结果图自动生成脚本。12. 小结CompassFusion 目前已经从一个分散的实验工程整理成了一个可以独立发布、可以复现实验、也可以继续迭代的 GNSS/INS 软件包。如果只看当前最稳的链路松耦合已经具备演示和继续开发的基础如果看未来方向真正值得投入的是 PPP/RTK 紧耦合、模糊度固定和真实复杂环境下的鲁棒性。这也是后续版本最核心的技术路线。