预备知识
GNSS
全球导航卫星系统(Global Navigation Satellite System,GNSS)是一系列利用一组轨道卫星提供的信号进行位置确定和时间同步的技术的总称。这些系统允许地球上或近地空间内的任何位置的用户通过接收来自至少四颗卫星的信号来计算自己的精确位置、速度以及精确的时间信息。GNSS 包括了多个独立运行的卫星导航系统,美国的 GPS、俄罗斯的 GLONASS、欧盟的 Galileo,以及中国的 BeiDou等。GNSS 技术广泛应用于多个领域,包括但不限于交通导航、地理测量、精准农业、环境监测、科学研究、公共安全和军事应用等。它不仅极大地提高了定位精度和可靠性,还促进了各种基于位置服务的发展,如地图服务、紧急响应和物流跟踪等。总之,GNSS 已经成为现代社会中不可或缺的一部分,支持着从个人日常活动到复杂商业运作和科学研究在内的众多应用场景。
了解IPNL-POLYU/pyrtklib
pyrtklib:一个用于城市峡谷定位的紧密耦合深度学习和GNSS集成的开源软件包 在城市中,高楼会把卫星信号像乒乓球一样弹来弹去,多路径误差,导致手机收到混乱的信息,算不出真实的位置。 pyrtklib项目旨在利用深度学习技术辅助传统的卫星定位方法,通过算法智能地识别并削弱这些干扰信号的影响,从而在城市峡谷等复杂环境中获得更精准的定位结果。
- RTKLIB[https://www.rtklib.com/]:一个用C语言编写的开源卫星定位数据处理程序库[](https://baike.baidu.com/minilemma/RTK/397408/231277872?category=1)。功能强大,但使用起来对初学者不友好。
- PyRTKLIB:可以看作是 RTKLIB 的 Python 版本或者“翻译器”。利用
pybind11等技术,将RTKLIB的C语言核心功能包装成易于在Python中调用的函数。这样做的好处是,可以在Python环境中,利用RTKLIB的强大引擎来处理定位数据。
| 方面 | 说明 |
|---|---|
| 项目 定位 |
一个为RTKLIB提供Python接口的绑定库,将RTKLIB的C语言功能引入Python环境, 方便进行GNSS数据处理。 |
| 核心 功能 |
单点定位(SPP)、实时动态定位(RTK)、 精密单点定位(PPP)、GNSS数据后处理 |
| 技术 基础 |
基于著名的RTKLIB和pybind11 用于将C++代码暴露给Python |
| 目录 结构 |
主要包含Python模块代码、RTKLIB的C语言源码、示例脚本、测试用例和文档。 |
IPNL-POLYU/pyrtklib 是一个桥梁,能在Python环境中,调用用C语言编写的RTKLIB库的功能。 |
在项目中,将传统上基于 C 或 Fortran 开发的 GNSS 算法与现代基于 Python 的深度学习框架无缝集成,从而增强定位精度,并简化开发流程。pyrtklib 包含了一个新颖的深度学习框架,该框架利用 GNSS 数据来预测每个卫星测量的权重和偏差。这种机制能够有效地区分视距和非视距卫星信号,并据此调整权重分配以提高定位精度。
论文(理论部分)
摘要
- 《载波相位引入在pyRTKLIB中的实现研究》
- 提高pyrtklib工具包的定位精度,以前主要用“伪距”来定位,精度不够。现在要把载波相位加到这个工具包里。
- 在
pyRTKLIB工具包里,实现载波相位技术,让定位更准。
引言
- GNSS:GPS、北斗都是GNSS的一种,需要至少4颗卫星才能算出位置(x, y, z坐标和时间)
- pyrtklib:一个开源的python工具包,用来处理卫星定位数据。用python写可以和深度学习结合。ai帮忙区分好信号和坏信号,给好信号更高的信任度,算出来的定位更准
项目背景
目标:用数学模型解出位置
伪距:测算卫星距离通过人与卫星的时间差 x 光速 伪距的来源:表与卫星表不可能完全同步(钟差 ) 信号穿过电离层 和 对流层 也会变慢 所以这个距离精度不高,米级。 :测量的伪距 p = 真实距离 r + 误差(钟差、大气层...)
难点:非线性问题
同时看到了 颗卫星,得到 个伪距测量值 每一个 都和位置 有关。有 个方程,解 个未知数。 由于公式(2)开根号的存在,导致这个方程组是非线性的
解决:“泰勒近似” + “迭代”
- 利用泰勒展开 (雅可比矩阵) :直线的斜率,通过求偏导得到
加权最小二乘法 (WLS):
- 先猜一个初始位置 ,比如地球中心。
- 用 算出理论上应该测到多远的距离 。
- 用实际测到的伪距 减去理论距离 ,得到残差
- 把 残差 和 斜率 代入公式(6),解出修正量 。
- 用公式(7)更新位置:新位置 = 老位置 + 修正量。
- 重复 1-5 步,直到修正量 变得非常非常小 ,就认为 是精确答案。
关键: (权重矩阵) 和 (偏差)
(权重矩阵) 在计算时,给好信号更高的权重(信任度),给坏信号更低的权重 一个好的 对定位精度至关重要!
(未建模的偏差) 公式 (9) b主要是 NLOS(非视距) 和 多路径效应 NLOS (Non-Line-of-Sight): 信号被大楼挡住了,收到的是绕过来的信号 多路径 (Multipath): 同时收到了直射信号和被大楼反射的信号,两个混在一起 这些 偏差会让定位结果歪得很离谱
不知道怎么设置最好的 和 ,让 AI预测出一个最完美的 和最干净的 用深度学习来预测 (权重)和 (偏差),然后喂给公式(6)经典的WLS算法,来获得更准的定位。
试验方法
载波相位 (Carrier Phase)
- 伪距通过听卫星信号的时间码,精度为米
- 载波相位通过数信号的波形,GPS L1载波的波长只有19厘米,精度可达毫米级
整周模糊度 测到不足一个波的部分时,之前还有多少个完整的波未知 解出整周模糊度N是高精度定位的关键
载波相位的观测方程: 测量的总相位 波长 = 真实距离 + 整周模糊度 波长
完整版: 引入了各种误差:包括:接收机钟差、卫星钟差、对流层延迟、电离层延迟
单差: 伪距观测及载波相位观测在流动站与基准站之间求一次差,可以消除卫星钟差,在短基线情况下(基站流动站之间的距离不超过 10km),可以消去电离层和对流层延迟误差
双差: 单差观测在同系统卫星 p 与卫星 q 之间作二次差,可消去接收机钟差,得到双差观测方程 结果:伪距双差:,只剩距离了 载波双差:,只剩距离和双差模糊度N
三差: 把这一秒的双差数据 和上一秒的双差数据再减一次,消去N 虽然不用解N了,但是噪声被放大了,精度不如双差
观测模型
伪距单点定位 (SPP)最小二乘观测模型,老办法
只用伪距与WLS的思想,通过泰勒展开把复杂的开根号公式变成简单的线性方程 要解的未知数 有4个,位置修正量 和 钟差
最后用最小二乘法迭代求解,得到米级精度
载波相位相对定位 (RTK)
使用双差观测值,包括伪距和载波 用和SPP一样的泰勒展开技巧来处理距离
未知数 不一样了,包括**位置修正量 **3个 + 所有的双差模糊度 看了N颗卫星,就有N-1个双差模糊度
把伪距双差、载波双差等所有方程都写成 的标准矩阵形式 Z测量值,H斜率矩阵,要求求解的未知数X 然后用卡尔曼滤波器,随着时间不断更新,得到X的最优估计值,解出位置 和模糊度
可补充:RTK的最后一步是固定解,可用算法将这些浮点数猜回最接近的整数。一旦固定成功,就能实现厘米级定位。
结果
- 偏差模型训练结果
脚本成功启动,并使用了模拟数据来训练
Train Loss训练误差和Val Loss验证误差都在迅速下降,说明模型在学习reducing learning rate...:在第19、34、40等轮次,学习率在自动降低。脚本中的学习率调度器在正常工作,模型学习变慢时自动调整参数Early stopping triggered.:早停机制,防止模型过拟合并节省时间。
仅仅几轮之后,两条线的误差都迅速下降到了一个非常低的水平
模型训练的非常快,效果很好
- 偏差模型预测结果
脚本成功处理了数据集中的 405 个数据点,只花了 18 秒,没有中途崩溃。
errors shape: (403, 3):计算了 403 个点的定位误差,每个点都有 3 个坐标(X, Y, Z)
errors example: [[ ... ]]:显示了前 5 个点的具体 (X, Y, Z) 误差值
2D mean: 17.71:模型预测位置的平面平均误差为 17.71 米
3D mean: 48.76:模型预测位置的三维空间平均误差为 48.76 米