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
qzslex.c
是 RTKLIB 中用于解析 QZSS(Quasi-Zenith Satellite System)LEX(L-band EXperimental)信号的模块。该文件实现了从原始信号数据中提取导航电文、星历信息和时钟校正参数的功能,支持日本准天顶卫星系统(QZSS)的高精度定位。
主要功能:
主要特色:
程序执行流程如下:
函数调用关系如下:
lex_init
int lex_init(lex_t *lex)
功能:
初始化 LEX 信号解析器,设置默认参数。
输入参数:
lex
: LEX 数据结构体指针。返回值:
lex_read_frame
int lex_read_frame(FILE *fp, unsigned char *buff, int *len)
功能:
从文件或流中读取 LEX 信号帧数据。
输入参数:
fp
: 文件指针。buff
: 缓冲区。len
: 输出读取长度。返回值:
lex_check_crc
int lex_check_crc(const unsigned char *buff, int len)
功能:
验证 LEX 帧的 CRC 校验码。
输入参数:
buff
: 数据缓冲区。len
: 数据长度。返回值:
lex_decode_frame
int lex_decode_frame(const unsigned char *buff, lex_data_t *data)
功能:
解码 LEX 帧电文,提取星历、时钟等参数。
输入参数:
buff
: 解析后的帧数据。data
: 输出参数存储结构体。返回值:
LEX 信号采用前向纠错编码(FEC)和交织技术,电文结构包含:
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) 为上述多项式。
rcvraw.c
是 RTKLIB 中用于解析接收机原始观测数据的核心模块。它支持多种接收机格式(如 UBX、RTCM、BINEX),将原始二进制数据转换为内部观测结构,为后续处理提供基础。
主要功能:
主要特色:
程序执行流程如下:
函数调用关系如下:
raw_init
int raw_init(raw_t *raw, int format)
功能:
初始化接收机原始数据解析器,指定数据格式。
输入参数:
raw
: 原始数据结构体。format
: 数据格式(如 FORMAT_UBX)。返回值:
raw_read
int raw_read(FILE *fp, unsigned char *buff, int nmax)
功能:
从文件或流中读取原始数据。
输入参数:
fp
: 文件指针。buff
: 缓冲区。nmax
: 最大读取长度。返回值:
raw_parse
int raw_parse(raw_t *raw, int type, const unsigned char *buff, int len)
功能:
解析原始数据,识别消息类型并填充结构体。
输入参数:
raw
: 解析器结构体。type
: 消息类型(如 MSG_NAV_PVT)。buff
: 数据缓冲区。len
: 数据长度。返回值:
raw_output
int raw_output(raw_t *raw, FILE *fp)
功能:
将解析后的观测数据写入输出文件或流。
输入参数:
raw
: 解析器结构体。fp
: 输出文件指针。返回值:
接收机时间戳 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 时间的闰秒修正值,需通过星历或头文件获取。
solution.c
是 RTKLIB 中用于 GNSS 定位解算的核心模块。它实现了从观测数据到最终位置、速度、时间(PVT)的求解过程,支持单点定位(SPP)、差分定位(DGPS)和实时动态定位(RTK)等多种模式。
主要功能:
主要特色:
程序执行流程如下:
函数调用关系如下:
sol_init
int sol_init(sol_t *sol, int mode)
功能:
初始化解算器,设置解算模式(SPP/RTK)。
输入参数:
sol
: 解算器结构体。mode
: 解算模式(如 SOL_MODE_RTK)。返回值:
sol_load_obs
int sol_load_obs(const obs_t *obs, const nav_t *nav, sol_t *sol)
功能:
加载观测数据与导航数据到解算器。
输入参数:
obs
, nav
: 观测与导航数据。sol
: 解算器结构体。返回值:
sol_update
int sol_update(sol_t *sol)
功能:
执行一次解算迭代,更新状态向量与协方差矩阵。
输入参数:
sol
: 解算器结构体。返回值:
sol_output
int sol_output(const sol_t *sol, FILE *fp)
功能:
将解算结果(位置、速度、状态)写入文件。
输入参数:
sol
: 解算器结构体。fp
: 输出文件指针。返回值:
观测方程为:
y = H x + v \mathbf{y} = \mathbf{H} \mathbf{x} + \mathbf{v} y=Hx+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 为观测噪声协方差矩阵。
研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)