UBSerials: GNSS单点定位与多普勒测速原理的C++代码化和QT窗口软件化

UBSerials: GNSS单点定位与多普勒测速原理的C++代码化和QT窗口软件化

项目背景

GNSS单点定位与多普勒测速一直以来都是本科导航工程专业卫星导航原理课程的实践任务之一。UBSerials在课程学习的基础上,参考GPS/BDS接口控制文档(ICD),结合QT(C++;QTVersion:5.12)开源框架并运用IGS、中国卫星导航系统管理办公室测试评估研究中心等机构发布的公开数据文件或诺瓦泰、和芯星通等GNSS接收机厂商产品协议将单点定位与多普勒测速算法窗口化。项目目前支持RINEXv3.03版本的观测值文件(.o)和卫星星历文件,兼容RINEX2.x版本的GPS星历(IGS或其他公开数据源常见的文件格式),支持诺瓦泰OEM7系列板卡协议和 和芯星通高精度系列(UB)板卡协议的二进制文件。UBSerials项目面向导航工程本科学生,以辅助快速学习和构建可用的单点定位测速程序为核心目的。
UBSerials四大界面展示

图1 UBSerials软件主界面/中间值解算界面/帮助文档界面/文件解算结果界面展示

实时流产品

图2 UBSerials接收机二进制消息/文件解算相关内容依据的产品和产品协议

开源说明

UBSerials项目前后端代码全部开源。用户可通过如下链接获取UBSerials的全部源代码:
https://github.com/alxanderjiang
https://pan.baidu.com/s/1KljX438WgyVZPR51y9goyA?pwd=0000
UBSerials项目遵守QT开源协议,其地图前端遵守百度/高德地图开放平台Javascript API个人开发协议。请复现和改进UBSerials的用户也遵守上述平台的协议。除源代码外,UBSerials项目还提供:UBSerials项目工程文件(QT+VS),算法源代码手册、UBSerials软件安装文件、UBSerials使用帮助文档、单系统支持(GPS)的控制台程序、文件解算的控制台程序、实时流解算的控制台程序。以上内容或内容的获取方式均可从上述两个链接中获得。UBSerials项目仅作学习交流使用,没有、也不会有任何商业用途。
UBserials提供安装文件UBSerials_v1.0.msi(百度网盘链接内或github主页UBSerials项目Release中),这将显著减少下载所需的存储空间。双击该文件,选择安装路径即可安装完整版本的UBSerials。需要特别说明的是,在百度网盘链接中还有免安装版本的UBSerials,其更新并不一定与安装文件同步。推荐通过安装文件安装UBSerials、通过Github获取源代码的最新更新。

基本功能

UBSerials目前迭代至第一个公开发行版本,版本号:v1.0。目前具有如下8项基本功能:
①基于RINEX观测文件(.o)和星历文件(.n)的单点定位和多普勒测速。
②基于OEM7系列板卡协议二进制文件的单点定位和多普勒测速。
③基于和芯星通高精度产品(UB)系列板卡协议二进制文件的额单点定位和多普勒测速。
④基于UB系列板卡UB482直连的实时流单点定位和多普勒测速。
⑤与UB482板卡进行串口实时数据交互。
⑥卫星天顶图,接收机授时结果实时展示(连接UB482基础上)。
⑦接收机实时流解算结果地图标记(中国境内),输入WGS84坐标进行单点标记(中国境内)。
单点定位过程中关键中间变量的解算:时间转换,坐标转换,卫星位置计算,对流层延迟解算,电离层延迟解算。
下面是UBSerials的核心功能演示效果。
UBSerials功能演示1

图2 文件解算与轨迹重现

中间值解算

图3 时间转换/坐标转换/对流层延迟/电离层延迟计算结果演示

在这里插入图片描述

图4 直连UB482实时流解算演示

常见问题

一、开源内容中各项目的命名和作用是什么?
······UBSerials—工程文件,UBSerials项目的完整工程文件(不包括帮助文档、地图前端代码和示例文件)。该项目文件夹可以帮助用户在自己的PC上快速复现UBSerials
······UBSerials_Source_Folder,UBSerials项目的前端代码和示例文件,下载UBSerials工程文件后,还需将本文件夹放入Realese/X64(软件运行根目录)中,才能使用项目的完整功能。该文件夹缺失影响基本功能中的地图展示有关内容和帮助文档的显示
······UBSerials_File_console—工程文件,UBSerials项目基本功能中①、②、③的控制台实现。用户通过该文件夹可以在不配置任何非C++环境或插件的基础上复现UBSerials项目有关文件解算的内容。这也是通常情况下导航工程专业卫星导航原理和算法相关课程需要提交的课程任务。
······UBSerials_realtime_console—工程文件,UBSerials项目基本功能中④,⑤,⑥,⑦的控制台实现。用户通过该文件夹可以在不配置任何非C++环境或插件的基础上复现UBSeials项目有关接收机实时流解算的内容。这同样是通常情况下导航工程专业卫星导航原理和算法相关课程需要提交的课程任务。
·····UBSerials源代码手册—PDF笔记/手册文件,UBSerials项目的全部源码和具体函数功能解释。用户通过该手册可以了解到UBSerials项目全部源代码细化到函数级别的参数、功能解释。
二、软件为什么卡死?
······UBSerials项目创建以理解定位算法原理为主要目的,未对程序结构进行严格的设计和封装,当输入文件格式与项目支持的格式不一或数据异常时,UBSerials不能首先识别其数据的适配性,因此出现卡死情况。当遇到卡死时,请使用Windows任务管理器(快捷键:Ctrl+Alt+Del)强制关闭UBSerials。
三、软件支持哪些卫星导航系统的哪些信号?
······在文件解算的功能中,UBSerials仅支持GPS:L1信号C/A码,BDS:B1信号I支路(B1I)。请确保您的RINEX文件中至少包含这两种信号中的任意一种(RINEX文件头 "SYS / # / OBS TYPES"字段包括:“C1C L1C D1C S1C"或"C2I L2I D2I S2I”)。具体如图5。
RINEX头示例
图5 UBSerials支持的信号类型

四、为什么界面上的地图不显示?
······UBSerials项目地图通过个人开发者账号调用百度/高德地图Javascript API。地图显示相关功能需要联网,不支持离线操作。此外需要注意的是,如果您需要对地图显示的网页文件进行更改,请自行申请百度/高德地图开发者账号并获取密钥(申请教程详见百度/高德开放平台:https://lbsyun.baidu.com/index.php?title=jspopularGL/guide/getkey/https://lbs.amap.com/api/javascript-api-v2/prerequisites)。因为个人开发者调用API次数和并行量有限,为保证地图相关功能正常运行,UBSerials建议用户自行申请地图key并将密钥替换到软件根目录/mapsource/Baidumap.html或Gaodemap.html文件中。
五、软件内帮助文档打开后加载太慢?
······UBSerials项目帮助文档由html编写,展示在QTwebengineview控件中。因为缺乏多线程和优化设计,会出现卡顿问题。可通过在浏览器中打开/helperresource/main_helper.html的方式替代软件内打开以获取更流畅的帮助文档查看体验。
六、更多问题。
······UBSerials软件内提供帮助文档,如果您有任何使用问题可作参考。受限于项目作者的知识水平和时间精力,软件算法、前后端通信方式仍存在不足甚至错误,用户可通过作者CSDN的主页邮箱或UBSerials软件内部帮助文档中的联系方式联系作者,UBSerials项目对您的宝贵意见和勘误不胜感激!

有关地图API的额外说明

如果您希望使用的地图不是百度/高德地图(如Google Map、Petal Map等),UBSerials也提供前后端通信的通用函数,如下表。事实上,项目中百度、高德地图的切换显示就是执行了同一套C++函数,因此只需要在您使用的地图html文件中编辑同样命名的js函数即可。

函数名功能
repoint(pos)地图重置到点pos
point(pos)地图跳转到点pos并作蓝色标记
makerpoint(pos)地图跳转到点pos并作红色标记
clearmap()清楚地图上的所有标记点(覆盖物)

UBSerials原始地图显示的坐标经过至少一次坐标转换(WGS84-GCJ02)如果您希望在国外使用地图标记功能,请自行更改坐标转换函数

  • 29
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: GNSS(全球导航卫星系统)单点定位算法是一种利用卫星信号进行定位的方法,主要通过接收多颗卫星的信号进行测量和计算来确定用户的位置。下面是一个示例的GNSS单点定位算法的代码: ```python import numpy as np def gnss_single_point_positioning(satellite_data, receiver_data): # 卫星数据:卫星的位置和伪距 satellite_positions = satellite_data['positions'] pseudo_ranges = satellite_data['pseudo_ranges'] # 接收机数据:接收机的位置 receiver_position = receiver_data['position'] # 预设接收机位置 estimated_position = np.array([0, 0, 0]) # 对每个可见卫星进行迭代 for i in range(len(satellite_positions)): # 计算接收机到卫星的几何距离 geometric_distance = np.linalg.norm(receiver_position - satellite_positions[i]) # 通过几何距离和卫星传输的伪距计算估计的接收机位置 estimated_position += (receiver_position - satellite_positions[i]) * (pseudo_ranges[i] - geometric_distance) / geometric_distance return estimated_position # 示例数据 satellite_data = { 'positions': np.array([[1000, 2000, 3000], [4000, 5000, 6000], [7000, 8000, 9000]]), 'pseudo_ranges': np.array([900, 1200, 1500]) } receiver_data = {'position': np.array([10000, 20000, 30000])} # 调用单点定位算法 estimated_position = gnss_single_point_positioning(satellite_data, receiver_data) print("Estimated Receiver Position:", estimated_position) ``` 以上是一个简单的GNSS单点定位算法的代码示例,其中通过迭代计算,使用卫星信号的位置和伪距来估计接收机的位置。这只是一个简单的示例,实际中还需要考虑更多的误差源如钟差、大气延迟等,以及更复杂的算法和数据处理。 ### 回答2: GNSS单点定位算法代码是用于实现全球导航卫星系统(GNSS)接收机的定位功能。该算法代码通过接收多颗卫星发射的信号,利用接收机内部的时钟和测量值,计算出接收机在地球上的位置。 代码实现的基本步骤如下: 1. 初始接收机参数,包括接收机的位置、时钟误差、卫星的轨道信息等。 2. 接收卫星信号,测量接收机与卫星之间的距离。这可以通过计算信号传播时间或者测量信号的相位差来实现。 3. 根据接收到的卫星信号,计算接收机与每颗卫星之间的几何距离。这个距离是接收机与卫星之间的直线距离,考虑了信号在大气中传播的延迟效应。 4. 利用接收到的多颗卫星信号,计算接收机的位置。有多种方法可以实现这一步骤,其中一个常用的方法是通过解算位置的方程组,其中方程组的未知数是接收机的位置。 5. 修正接收机的时钟误差。由于接收机内部的时钟可能存在误差,需要对接收到的卫星信号进行时间校准。 6. 输出定位结果。将计算得到的接收机位置信息输出,以提供给应用程序或者用户使用。 通过以上步骤,GNSS单点定位算法代码可以实现对接收机位置的定位。这样,用户就可以根据卫星信号进行定位,从而得到精确的位置信息。该代码的应用范围广泛,包括车辆导航、精确定位等领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值