当前位置: 首页 > 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详解:`qzslex.c`、`rcvraw.c`与`solution.c`
  • RTKLIB src目录文件解析(续)
    • 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`
      • 四、关键算法数学原理与推导
        • 卡尔曼滤波观测方程


RTKLIB src目录文件解析(续)

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.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)=(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.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)。

主要特色:

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

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

程序执行流程如下:

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

函数调用关系如下:

main
sol_init
sol_load_obs
sol_update
sol_output

三、主要函数说明

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 为观测噪声协方差矩阵。


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


相关文章:

  • matlab多智能体网络一致性研究
  • Linux(1)编译链接和gcc
  • 动态域名服务ddns怎么设置?如何使用路由器动态域名解析让外网访问内网?
  • Vitrualbox完美显示系统界面(只需三步)
  • 【源码+文档+调试讲解】党员之家服务系统小程序1
  • 数据治理域——日志数据采集设计
  • k8s之k8s集群部署
  • 【漫话机器学习系列】257.填补缺失值(Imputing Missing Values)
  • 【LeetCode 热题 100】二叉树的最大深度 / 翻转二叉树 / 二叉树的直径 / 验证二叉搜索树
  • 机器学习——聚类算法练习题
  • 我们该如何使用DeepSeek帮我们减负?
  • flowable
  • 芦康沙妥珠单抗说明书摘要
  • MUSE Pi Pro 编译kernel内核及创建自动化脚本进行环境配置
  • Azure 应用的托管身份与服务主体
  • STM32 启动文件分析
  • Linux架构篇、第五章git2.49.0部署与使用
  • Unity3d 打包安卓平台(Android apk)报错Gradle build failed解决方法
  • 2. 盒模型/布局模块 - 响应式产品展示页_案例:电商产品网格布局
  • JavaScript编译原理
  • 朝着解决问题的正确方向迈进——中美经贸高层会谈牵动世界目光
  • 最美西游、三星堆遗址等入选“2025十大年度IP”
  • 重庆三峡学院回应“85万元中标设备,网购价不到300元”:已着手解决
  • 同济大学原常务副校长、著名隧道及地下工程专家李永盛逝世
  • 人民日报读者点题·共同关注:今天我们为什么还需要图书馆?
  • 云南多地突查公职人员违规饮酒:公安局门口开展酒精吹气测试