[学习] RTKLib详解:rtcm2.c、rtcm3.c、rtcm3e与rtcmn.c
RTKLib详解:rtcm2.c
、rtcm3.c
、rtcm3e
与rtcmn.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 校验。
- 可扩展至多基准站数据。
二、执行流程与函数调用关系
程序执行流程如下:
- 初始化 RTCM2 解析器。
- 逐帧读取原始数据并提取消息头。
- 解码消息体并校验 CRC。
- 提取校正数据并更新状态。
函数调用关系如下:
三、主要函数说明
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)协议。
二、执行流程与函数调用关系
程序执行流程如下:
- 初始化 RTCM3 解析器。
- 读取并同步消息帧头。
- 解码消息类型与长度。
- 处理 MSM 格式校正数据。
函数调用关系如下:
三、主要函数说明
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=Pi−Pref
其中 P r e f P_{ref} Pref 为参考卫星的伪距。通过差分编码减少冗余数据,提升传输效率。
Part C: rtcm3e.c 文件解析
一、文件整体说明
rtcm3e.c
是 RTKLIB 中用于扩展 RTCM3 协议支持的模块,主要用于兼容厂商自定义消息格式(如 Trimble、Leica 的私有扩展)。该文件增强了 RTKLIB 对非标准 RTCM3 消息的解析能力。
主要功能:
- 解析厂商扩展 RTCM3 消息。
- 支持自定义校正数据与设备状态信息。
- 提供扩展消息注册机制。
主要特色:
- 模块化扩展接口。
- 兼容主流厂商私有协议。
- 动态注册扩展消息处理器。
二、执行流程与函数调用关系
程序执行流程如下:
- 注册扩展消息处理器。
- 识别扩展消息类型。
- 调用对应解析函数。
函数调用关系如下:
三、主要函数说明
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)。
主要特色:
- 高复用性工具函数。
- 精度优化的数学计算。
- 跨平台兼容性。
二、执行流程与函数调用关系
程序执行流程如下:
- 调用通用 CRC 校验函数。
- 转换时间戳与坐标。
函数调用关系如下:
三、主要函数说明
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(p−e2acos3θz+e′2bsin3θ)=cosϕp−N
其中:
- 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=1−e2sin2ϕa
研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)