[學習] 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詳解: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 信號。

二、執行流程與函數調用關系

程序執行流程如下:

  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)=(D?x24)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 為觀測噪聲協方差矩陣。


研究學習不易,點贊易。
工作生活不易,收藏易,點收藏不迷茫 :)


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/905889.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905889.shtml
英文地址,請注明出處:http://en.pswp.cn/news/905889.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

移植RTOS,發現任務棧溢出怎么辦?

目錄 1、硬件檢測方法 2、軟件檢測方法 3、預防堆棧溢出 4、處理堆棧溢出 在嵌入式系統中,RTOS通過管理多個任務來滿足嚴格的時序要求。任務堆棧管理是RTOS開發中的關鍵環節,尤其是在將RTOS移植到新硬件平臺時。堆棧溢出是嵌入式開發中常見的錯誤&am…

window 顯示驅動開發-使用有保證的協定 DMA 緩沖區模型

Windows Vista 的顯示驅動程序模型保證呈現設備的 DMA 緩沖區和修補程序位置列表的大小。 修補程序位置列表包含 DMA 緩沖區中命令引用的資源的物理內存地址。 在有保證的協定模式下,用戶模式顯示驅動程序知道 DMA 緩沖區和修補程序位置列表的確切大小,…

SD-HOST Controller design-----SD CLK 設計

hclk的分頻電路,得到的分頻時鐘作為sd卡時鐘。 該模塊最終輸出兩個時鐘:一個為fifo_sd_clk,另一個為out_sd_clk_dft。當不分頻時,fifo_sd_clk等于hclk;當分頻時候,div_counter開始計數,記到相應分頻的時候…

完全背包問題中「排列數」與「組合數」的核心區別

🎯 一句話理解 求組合數(不計順序) → 外層遍歷物品,內層遍歷背包容量 求排列數(計順序) → 外層遍歷背包容量,內層遍歷物品 🎲 舉例說明 假設有硬幣 [1, 2, 3],目標金…

NHANES指標推薦:MDS

文章題目:The association between magnesium depletion score (MDS) and overactive bladder (OAB) among the U.S. population DOI:10.1186/s41043-025-00846-x 中文標題:美國人群鎂耗竭評分 (MDS) 與膀胱過度活動癥…

C++:字符串操作函數

strcpy() 功能&#xff1a;把一個字符串復制到另一個字符串。 #include <iostream> #include <cstring> using namespace std;int main() {char src[] "Hello";char dest[10];strcpy(dest, src);cout << "Copied string: " << …

1基·2臺·3空間·6主體——藍象智聯解碼可信數據空間的“數智密碼”

近日&#xff0c;由全國數據標準化技術委員會編制的《可信數據空間 技術架構》技術文件正式發布&#xff0c;標志著我國數據要素流通體系向標準化、規范化邁出關鍵一步。該文件從技術功能、業務流程、安全要求三大維度對可信數據空間進行系統性規范&#xff0c;為地方、行業及企…

基于TI AM6442+FPGA解決方案,支持6網口,4路CAN,8個串口

TI AM6442FPGA解決方案具有以下技術優勢及適用領域&#xff1a; 一、技術優勢 ?異構多核架構?&#xff1a;AM6442處理器集成7個內核&#xff08;2xCortex-A534xCortex-R5F1xCortex-M4F&#xff09;&#xff0c;可實現應用處理、實時控制和獨立任務分核協同&#xff0c;滿足…

android vlc播放rtsp

最近在做IOT開發&#xff0c;需要把IOT設備的RTSP流在手機端播放&#xff0c;VLC是個不錯的選擇&#xff0c;使用起來簡單方便。 1、在AndroidManifest.xml 中添加網絡權限 <uses-permission android:name"android.permission.INTERNET"/> <uses-permissi…

前端面經 9 JS中的繼承

借用Class實現繼承 實現繼承 extends super extends 繼承父類 super調用父類的構造函數 子類中存在方法采取就近原則 &#xff0c;子類構造函數需要使用super()調用父類的構造函數 JS 靜態屬性和私有屬性 寄生組合式繼承

jQuery知識框架

一、jQuery 基礎 核心概念 $ 或 jQuery&#xff1a;全局函數&#xff0c;用于選擇元素或創建DOM對象。 鏈式調用&#xff1a;多數方法返回jQuery對象&#xff0c;支持連續操作。 文檔就緒事件&#xff1a; $(document).ready(function() { /* 代碼 */ }); // 簡寫 $(function…

【HCIA】BFD

前言 前面我們介紹了浮動路由以及出口路由器的默認路由配置&#xff0c;可如此配置會存在隱患&#xff0c;就是出口路由器直連的網絡設備并不是運營商的路由器&#xff0c;而是交換機。此時我們就需要感知路由器的存活狀態&#xff0c;這就需要用到 BFD&#xff08;Bidirectio…

前端流行框架Vue3教程:18. _組件數據傳遞

透傳 Attributes 透傳attribute指的是傳遞給一個組件&#xff0c;卻沒有被該組件聲明為props或emits的attribute或者v-on事件監聽器。最常見的例子就是class、style和id 當一個組件以單個元素為根作渲染時&#xff0c;透傳的attribute會自動被添加到根元素上 透傳 Attributes …

卓力達電鑄鎳網:精密制造與跨領域應用的創新典范

目錄 引言 一、電鑄鎳網的技術原理與核心特性 二、電鑄鎳網的跨領域應用 三、南通卓力達電鑄鎳網的核心優勢 四、未來技術展望 引言 電鑄鎳網作為一種兼具高精度與高性能的金屬網狀材料&#xff0c;通過電化學沉積工藝實現復雜結構的精密成型&#xff0c;已成為航空航天、電…

1.2.3.2 數據安全發展歷程-大數據安全產品領域

從電商到物流&#xff1a;中國大數據安全產品如何進化&#xff1f; 在數字化時代&#xff0c;我們的一舉一動都可能被記錄——購物記錄、聊天信息、位置軌跡……這些數據不僅關系到個人隱私&#xff0c;更涉及企業運營和國家安全的命脈。近年來&#xff0c;隨著數據的爆發式增長…

服務器性能參數分析基礎:磁盤-CPU-內存

在Linux系統中&#xff0c;"掛載"&#xff08;Mount&#xff09;是指將物理存儲設備&#xff08;如磁盤分區&#xff09;或邏輯存儲卷&#xff08;如LVM、網絡存儲&#xff09;關聯到文件系統目錄樹的特定路徑節點&#xff08;即掛載點&#xff09;&#xff0c;使得該…

密碼學刷題小記錄

base 64 打開后發現是一串字符串&#xff0c;&#xff0c;我們直接進行base64解密即可 Caesar 根據標題分析&#xff0c;我們知道這是凱撒解密&#xff0c;拖進去經過嘗試在偏移量為12時直接得解&#xff08;這道題就是找偏移量比較麻煩&#xff09; Morse 這道題打開后&am…

Spring框架(三)

目錄 一、JDBC模板技術概述 1.1 什么是JDBC模板 二、JdbcTemplate使用實戰 2.1 基礎使用&#xff08;手動創建對象&#xff09; 2.2 使用Spring管理模板類 2.3 使用開源連接池&#xff08;Druid&#xff09; 三、模擬轉賬開發 3.1 基礎實現 3.1.1 Service層 3.1.2 Da…

[計算機網絡]網絡層

文章目錄 408考研大綱IPV4數據報格式協議: IPv4 地址DHCP協議IP組播 408考研大綱 IPV4數據報格式 協議: 1:ICMP 6:TCP 17:UDP IPv4 地址 特殊IP 網絡號全1又稱直接廣播地址&#xff0c;32位全1又稱受限廣播地址 因為255.255.255.255只能在本網絡內廣播&#xff0c;路由器不…

影樓精修-膚色統一算法解析

注意&#xff1a;本文樣例圖片為了避免侵權&#xff0c;均使用AIGC生成&#xff1b; 本文介紹影樓精修中膚色統一算法的實現方案&#xff0c;并以像素蛋糕為例&#xff0c;進行分析說明。 膚色統一就是將人像照片中皮膚區域的顏色進行統一&#xff0c;看起來顏色均勻一致&…