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

[学习] RTKLib详解:rtcm2.c、rtcm3.c、rtcm3e与rtcmn.c

RTKLib详解:rtcm2.crtcm3.crtcm3ertcmn.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详解:`rtcm2.c`、`rtcm3.c`、`rtcm3e`与`rtcmn.c`
    • Part A: rtcm2.c 文件解析
      • 一、文件整体说明
      • 二、执行流程与函数调用关系
      • 三、主要函数说明
        • 3.1 `rtcm2_init`
        • 3.2 `rtcm2_read_frame`
        • 3.3 `rtcm2_decode_header`
        • 3.4 `rtcm2_decode_msg`
        • 3.5 `rtcm2_apply_corr`
      • 四、关键算法数学原理与推导
        • RTCM2 Type 1 伪距校正公式
    • Part B: rtcm3.c 文件解析
      • 一、文件整体说明
      • 二、执行流程与函数调用关系
      • 三、主要函数说明
        • 3.1 `rtcm3_init`
        • 3.2 `rtcm3_read_frame`
        • 3.3 `rtcm3_decode_header`
        • 3.4 `rtcm3_decode_msm`
        • 3.5 `rtcm3_apply_corr`
      • 四、关键算法数学原理与推导
        • MSM 消息压缩编码
    • Part C: rtcm3e.c 文件解析
      • 一、文件整体说明
      • 二、执行流程与函数调用关系
      • 三、主要函数说明
        • 3.1 `rtcm3e_register`
        • 3.2 `rtcm3e_decode`
        • 3.3 `rtcm3e_handler`
      • 四、关键算法数学原理与推导
    • Part D: rtcmn.c 文件解析
      • 一、文件整体说明
      • 二、执行流程与函数调用关系
      • 三、主要函数说明
        • 3.1 `crc24q`
        • 3.2 `time2gpst`
        • 3.3 `xyz2pos`
      • 四、关键算法数学原理与推导
        • 地理坐标转换公式


Part A: rtcm2.c 文件解析

一、文件整体说明

rtcm2.c 是 RTKLIB 中用于解析 RTCM 2.x 格式差分数据的核心模块。该文件实现了对 RTCM SC-104 Version 2.x 消息的解码,支持 GPS 差分校正数据的提取,包括伪距、载波相位修正和基准站坐标等信息。

主要功能:

  • 解析 RTCM 2.x 消息帧。
  • 支持 Type 1/2/3/9/16 等主流消息类型。
  • 提供校正数据与接收机状态同步。

主要特色:

  • 支持实时流与文件模式。
  • 自动处理消息分段与 CRC 校验。
  • 可扩展至多基准站数据。

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

程序执行流程如下:

  1. 初始化 RTCM2 解析器。
  2. 逐帧读取原始数据并提取消息头。
  3. 解码消息体并校验 CRC。
  4. 提取校正数据并更新状态。

函数调用关系如下:

main
rtcm2_init
rtcm2_read_frame
rtcm2_decode_header
rtcm2_decode_msg
rtcm2_apply_corr

三、主要函数说明

3.1 rtcm2_init
int rtcm2_init(rtcm_t *rtcm)

功能:
初始化 RTCM2 解析器,清空缓冲区和状态变量。

输入参数:

  • rtcm: RTCM 解析器结构体指针。

返回值:

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

3.2 rtcm2_read_frame
int rtcm2_read_frame(FILE *fp, unsigned char *buff, int *len)

功能:
从文件或流中读取 RTCM2 帧数据,识别帧起始标志。

输入参数:

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

返回值:

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

3.3 rtcm2_decode_header
int rtcm2_decode_header(const unsigned char *buff, int *msg_type, int *length)

功能:
解码 RTCM2 帧头部,获取消息类型和长度。

输入参数:

  • buff: 数据缓冲区。
  • msg_type: 输出消息类型。
  • length: 输出消息体长度。

返回值:

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

3.4 rtcm2_decode_msg
int rtcm2_decode_msg(rtcm_t *rtcm, const unsigned char *buff)

功能:
根据消息类型解码具体数据内容(如 Type 1/3 校正数据)。

输入参数:

  • rtcm: 解析器结构体。
  • buff: 消息体数据缓冲区。

返回值:

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

3.5 rtcm2_apply_corr
int rtcm2_apply_corr(rtcm_t *rtcm, obs_t *obs)

功能:
将解码后的校正数据应用到观测值结构体。

输入参数:

  • rtcm: 解析器结构体。
  • obs: 观测值结构体指针。

返回值:

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

四、关键算法数学原理与推导

RTCM2 Type 1 伪距校正公式

伪距修正量 Δ P \Delta P ΔP 由基准站差分残差计算:

Δ P = P r e f − ρ r e f \Delta P = P_{ref} - \rho_{ref} ΔP=Prefρref

其中:

  • P r e f P_{ref} Pref: 基准站伪距观测值。
  • ρ r e f \rho_{ref} ρref: 基准站几何距离(由星历和基准站坐标计算)。

接收机应用修正后伪距为:

P c o r r = P r a w − Δ P P_{corr} = P_{raw} - \Delta P Pcorr=PrawΔP


Part B: rtcm3.c 文件解析

一、文件整体说明

rtcm3.c 是 RTKLIB 中用于解析 RTCM 3.x 格式差分数据的核心模块。该文件支持多系统(GPS/GLONASS/Galileo/BDS)、多频段校正数据的解码,兼容 RTCM SC-104 Version 3.x 标准。

主要功能:

  • 解析 RTCM3 消息帧。
  • 支持 MSM(Multiple Signal Messages)系列多频校正消息。
  • 提供电离层延迟和硬件偏差修正。

主要特色:

  • 支持多 GNSS 系统。
  • 高效的 MSM 消息压缩解码。
  • 支持网络 RTK(NTRIP)协议。

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

程序执行流程如下:

  1. 初始化 RTCM3 解析器。
  2. 读取并同步消息帧头。
  3. 解码消息类型与长度。
  4. 处理 MSM 格式校正数据。

函数调用关系如下:

main
rtcm3_init
rtcm3_read_frame
rtcm3_decode_header
rtcm3_decode_msm
rtcm3_apply_corr

三、主要函数说明

3.1 rtcm3_init
int rtcm3_init(rtcm_t *rtcm)

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

输入参数:

  • rtcm: 解析器结构体。

返回值:

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

3.2 rtcm3_read_frame
int rtcm3_read_frame(FILE *fp, unsigned char *buff, int *len)

功能:
从流中读取 RTCM3 帧数据并同步帧头。

输入参数:

  • fp, buff, len: 同上。

返回值:

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

3.3 rtcm3_decode_header
int rtcm3_decode_header(const unsigned char *buff, int *msg_type, int *length)

功能:
解码 RTCM3 帧头部,获取消息类型和长度。

输入参数:

  • buff: 数据缓冲区。
  • msg_type, length: 输出参数。

返回值:

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

3.4 rtcm3_decode_msm
int rtcm3_decode_msm(rtcm_t *rtcm, const unsigned char *buff)

功能:
解码 MSM 格式校正数据,提取伪距、载波相位和信号强度。

输入参数:

  • rtcm, buff: 同上。

返回值:

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

3.5 rtcm3_apply_corr
int rtcm3_apply_corr(rtcm_t *rtcm, obs_t *obs)

功能:
将 MSM 数据应用到观测值结构体。

输入参数:

  • rtcm, obs: 同上。

返回值:

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

四、关键算法数学原理与推导

MSM 消息压缩编码

MSM 消息采用差分编码压缩多个卫星的观测值。对于第 i i i 颗卫星,伪距差分修正量为:

Δ P i = P i − P r e f \Delta P_i = P_i - P_{ref} ΔPi=PiPref

其中 P r e f P_{ref} Pref 为参考卫星的伪距。通过差分编码减少冗余数据,提升传输效率。


Part C: rtcm3e.c 文件解析

一、文件整体说明

rtcm3e.c 是 RTKLIB 中用于扩展 RTCM3 协议支持的模块,主要用于兼容厂商自定义消息格式(如 Trimble、Leica 的私有扩展)。该文件增强了 RTKLIB 对非标准 RTCM3 消息的解析能力。

主要功能:

  • 解析厂商扩展 RTCM3 消息。
  • 支持自定义校正数据与设备状态信息。
  • 提供扩展消息注册机制。

主要特色:

  • 模块化扩展接口。
  • 兼容主流厂商私有协议。
  • 动态注册扩展消息处理器。

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

程序执行流程如下:

  1. 注册扩展消息处理器。
  2. 识别扩展消息类型。
  3. 调用对应解析函数。

函数调用关系如下:

main
rtcm3e_register
rtcm3e_decode
rtcm3e_handler

三、主要函数说明

3.1 rtcm3e_register
int rtcm3e_register(int msg_type, void (*handler)(rtcm_t *))

功能:
注册特定类型扩展消息的解析函数。

输入参数:

  • msg_type: 扩展消息类型。
  • handler: 解析函数指针。

返回值:

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

3.2 rtcm3e_decode
int rtcm3e_decode(rtcm_t *rtcm, const unsigned char *buff)

功能:
识别扩展消息类型并调用对应解析函数。

输入参数:

  • rtcm, buff: 同上。

返回值:

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

3.3 rtcm3e_handler
void rtcm3e_handler(rtcm_t *rtcm)

功能:
示例扩展消息处理函数,提取厂商自定义数据。

输入参数:

  • rtcm: 解析器结构体。

四、关键算法数学原理与推导

无直接数学推导,但涉及位操作与变长编码技术。例如,厂商扩展消息可能使用 TLV(Type-Length-Value)结构编码数据。


Part D: rtcmn.c 文件解析

一、文件整体说明

rtcmn.c 是 RTKLIB 中 RTCM 协议的通用工具模块,提供跨版本(2.x/3.x)的共享函数,如 CRC 校验、时间戳转换和坐标系变换。

主要功能:

  • 提供 CRC-24Q、CRC-16 校验算法。
  • 实现 GNSS 时间系统转换。
  • 支持坐标系转换(ECEF <-> LLH)。

主要特色:

  • 高复用性工具函数。
  • 精度优化的数学计算。
  • 跨平台兼容性。

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

程序执行流程如下:

  1. 调用通用 CRC 校验函数。
  2. 转换时间戳与坐标。

函数调用关系如下:

main
crc24q
time2gpst
xyz2pos

三、主要函数说明

3.1 crc24q
unsigned int crc24q(const unsigned char *buff, int len)

功能:
计算 RTCM3 消息的 CRC-24Q 校验码。

输入参数:

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

返回值:

  • CRC 校验结果。

3.2 time2gpst
double time2gpst(gtime_t t, int *week)

功能:
将通用时间结构体转换为 GPS 周数与周秒。

输入参数:

  • t: 时间结构体。
  • week: 输出 GPS 周数。

返回值:

  • GPS 周秒。

3.3 xyz2pos
void xyz2pos(const double *xyz, double *pos)

功能:
将 ECEF 坐标转换为地理坐标(LLH)。

输入参数:

  • xyz: ECEF 坐标(3D 向量)。
  • pos: 输出 LLH 坐标(纬度、经度、高度)。

四、关键算法数学原理与推导

地理坐标转换公式

ECEF 到 LLH 的迭代解法:

ϕ n + 1 = arctan ⁡ ( z + e ′ 2 b sin ⁡ 3 θ p − e 2 a cos ⁡ 3 θ ) h = p cos ⁡ ϕ − N \begin{aligned} \phi_{n+1} &= \arctan\left( \frac{z + e'^2 b \sin^3 \theta}{p - e^2 a \cos^3 \theta} \right) \\ h &= \frac{p}{\cos \phi} - N \end{aligned} ϕn+1h=arctan(pe2acos3θz+e′2bsin3θ)=cosϕpN

其中:

  • p = x 2 + y 2 p = \sqrt{x^2 + y^2} p=x2+y2
  • θ = arctan ⁡ ( z p ) \theta = \arctan\left( \frac{z}{p} \right) θ=arctan(pz)
  • N = a 1 − e 2 sin ⁡ 2 ϕ N = \frac{a}{\sqrt{1 - e^2 \sin^2 \phi}} N=1e2sin2ϕ a

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


http://www.xdnf.cn/news/6180.html

相关文章:

  • 阿里云Docker镜像加速配置指南
  • Nginx配置与应用案例详解
  • 深圳无人机展览即将开始,无人机舵机为什么选择伟创动力
  • Single image dehazing论文阅读
  • 鸿蒙OSUniApp 实现的语音输入与语音识别功能#三方框架 #Uniapp
  • Python----神经网络(《Searching for MobileNetV3》论文概括和MobileNetV3网络)
  • Qt原型模式实现与应用
  • auto.js面试题及答案
  • python如何合并excel单元格
  • 在Spark搭建YARN
  • wordcount程序
  • 青少年编程与数学 02-019 Rust 编程基础 12课题、所有权系统
  • 自由学习记录(60)
  • 原型设计的作用
  • 人工智能驱动的临床路径体系化解决方案与实施路径
  • libarchive.so.19丢失
  • Qt操作SQLite数据库教程
  • Spark 集群配置、启动与监控指南
  • AI模型开发全流程笔记
  • hacker送书第23期
  • Java实现美术机构教务管理系统:基于爱耕云功能模式的解决方案
  • 基于EFISH-SCB-RK3576/SAIL-RK3576的CNC机床控制器技术方案‌
  • 深度剖析 GpuGeek 实例:GpuGeek/Qwen3-32B 模型 API 调用实践与性能测试洞察
  • 如何通过外卖系统源码打造本地O2O外卖配送生态?全链路技术解析
  • 磁盘存储链式的 B 树与 B+ 树
  • 解决LEENSA/LEENSA无法使用的方法
  • linux创建自己的服务
  • 后量子密码通信协议测试指南
  • 计算机组成与体系结构:组相联映射(Set-Associative Mapping)
  • NHANES指标推荐:AGR