RTKLib詳解: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
[學習] 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 信號。
二、執行流程與函數調用關系
程序執行流程如下:
- 初始化 LEX 信號解析器。
- 逐幀讀取原始信號數據。
- 執行 CRC 校驗與幀同步。
- 解碼電文內容并提取參數。
函數調用關系如下:
三、主要函數說明
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)=(D?x24)modG(x)
其中 G ( x ) G(x) G(x) 為上述多項式。
Part B: rcvraw.c 文件解析
一、文件整體說明
rcvraw.c
是 RTKLIB 中用于解析接收機原始觀測數據的核心模塊。它支持多種接收機格式(如 UBX、RTCM、BINEX),將原始二進制數據轉換為內部觀測結構,為后續處理提供基礎。
主要功能:
- 解析接收機原始數據流。
- 支持多頻段、多系統觀測值提取。
- 提供時間戳同步與數據校驗。
主要特色:
- 自動探測輸入數據格式。
- 支持實時流與文件模式。
- 高效的數據緩存與解析機制。
二、執行流程與函數調用關系
程序執行流程如下:
- 讀取原始數據流并識別格式。
- 解析觀測值、星歷和校正信息。
- 將數據轉換為 RTKLIB 內部結構。
- 輸出觀測數據與狀態信息。
函數調用關系如下:
三、主要函數說明
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)。
主要特色:
- 支持多頻段、多系統聯合解算。
- 高精度卡爾曼濾波器實現。
- 可視化解算狀態與質量指標。
二、執行流程與函數調用關系
程序執行流程如下:
- 初始化解算器與狀態向量。
- 加載觀測數據與星歷信息。
- 構建觀測方程并更新卡爾曼濾波器。
- 輸出解算結果與協方差矩陣。
函數調用關系如下:
三、主要函數說明
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 為觀測噪聲協方差矩陣。
研究學習不易,點贊易。
工作生活不易,收藏易,點收藏不迷茫 :)