邢旺
Research of Decoding Method for GPS Raw Data
摘要:分析了GPS OEM板卡輸出的二進(jìn)制原始數(shù)據(jù)格式,提出了一種二進(jìn)制原始數(shù)據(jù)的解析方法,通過C++軟件編程實(shí)現(xiàn)了觀測(cè)值、定位結(jié)果等信息的提取。討論了二進(jìn)制原始數(shù)據(jù)文件向文本文件的轉(zhuǎn)換方法,并利用此方法編寫原始數(shù)據(jù)解析軟件,初步判斷測(cè)量數(shù)據(jù)的質(zhì)量。通過處理測(cè)量數(shù)據(jù)驗(yàn)證了解析方法的正確性與實(shí)用性。
Abstract: The format of GPS raw data exported by GPS OEM board is analyzed. A decoding method of raw data is put forward. The observation and position data is displayed by C++ program. The method of converting raw data file to text file is discussed, as well as the decoding program of raw data is accomplished. Both the analysis and the experiment can prove the correctness and the practicability of the decoding method.
關(guān)鍵詞:GPS;二進(jìn)制;原始數(shù)據(jù);格式轉(zhuǎn)換
Key words: GPS;binary;raw data;format conversion
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1006-4311(2018)15-0276-03
0 引言
GPS是20世紀(jì)70年代美國(guó)國(guó)防部研究與創(chuàng)建的新一代衛(wèi)星導(dǎo)航與定位系統(tǒng),現(xiàn)階段基于GPS的定位導(dǎo)航終端已被廣泛應(yīng)用于軍事安全、大地測(cè)量、航海航空、氣象服務(wù)、物流交通等領(lǐng)域。GPS導(dǎo)航接收機(jī)輸出的數(shù)據(jù)格式主要包括NMEA-0183格式和二進(jìn)制原始數(shù)據(jù)格式,二進(jìn)制原始數(shù)據(jù)具有節(jié)省存儲(chǔ)空間的優(yōu)點(diǎn),并且能夠包含星歷、偽距、載波相位等信息,但需要對(duì)原始數(shù)據(jù)做解析處理后才能獲得直觀的觀測(cè)與定位數(shù)據(jù),所以研究二進(jìn)制原始數(shù)據(jù)的解析方法具有重要意義[1]。本文首先分析二進(jìn)制原始數(shù)據(jù)結(jié)構(gòu),并通過編寫原始數(shù)據(jù)解析軟件,為二進(jìn)制原始數(shù)據(jù)的解析提供了依據(jù)。
1 數(shù)據(jù)格式分析
衛(wèi)星導(dǎo)航接收機(jī)輸出的原始數(shù)據(jù)格式往往因生產(chǎn)廠家而異,本文以JAVAD公司生產(chǎn)的JNS-100接收機(jī)板卡為例,并對(duì)其輸出的GPS二進(jìn)制原始數(shù)據(jù)結(jié)構(gòu)進(jìn)行分析。二進(jìn)制原始數(shù)據(jù)并不是接收機(jī)所默認(rèn)的輸出數(shù)據(jù),需要通過向接收機(jī)發(fā)送指令,才能輸出所需要的原始數(shù)據(jù)。命令的發(fā)送可以使用串口通訊軟件實(shí)現(xiàn),具體設(shè)置命令可參考接收機(jī)廠家提供的數(shù)據(jù)手冊(cè)。
每條觀測(cè)數(shù)據(jù)通常由三部分組成:數(shù)據(jù)頭、數(shù)據(jù)體和數(shù)據(jù)尾。數(shù)據(jù)頭因觀測(cè)信息的不同而不同,長(zhǎng)度為5個(gè)字節(jié),以5個(gè)16進(jìn)制標(biāo)識(shí)符表示,其中前兩個(gè)字節(jié)為觀測(cè)信息標(biāo)識(shí),后三個(gè)字節(jié)為數(shù)據(jù)體的長(zhǎng)度。數(shù)據(jù)體用多個(gè)16進(jìn)制標(biāo)識(shí)符表示相應(yīng)的觀測(cè)數(shù)據(jù),最后一個(gè)字節(jié)為校驗(yàn)和。數(shù)據(jù)尾長(zhǎng)度為1個(gè)字節(jié),用16進(jìn)制標(biāo)識(shí)符的0x0A表示。多條不同的觀測(cè)數(shù)據(jù)連接在一起組成一幀原始數(shù)據(jù),通過接收機(jī)的串口發(fā)送給數(shù)據(jù)記錄器。本文所設(shè)置的每一幀二進(jìn)制原始數(shù)據(jù)所包含的信息如表1所示。
其中,“~~”表示當(dāng)前一天中的時(shí)間,數(shù)據(jù)體中包含4個(gè)字節(jié)時(shí)間信息,其值為0-86400000ms;“RD”表示當(dāng)前日期,數(shù)據(jù)體中包含4個(gè)字節(jié)長(zhǎng)度年、月、日信息;“SI”表示衛(wèi)星PRN,數(shù)據(jù)體中包含當(dāng)前所有可見衛(wèi)星PRN,每一個(gè)衛(wèi)星PRN以1個(gè)字節(jié)表示;“RC”表示偽距,數(shù)據(jù)體中包含所有可見衛(wèi)星的偽距時(shí)間信息,每一個(gè)偽距時(shí)間信息以8個(gè)字節(jié)表示;“CP”表示載波相位,數(shù)據(jù)體中包含所有可見衛(wèi)星的載波相位時(shí)間信息,每一個(gè)載波相位時(shí)間信息以4個(gè)字節(jié)表示;“PV”表示當(dāng)前位置和速度,數(shù)據(jù)體中包含笛卡爾坐標(biāo)系下的位置和速度觀測(cè)值,位置數(shù)據(jù)X、Y、Z分別由8個(gè)字節(jié)表示,速度數(shù)據(jù)vx、vy、vz分別由4個(gè)字節(jié)表示;“DP”表示精度因子,即DOP值,數(shù)據(jù)體中包含水平位置、高程、時(shí)間的精度因子,分別由4個(gè)字節(jié)表示[2]。分析完一幀數(shù)據(jù)的結(jié)構(gòu),便可對(duì)其進(jìn)行解碼。
2 解析方法和軟件實(shí)現(xiàn)
數(shù)據(jù)記錄器中會(huì)保存相應(yīng)的原始數(shù)據(jù)文件,通過USB下載線將數(shù)據(jù)文件下載到計(jì)算機(jī)后,可以利用VC++編寫數(shù)據(jù)處理軟件進(jìn)行數(shù)據(jù)解碼。數(shù)據(jù)解碼流程如圖1所示。
利用C++文件流函數(shù)fopen將原始數(shù)據(jù)文件以二進(jìn)制形式打開,然后用fread函數(shù)按字節(jié)讀取二進(jìn)制原始數(shù)據(jù),當(dāng)查找到數(shù)據(jù)頭“7E 7E”,即ASCII碼的“~~”時(shí),開始將數(shù)據(jù)保存到變量中,直到再次遇到數(shù)據(jù)頭為止。完整的一幀原始數(shù)據(jù)如圖2所示。
一幀原始數(shù)據(jù)的長(zhǎng)度不是固定不變的,具體的字節(jié)數(shù)取決于當(dāng)前的可見星數(shù)。其中,偽距、位置的數(shù)據(jù)類型為雙精度浮點(diǎn)型(double),載波相位、速度和精度因子為單精度浮點(diǎn)型(float),原始數(shù)據(jù)的存儲(chǔ)按照小尾端機(jī)制(Little Endian Format),即低位優(yōu)先順序,當(dāng)接收到的某個(gè)觀測(cè)值需要多個(gè)字節(jié)表示時(shí),在解碼過程中應(yīng)當(dāng)先將數(shù)據(jù)的各個(gè)字節(jié)倒序排列[3],以速度觀測(cè)信息為例,當(dāng)原始數(shù)據(jù)文件中表示速度的4個(gè)字節(jié)為0x13 0x89 0x94 0xC0時(shí),需要將順序轉(zhuǎn)換為0xC0 0x94 0x89 0x13,然后將16進(jìn)制數(shù)轉(zhuǎn)換為float型。浮點(diǎn)型數(shù)據(jù)以二進(jìn)制形式表示時(shí),涉及符號(hào)位、階數(shù)和尾數(shù)[4],如果展開成多位二進(jìn)制數(shù)后再進(jìn)行轉(zhuǎn)換較為復(fù)雜,本文利用一種簡(jiǎn)單快捷的方法,轉(zhuǎn)換代碼如下:
vxbyte.Format("%02x%02x%02x%02x",byte[3],byte[2],byte[1],byte[0]);
sscanf(vxbyte,"%lx",&vx;);
其中,byte型數(shù)組用以存儲(chǔ)速度的原始數(shù)據(jù),vxbyte為字符串類型,用以存儲(chǔ)轉(zhuǎn)換順序后的速度數(shù)據(jù),vx為float型,用sscanf函數(shù)轉(zhuǎn)換后可以得出vx的值為-4.64173m/s。另外,由于本文所用接收機(jī)板卡偽距和載波相位原始數(shù)據(jù)都是以時(shí)間信息表示,需要根據(jù)公式進(jìn)行計(jì)算。偽距RC的計(jì)算公式為:
RC=c·prRC (1)
c為光速,單位為m/s,prRC即原始數(shù)據(jù)解算后的偽距時(shí)間信息,單位為s。
載波相位CP的計(jì)算公式為:
CP=(rcp+prRC)·FLn (2)
rcp為原始數(shù)據(jù)解算后與載波相位相關(guān)的時(shí)間信息,F(xiàn)Ln為載波頻率,本文中只用到GPS的L1頻段,所以FLn取值為1575.42MHz。
對(duì)完整的一幀原始數(shù)據(jù)進(jìn)行解碼計(jì)算后,得出的所有參數(shù)值如表2所示,然后即可方便地進(jìn)行進(jìn)一步處理,也可利用該方法繼續(xù)編寫較為復(fù)雜的上位機(jī)軟件。
3 應(yīng)用實(shí)例
將某次測(cè)量的數(shù)據(jù)文件從數(shù)據(jù)記錄器下載到計(jì)算機(jī)中,然后利用VC++編寫的數(shù)據(jù)處理軟件處理,數(shù)據(jù)處理程序界面如圖3所示。
首先打開原始數(shù)據(jù)文件,點(diǎn)擊分析后即可生成解碼數(shù)據(jù)文件。本文將解析數(shù)據(jù)保存為文本文件格式,解析后的部分?jǐn)?shù)據(jù)展示如圖4所示。
衛(wèi)星的幾何分布取決于可見星個(gè)數(shù)及其相對(duì)于用戶設(shè)備的幾何分布,而且DOP值的大小與GPS定位的誤差成正比,DOP值越大,定位誤差越大,定位的精度也就相對(duì)降低,故分析試驗(yàn)過程中的可見星數(shù)與DOP值的大小具有一定的意義[5]??梢娦菙?shù)與HDOP和VDOP的曲線如圖5所示。
由圖5可以看出,試驗(yàn)過程中可見星數(shù)最少為8顆,最多為10顆,搜星狀況比較良好,水平位置精度因子HDOP和高程精度因子VDOP在測(cè)量過程中均小于2,初步判斷本次測(cè)量中所使用的GPS接收機(jī)工作情況良好。
4 結(jié)束語(yǔ)
本文分析了GPS OEM板輸出的二進(jìn)制原始數(shù)據(jù)結(jié)構(gòu),并利用VC++進(jìn)行軟件編程,實(shí)現(xiàn)了一種簡(jiǎn)單高效的原始數(shù)據(jù)解析方法,通過對(duì)測(cè)量的GPS二進(jìn)制原始數(shù)據(jù)解析,可以獲得較為直觀的觀測(cè)數(shù)據(jù),驗(yàn)證了解析方法的正確性,同時(shí)還能基于該解析方法,編寫較為復(fù)雜的數(shù)據(jù)質(zhì)量檢測(cè)軟件及測(cè)量數(shù)據(jù)顯示軟件,既能節(jié)約成本,也對(duì)測(cè)量數(shù)據(jù)的處理與評(píng)估提供依據(jù)。
參考文獻(xiàn):
[1]劉海穎,王惠南,陳志明.衛(wèi)星導(dǎo)航原理與應(yīng)用[M].北京:國(guó)防工業(yè)出版社,2013.
[2]JAVAD GNSS.GNSS Receiver External Interface Specification[S].2016.
[3]賈榮,王解先.NovAtel OEM4主板的GPS原始數(shù)據(jù)解碼[J].現(xiàn)代科學(xué)儀器,2010,2(1):54-57.
[4]李萌,胡紹林.一種解碼接收機(jī)原始二進(jìn)制數(shù)據(jù)的方法[J].2014,39(3):59-61.
[5]謝鋼.GPS原理與接收機(jī)設(shè)計(jì)[M].北京:電子工業(yè)出版社,2009.