[学习] RTKLib详解:qzslex.c、rcvraw.c与solution.c
RTKLib详解:qzslex.c
、rcvraw.c
与solution.c
本文是 RTKLlib详解 系列文章的一篇,目前该系列文章还在持续总结写作中,以发表的如下,有兴趣的可以翻阅。
[学习] RTKlib详解:功能、工具与源码结构解析
[学习]RTKLib详解:pntpos.c与postpos.c
[学习]RTKLib详解:rtkcmn.c与rtkpos.c
[学习]RTKLib详解:ppp.c与ppp_ar.c
[学习]RTKLib详解:ephemeris.c与rinex.c
[学习]RTKLib详解:sbas.c与rtcm.c
[学习]RTKLib详解:rtksvr.c与streamsvr.c
[学习]RTKLib详解:convkml.c、convrnx.c与geoid.c
[学习]RTKLib详解:datum.c、download.c与lambda.c
[学习]RTKLib详解:ionex.c、options.c与preceph.c
[学习] RTKLib详解:qzslex.c、rcvraw.c与solution.c
[学习] RTKLib详解:rtcm2.c、rtcm3.c、rtcm3e与rtcmn.c
文章目录
- RTKLib详解:`qzslex.c`、`rcvraw.c`与`solution.c`
- Part A: qzslex.c 文件解析
- 一、文件整体说明
- 二、执行流程与函数调用关系
- 三、主要函数说明
- 3.1 `lex_init`
- 3.2 `lex_read_frame`
- 3.3 `lex_check_crc`
- 3.4 `lex_decode_frame`
- 四、关键算法数学原理与推导
- LEX 信号电文结构
- Part B: rcvraw.c 文件解析
- 一、文件整体说明
- 二、执行流程与函数调用关系
- 三、主要函数说明
- 3.1 `raw_init`
- 3.2 `raw_read`
- 3.3 `raw_parse`
- 3.4 `raw_output`
- 四、关键算法数学原理与推导
- 观测值时间戳同步
- Part C: solution.c 文件解析
- 一、文件整体说明
- 二、执行流程与函数调用关系
- 三、主要函数说明
- 3.1 `sol_init`
- 3.2 `sol_load_obs`
- 3.3 `sol_update`
- 3.4 `sol_output`
- 四、关键算法数学原理与推导
- 卡尔曼滤波观测方程
Part A: qzslex.c 文件解析
一、文件整体说明
qzslex.c
是 RTKLIB 中用于解析 QZSS(Quasi-Zenith Satellite System)LEX(L-band EXperimental)信号的模块。该文件实现了从原始信号数据中提取导航电文、星历信息和时钟校正参数的功能,支持日本准天顶卫星系统(QZSS)的高精度定位。
主要功能:
- 解析 QZSS LEX 信号电文。
- 提取星历参数、时钟偏差和电离层校正信息。
- 支持 LEX 数据 CRC 校验与帧同步。
主要特色:
- 支持 QZSS 多频段信号(L1/L2/L5/LEX)。
- 高效的位操作与电文解码算法。
- 可扩展至未来新型 GNSS 信号。
二、执行流程与函数调用关系
程序执行流程如下:
- 初始化 LEX 信号解析器。
- 逐帧读取原始信号数据。
- 执行 CRC 校验与帧同步。
- 解码电文内容并提取参数。
函数调用关系如下:
三、主要函数说明
3.1 lex_init
int lex_init(lex_t *lex)
功能:
初始化 LEX 信号解析器,设置默认参数。
输入参数:
lex
: LEX 数据结构体指针。
返回值:
- 成功返回 1,失败返回 0。
3.2 lex_read_frame
int lex_read_frame(FILE *fp, unsigned char *buff, int *len)
功能:
从文件或流中读取 LEX 信号帧数据。
输入参数:
fp
: 文件指针。buff
: 缓冲区。len
: 输出读取长度。
返回值:
- 成功返回字节数,失败返回负值。
3.3 lex_check_crc
int lex_check_crc(const unsigned char *buff, int len)
功能:
验证 LEX 帧的 CRC 校验码。
输入参数:
buff
: 数据缓冲区。len
: 数据长度。
返回值:
- 校验成功返回 1,失败返回 0。
3.4 lex_decode_frame
int lex_decode_frame(const unsigned char *buff, lex_data_t *data)
功能:
解码 LEX 帧电文,提取星历、时钟等参数。
输入参数:
buff
: 解析后的帧数据。data
: 输出参数存储结构体。
返回值:
- 成功返回 1,失败返回 0。
四、关键算法数学原理与推导
LEX 信号电文结构
LEX 信号采用前向纠错编码(FEC)和交织技术,电文结构包含:
- 帧头(8 bit): 标识帧起始。
- 数据域(N bit): 星历参数、时钟校正等。
- CRC 校验(24 bit): 使用多项式 x 24 + x 23 + x 18 + x 17 + x 14 + x 11 + x 10 + x 6 + x 5 + x 4 + x 3 + x + 1 x^{24} + x^{23} + x^{18} + x^{17} + x^{14} + x^{11} + x^{10} + x^6 + x^5 + x^4 + x^3 + x + 1 x24+x23+x18+x17+x14+x11+x10+x6+x5+x4+x3+x+1。
CRC 校验公式为:
CRC ( D ) = ( D ⋅ x 24 ) m o d G ( x ) \text{CRC}(D) = \left(D \cdot x^{24}\right) \mod G(x) CRC(D)=(D⋅x24)modG(x)
其中 G ( x ) G(x) G(x) 为上述多项式。
Part B: rcvraw.c 文件解析
一、文件整体说明
rcvraw.c
是 RTKLIB 中用于解析接收机原始观测数据的核心模块。它支持多种接收机格式(如 UBX、RTCM、BINEX),将原始二进制数据转换为内部观测结构,为后续处理提供基础。
主要功能:
- 解析接收机原始数据流。
- 支持多频段、多系统观测值提取。
- 提供时间戳同步与数据校验。
主要特色:
- 自动探测输入数据格式。
- 支持实时流与文件模式。
- 高效的数据缓存与解析机制。
二、执行流程与函数调用关系
程序执行流程如下:
- 读取原始数据流并识别格式。
- 解析观测值、星历和校正信息。
- 将数据转换为 RTKLIB 内部结构。
- 输出观测数据与状态信息。
函数调用关系如下:
三、主要函数说明
3.1 raw_init
int raw_init(raw_t *raw, int format)
功能:
初始化接收机原始数据解析器,指定数据格式。
输入参数:
raw
: 原始数据结构体。format
: 数据格式(如 FORMAT_UBX)。
返回值:
- 成功返回 1,失败返回 0。
3.2 raw_read
int raw_read(FILE *fp, unsigned char *buff, int nmax)
功能:
从文件或流中读取原始数据。
输入参数:
fp
: 文件指针。buff
: 缓冲区。nmax
: 最大读取长度。
返回值:
- 成功返回字节数,失败返回负值。
3.3 raw_parse
int raw_parse(raw_t *raw, int type, const unsigned char *buff, int len)
功能:
解析原始数据,识别消息类型并填充结构体。
输入参数:
raw
: 解析器结构体。type
: 消息类型(如 MSG_NAV_PVT)。buff
: 数据缓冲区。len
: 数据长度。
返回值:
- 成功返回 1,失败返回 0。
3.4 raw_output
int raw_output(raw_t *raw, FILE *fp)
功能:
将解析后的观测数据写入输出文件或流。
输入参数:
raw
: 解析器结构体。fp
: 输出文件指针。
返回值:
- 成功返回 1,失败返回 0。
四、关键算法数学原理与推导
观测值时间戳同步
接收机时间戳 t r e c v t_{recv} trecv 与 GPS 时间 t G P S t_{GPS} tGPS 的关系为:
t G P S = t r e c v + Δ t u t c t_{GPS} = t_{recv} + \Delta t_{utc} tGPS=trecv+Δtutc
其中 Δ t u t c \Delta t_{utc} Δtutc 是 UTC 与 GPS 时间的闰秒修正值,需通过星历或头文件获取。
Part C: solution.c 文件解析
一、文件整体说明
solution.c
是 RTKLIB 中用于 GNSS 定位解算的核心模块。它实现了从观测数据到最终位置、速度、时间(PVT)的求解过程,支持单点定位(SPP)、差分定位(DGPS)和实时动态定位(RTK)等多种模式。
主要功能:
- 计算卫星位置与钟差。
- 实现观测方程与参数估计。
- 支持多种解算模式(SPP/DGPS/RTK)。
主要特色:
- 支持多频段、多系统联合解算。
- 高精度卡尔曼滤波器实现。
- 可视化解算状态与质量指标。
二、执行流程与函数调用关系
程序执行流程如下:
- 初始化解算器与状态向量。
- 加载观测数据与星历信息。
- 构建观测方程并更新卡尔曼滤波器。
- 输出解算结果与协方差矩阵。
函数调用关系如下:
三、主要函数说明
3.1 sol_init
int sol_init(sol_t *sol, int mode)
功能:
初始化解算器,设置解算模式(SPP/RTK)。
输入参数:
sol
: 解算器结构体。mode
: 解算模式(如 SOL_MODE_RTK)。
返回值:
- 成功返回 1,失败返回 0。
3.2 sol_load_obs
int sol_load_obs(const obs_t *obs, const nav_t *nav, sol_t *sol)
功能:
加载观测数据与导航数据到解算器。
输入参数:
obs
,nav
: 观测与导航数据。sol
: 解算器结构体。
返回值:
- 成功返回 1,失败返回 0。
3.3 sol_update
int sol_update(sol_t *sol)
功能:
执行一次解算迭代,更新状态向量与协方差矩阵。
输入参数:
sol
: 解算器结构体。
返回值:
- 成功返回 1,失败返回 0。
3.4 sol_output
int sol_output(const sol_t *sol, FILE *fp)
功能:
将解算结果(位置、速度、状态)写入文件。
输入参数:
sol
: 解算器结构体。fp
: 输出文件指针。
返回值:
- 成功返回 1,失败返回 0。
四、关键算法数学原理与推导
卡尔曼滤波观测方程
观测方程为:
y = H x + v \mathbf{y} = \mathbf{H} \mathbf{x} + \mathbf{v} y=Hx+v
其中:
- y \mathbf{y} y: 观测向量(伪距、载波相位等)。
- H \mathbf{H} H: 设计矩阵(几何距离对状态变量的偏导数)。
- x \mathbf{x} x: 状态向量(位置、速度、模糊度等)。
- v \mathbf{v} v: 观测噪声。
卡尔曼增益更新公式为:
K = P H T ( H P H T + R ) − 1 \mathbf{K} = \mathbf{P} \mathbf{H}^T \left( \mathbf{H} \mathbf{P} \mathbf{H}^T + \mathbf{R} \right)^{-1} K=PHT(HPHT+R)−1
其中 P \mathbf{P} P 为状态协方差矩阵, R \mathbf{R} R 为观测噪声协方差矩阵。
研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)
相关文章:
[学习] RTKLib详解:qzslex.c、rcvraw.c与solution.c
RTKLib详解:qzslex.c、rcvraw.c与solution.c 本文是 RTKLlib详解 系列文章的一篇,目前该系列文章还在持续总结写作中,以发表的如下,有兴趣的可以翻阅。 [学习] RTKlib详解:功能、工具与源码结构解析 [学习]RTKLib详解…...

jenkins流水线常规配置教程!
Jenkins流水线是在工作中实现CI/CD常用的工具。以下是一些我在工作和学习中总结出来常用的一些流水线配置:变量需要加双引号括起来 "${main}" 一 引用无账号的凭据 使用变量方式引用,这种方式只适合只由密码,没有用户名的凭证。例…...
Java中序列化和反序列化的理解
基本概念 序列化(Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程,而反序列化(Deserialization)则是将这种形式重新转换为对象的过程。 核心作用 持久化存储:将对象状态保存到文件或数据库中 网络传输:在网络间传递对象…...

基于OpenCV的SIFT特征和FLANN匹配器的指纹认证
文章目录 引言一、概述二、代码解析1. 图像显示函数2. 核心认证函数2.1 创建SIFT特征提取器2.2 检测关键点和计算描述符(源图像)2.3 检测关键点和计算描述符(模板图像)2.4 创建FLANN匹配器2.5 使用K近邻匹配 3. 匹配点筛选4. 认证…...
零基础学Java——第十一章:实战项目 - 桌面应用开发(JavaFX入门)
第十一章:实战项目 - 桌面应用开发(JavaFX入门) 欢迎来到我们实战项目的桌面应用开发部分!在前面的章节中,我们可能已经接触了Swing。现在,我们将目光投向JavaFX,一个更现代、功能更丰富的用于…...
Milvus 视角看主流嵌入式模型(Embeddings)
嵌入是一种机器学习概念,用于将数据映射到高维空间,其中语义相似的数据被紧密排列在一起。嵌入模型通常是 BERT 或其他 Transformer 系列的深度神经网络,它能够有效地用一系列数字(称为向量)来表示文本、图像和其他数据…...

leetcode:58. 最后一个单词的长度(python3解法)
难度:简单 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1: 输入:s "Hello World"…...

虹科应用 | 探索PCAN卡与医疗机器人的革命性结合
随着医疗技术的不断进步,医疗机器人在提高手术精度、减少感染风险以及提升患者护理质量方面发挥着越来越重要的作用。医疗机器人的精确操作依赖于稳定且高效的数据通信系统,虹科提供的PCAN四通道mini PCIe转CAN FD卡,正是为了满足这一需求而设…...

entity线段材质设置
在cesium中,我们可以改变其entity线段材质,这里以直线为例. 首先我们先创建一条直线 const redLine viewer.entities.add({polyline: {positions: Cesium.Cartesian3.fromDegreesArray([-75,35,-125,35,]),width: 5,material:material, 保存后可看到在地图上创建了一条线段…...

[STM32] 5-1 时钟树(上)
文章目录 前言5-1 时钟树(上)时钟树的基本介绍时钟树的基本结构大树和小树频率运算简介计数器和分频STM32内部结构树的结构于关键节点SYSCLK(System Clock) 系统时钟 72M maxHCLK(AHB Clock) AHB时钟 36M maxPLCK(APB1 Clock) APB1时钟 36M maxPLCK2(APB…...

【Linux网络与网络编程】12.NAT技术内网穿透代理服务
1. NAT技术 之前我们说到过 IPv4 协议中IP 地址数量不充足的问题可以使用 NAT 技术来解决。还提到过本地主机向公网中的一个服务器发起了一个网络请求,服务器是怎么将应答返回到该本地主机呢?(如何进行内网转发?) 这就…...
【HTTPS基础概念与原理】TLS握手过程详解
以下是 TLS握手过程的详细拆解,涵盖客户端与服务器之间的关键交互步骤,包括ClientHello、ServerHello、证书验证、密钥交换等核心阶段,并对比TLS 1.2与TLS 1.3的差异: 一、TLS握手的核心目标 协商协议版本:确定双方支…...

从辅助到协作:GitHub Copilot的进化之路
如果说现代程序员的标配工具除了VS Code、Stack Overflow之外,还有谁能入选,那一定是GitHub Copilot。从2021年首次亮相,到如今深度集成进开发者日常流程,这个“AI编程助手”已经不只是写几行自动补全代码的小帮手了,而…...

Linux运行时的参数、命令、网络、磁盘参数和日志监控
一、监控 1. free 功能:用于查看系统内存使用情况,包括物理内存总量、已用内存、空闲内存、缓冲区(buffer)和缓存(cache)占用,以及交换内存(swap)的使用与剩余情况。常…...

鸿蒙页面布局入门
本文以仿猫眼电影M站首页布局为案例,展示ArkUI在实际开发中的应用。内容包括案例效果及相关知识点,深入解析布局框架以及头部、脚部、内容区域的构建思路与代码实现,最后提供完整代码和教程资源,助力你强化实践能力。 1. 案例效果…...
VTK|类似CloudCompare的比例尺实现2-vtk实现
文章目录 实现类头文件实现类源文件调用逻辑关键问题缩放限制问题投影模式项目git链接实现类头文件 以下是对你提供的 ScaleBarController.h 头文件添加详细注释后的版本,帮助你更清晰地理解每个成员和方法的用途,尤其是在 VTK 中的作用: #ifndef SCALEBARCONTROLLER_H #de…...

阿里巴巴开源移动端多模态LLM工具——MNN
MNN 是一个高效且轻量级的深度学习框架。它支持深度学习模型的推理和训练,并在设备端的推理和训练方面具有行业领先的性能。目前,MNN 已集成到阿里巴巴集团的 30 多个应用中,如淘宝、天猫、优酷、钉钉、闲鱼等,覆盖了直播、短视频…...

【漫话机器学习系列】256.用 k-NN 填补缺失值
用 k-NN 填补缺失值:原理、实现与应用 在实际的数据科学项目中,我们经常会遇到数据缺失(Missing Values)的问题。缺失值如果处理不当,不仅会影响模型训练,还可能导致最终结果偏差。 今天,我们…...
React组件(一):生命周期
文章目录 组件的生命周期生命周期的阶段1、组件创建阶段2、组件运行阶段3、组件销毁阶段 组件生命周期的执行顺序 组件的生命周期 在组件创建、到加载到页面上运行、以及组件被销毁的过程中,总是伴随着各种各样的事件,这些在组件特定时期,触…...

金格iWebOffice控件在新版谷歌Chrome中不能加载了怎么办?
金格iWebOffice控件是由江西金格网络科技有限责任公司开发的中间件软件,主要用于在浏览器中直接编辑Word、Excel、PowerPoint等Office文档,曾经是一款优秀国产的WebOffice插件。 由于2022年Chrome等浏览器取消支持PPAPI接口,导致这款金格iWe…...

实验6分类汇总
设计性实验 (1)查询每门课程的平均分,包括课程号和平均分。 SELECT Cno AS 课程号, AVG(Degree) AS 平均分 FROM Score065 GROUP BY Cno;(2)查询每门课程的平均分,包括课程号、课程名和平均分。 SELECT c.Cno AS 课程号, c.Cname AS 课程名, AVG(sc.Degree) AS 平均分 FROM …...

如何通过交流沟通实现闭环思考模式不断实现自身强效赋能-250517
感谢一直以来和我交流沟通的朋友们。 闭环思考 文字部分(25-05-04)这一天是青年节,在这一天与青年朋友交流这个是事先规划好的: “可以猜一猜,博士会被撤销吗?导师会被处理吗?千万不要回复,放心里,过段时间看结果,看看自己预估社会能力如何。 观察社会新闻,可以用…...

Python 3.11详细安装步骤(包含安装包)Python 3.11详细图文安装教程
文章目录 前言Python 3.11介绍Python 3.11安装包下载Python 3.11安装步骤 前言 作为当前最热门的编程语言之一,Python 3.11 不仅拥有简洁优雅的语法,还在性能上实现了飞跃,代码运行速度提升显著。无论是初入编程的小白,还是经验丰…...
[深度解析] 服务器内存(RAM)演进之路(2025):DDR5 vs HBM vs CXL 内存技术与选型指南
更多服务器知识,尽在hostol.com 嘿,各位服务器“发烧友”和技术决策者们!咱们在聊服务器配置的时候,CPU(大脑)、硬盘(仓库)、带宽(道路)这些“大件儿”总是备…...
C语言输入函数对比解析
目录 C语言输入函数全家福(和它们的秘密)fgetsgetsscanfgetcharfscanf函数对比表灵魂总结 哈哈,看来你正在和C语言的输入函数们玩“大家来找茬”!放心,我会用最接地气的方式给你讲明白,保证比看《甄嬛传》还…...
【Java-EE进阶】SpringBoot针对某个IP限流问题
目录 简介 1. 使用Guava的RateLimiter实现限流 添加Guava依赖 实现RateLimiter限流逻辑 限流管理类 控制器中应用限流逻辑 2. 使用计数器实现限流 限流管理类 控制器中应用限流逻辑 简介 针对某个IP进行限流以防止恶意点击是一种常见的反爬虫和防止DoS的措施。限流策…...

一个指令,让任意 AI 快速生成思维导图
大家好,我是安仔,一个每天都在压榨 AI 的躺平打工人。 今天分享一个 AI 办公小技巧,让你用一个指令让 AI 生成思维导图。 DeepSeek、Kimi、豆包都可以哈 ~ KimiXMind 安仔经常用 XMind 来绘制思维导图,但是 AI 是没…...
随言随语(十二):盖章
给自己的机器学习生涯做个总结盖个章,讲述下如何跟机器学习擦肩而过的,鉴于当前深度学习和大模型已经走出来的路及理论知识的入门难度,可能以后跟机器学习前沿科技就再没有交集了; 最近也看了马占凯的《ChatGPT:人类新…...

FPGA图像处理(六)------ 图像腐蚀and图像膨胀
默认迭代次数为1,只进行一次腐蚀、膨胀 一、图像腐蚀 1.相关定义 2.图像腐蚀效果图 3.fpga实现 彩色图像灰度化,灰度图像二值化,图像缓存生成滤波模块(3*3),图像腐蚀算法 timescale 1ns / 1ps // // Des…...
Spring三级缓存的作用与原理详解
在Spring框架中,Bean的创建过程涉及到了三级缓存机制。这个机制主要是为了提高单例模式下bean实例化和依赖注入的效率。本文将深入探讨Spring中的三级缓存,以及其在bean生命周期中的重要作用。 首先,让我们理解什么是三级缓存。Spring中的三…...