当前位置: 首页 > news >正文

[学习] RTKLib详解:qzslex.c、rcvraw.c与solution.c

RTKLib详解:qzslex.crcvraw.csolution.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 信号。

二、执行流程与函数调用关系

程序执行流程如下:

  1. 初始化 LEX 信号解析器。
  2. 逐帧读取原始信号数据。
  3. 执行 CRC 校验与帧同步。
  4. 解码电文内容并提取参数。

函数调用关系如下:

main

lex_init

lex_read_frame

lex_check_crc

lex_decode_frame

lex_output_data


三、主要函数说明

3.1lex_init
intlex_init(lex_t*lex)

功能:
初始化 LEX 信号解析器,设置默认参数。

输入参数:

  • lex: LEX 数据结构体指针。

返回值:

  • 成功返回 1,失败返回 0。

3.2lex_read_frame
intlex_read_frame(FILE*fp,unsignedchar*buff,int*len)

功能:
从文件或流中读取 LEX 信号帧数据。

输入参数:

  • fp: 文件指针。
  • buff: 缓冲区。
  • len: 输出读取长度。

返回值:

  • 成功返回字节数,失败返回负值。

3.3lex_check_crc
intlex_check_crc(constunsignedchar*buff,intlen)

功能:
验证 LEX 帧的 CRC 校验码。

输入参数:

  • buff: 数据缓冲区。
  • len: 数据长度。

返回值:

  • 校验成功返回 1,失败返回 0。

3.4lex_decode_frame
intlex_decode_frame(constunsignedchar*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 + 1x24+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)=(Dx24)modG(x)

其中G ( x ) G(x)G(x)为上述多项式。


Part B: rcvraw.c 文件解析

一、文件整体说明

rcvraw.c是 RTKLIB 中用于解析接收机原始观测数据的核心模块。它支持多种接收机格式(如 UBX、RTCM、BINEX),将原始二进制数据转换为内部观测结构,为后续处理提供基础。

主要功能:

  • 解析接收机原始数据流。
  • 支持多频段、多系统观测值提取。
  • 提供时间戳同步与数据校验。

主要特色:

  • 自动探测输入数据格式。
  • 支持实时流与文件模式。
  • 高效的数据缓存与解析机制。

二、执行流程与函数调用关系

程序执行流程如下:

  1. 读取原始数据流并识别格式。
  2. 解析观测值、星历和校正信息。
  3. 将数据转换为 RTKLIB 内部结构。
  4. 输出观测数据与状态信息。

函数调用关系如下:

main

raw_init

raw_read

raw_parse

raw_output


三、主要函数说明

3.1raw_init
intraw_init(raw_t*raw,intformat)

功能:
初始化接收机原始数据解析器,指定数据格式。

输入参数:

  • raw: 原始数据结构体。
  • format: 数据格式(如 FORMAT_UBX)。

返回值:

  • 成功返回 1,失败返回 0。

3.2raw_read
intraw_read(FILE*fp,unsignedchar*buff,intnmax)

功能:
从文件或流中读取原始数据。

输入参数:

  • fp: 文件指针。
  • buff: 缓冲区。
  • nmax: 最大读取长度。

返回值:

  • 成功返回字节数,失败返回负值。

3.3raw_parse
intraw_parse(raw_t*raw,inttype,constunsignedchar*buff,intlen)

功能:
解析原始数据,识别消息类型并填充结构体。

输入参数:

  • raw: 解析器结构体。
  • type: 消息类型(如 MSG_NAV_PVT)。
  • buff: 数据缓冲区。
  • len: 数据长度。

返回值:

  • 成功返回 1,失败返回 0。

3.4raw_output
intraw_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)。

主要特色:

  • 支持多频段、多系统联合解算。
  • 高精度卡尔曼滤波器实现。
  • 可视化解算状态与质量指标。

二、执行流程与函数调用关系

程序执行流程如下:

  1. 初始化解算器与状态向量。
  2. 加载观测数据与星历信息。
  3. 构建观测方程并更新卡尔曼滤波器。
  4. 输出解算结果与协方差矩阵。

函数调用关系如下:

main

sol_init

sol_load_obs

sol_update

sol_output


三、主要函数说明

3.1sol_init
intsol_init(sol_t*sol,intmode)

功能:
初始化解算器,设置解算模式(SPP/RTK)。

输入参数:

  • sol: 解算器结构体。
  • mode: 解算模式(如 SOL_MODE_RTK)。

返回值:

  • 成功返回 1,失败返回 0。

3.2sol_load_obs
intsol_load_obs(constobs_t*obs,constnav_t*nav,sol_t*sol)

功能:
加载观测数据与导航数据到解算器。

输入参数:

  • obs,nav: 观测与导航数据。
  • sol: 解算器结构体。

返回值:

  • 成功返回 1,失败返回 0。

3.3sol_update
intsol_update(sol_t*sol)

功能:
执行一次解算迭代,更新状态向量与协方差矩阵。

输入参数:

  • sol: 解算器结构体。

返回值:

  • 成功返回 1,失败返回 0。

3.4sol_output
intsol_output(constsol_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为观测噪声协方差矩阵。


研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)


http://www.jsqmd.com/news/485129/

相关文章:

  • 探索v2ex-gae:在Google App Engine上构建V2EX社区的完整指南
  • 如何用Protege Desktop构建第一个OWL本体?5步快速入门教程
  • 如何快速集成 react-medium-editor:打造专业级富文本编辑体验
  • OpenClaw 报错解决大全:30 个高频错误信息速查与修复
  • 从源码到实践:swift-corelibs-xctest架构与实现原理
  • ThreatHunting仪表板完全指南:从Process Create到DNS监控的8大场景实战
  • 一文读懂 RAG 与嵌入模型:大模型如何实现“读文档、答问题”
  • 解决Swift货币处理难题:开源项目Money常见问题解决方案
  • TNNLS-2020《Autoencoder Constrained Clustering With Adaptive Neighbors》
  • 2026年3月超实用的防腐防锈圆顶通风口定制厂家分析,目前圆顶通风口熠森金属市场认可度高 - 品牌推荐师
  • 最新版Node.js下载安装及环境配置教程(非常详细)
  • [学习]RTKLib详解:tle.c(系列终章)
  • java毕业设计下载(全套源码+配套论文)——基于javaEE+SSH+mysql的百货中心供应链管理系统设计与实现
  • 终极指南:解决ESLint Config for JavaScript Standard Style的常见问题
  • 好写作AI:硕士论文文献综述的4个扩写与改写神技巧,导师看完直呼“这学生真会写!”
  • 基于双dq变换的六相永磁同步电机矢量控制仿真、附参考文献
  • java毕业设计下载(全套源码+配套论文)——基于javaEE+SSH+mysql的医院在线挂号系统设计与实现
  • OpenClaw 筛掉了 90%的人,这个工具专门来接这 90%
  • 终极指南:解决 .NET 项目系统 10 大常见问题的完整方案
  • 如何利用Touca实现工程团队的持续回归测试:完整指南
  • 为什么选择OWASP Maryam?5大优势让开源情报收集事半功倍
  • 终极ASP.NET Core 3.1 / React SPA模板项目问题解决指南:10个常见错误快速修复方案
  • 【原创】基于Python的教师-学生签到考勤系统
  • 【独家原创】基于SMA(黏菌)-Transformer多特征分类预测(多输入单输出)附Matlab代码
  • 【独家原创】基于(蜜獾算法)HBA-Transformer多变量时序预测(多输入单输出)附Matlab代码
  • 如何快速部署gh_mirrors/co/code6:5分钟上手代码泄露防护工具
  • MLLM架构深度剖析:连接算法创新与硬件加速的关键枢纽
  • 【原创】基于python的花卉识别系统
  • 【图像隐写】基于DWT+DCT实现图像水印隐藏提取(含PSNR、NCC、IF)附Matlab代码
  • 大厂UI设计师偷偷在用的12个法则,让你的界面从此告别“不好用” - ui设计公司兰亭妙微