周子富,朱吉勝
(1.武警工程大學(xué) 研究生大隊,陜西 西安 710086;2.武警工程大學(xué) 通信工程系,陜西 西安 710086)
GPS是目前世界上應(yīng)用最為廣泛的衛(wèi)星導(dǎo)航系統(tǒng),其全球性、全能性和全天候性的導(dǎo)航定位、定時和測速優(yōu)勢在諸多領(lǐng)域中得到越來越廣泛的應(yīng)用。GPS已逐步演變?yōu)橐环N世界性的高新技術(shù)產(chǎn)業(yè),越來越受到了人們的關(guān)注[1]。
在各種導(dǎo)航系統(tǒng)及大型監(jiān)控系統(tǒng)中,為了提供歷史軌跡重放等功能,往往要存儲大量的定位數(shù)據(jù),同時這些數(shù)據(jù)甚至還要通過無線通信傳送,所需費用高 而且傳送中會受到網(wǎng)絡(luò)帶寬的限制,很可能出現(xiàn)網(wǎng)絡(luò)延遲 這就大大影響了實時定位的效果。如何處理GPS數(shù)據(jù)對系統(tǒng)整體功能的實現(xiàn)極其重要。VC++憑借其在GPS通信及數(shù)據(jù)處理程序編寫方面的優(yōu)勢,得到廣泛應(yīng)用。
想要對GPS數(shù)據(jù)進(jìn)行處理,首先需要了解GPS的數(shù)據(jù)格式。目前,大多數(shù)GPS都采用美國國家海洋電子協(xié)會(National Marine Electronics Association)制定的NMEA-0183通信標(biāo)準(zhǔn),這種通信標(biāo)準(zhǔn)輸出的數(shù)據(jù)采用ASCII碼,其內(nèi)容包含了緯度、經(jīng)度、高度、速度、日期、時間、航向以及衛(wèi)星狀況等信息,規(guī)定的語句有 6種,包括 GGA、GLL、GSA、GSV、RMC和VTG[2]。對于不同的用途,選用的語句記錄也不同,對于大多數(shù)的普通使用者只關(guān)心其日期和時間、經(jīng)緯度、地面速度信息等,而RMC語句就包含了以上信息,所以本文只討論RMC語句。一條RMC語句包括了以下記錄:語句標(biāo)識頭、世界時間、定位狀態(tài)、緯度、緯度方位、經(jīng)度、經(jīng)度方位、地面速度、地面路線、日期、磁偏角、校驗和和結(jié)束標(biāo)記[3],其結(jié)構(gòu)及各字段含義如下:
$GPRMC,<l>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<1l>*hh
<l>UTC 時間。 格式為 hhmmss.ss。
<2>狀態(tài),A為數(shù)據(jù)有效,V為非有效。
<3>緯度。 格式為ddmm.mmmm (度、分&小數(shù)分)。
<4>標(biāo)明南北半球,N為北半球、S為南半球。
<5>經(jīng)度,格式為 dddmm.mmmm (度、分 &小數(shù)分)。
<6>標(biāo)明東西半球,E為東半球、W為西半球。
<7>地面上的速度。范圍為 0.0到999.9。
<8>方位角,范圍為000.0到 359.9度。
<9>日期。 格式為 ddmmyy(日、月、年)。
<l0>地磁變化,從 000.0到 180.0度。
<ll>地磁變化方向,為E或W。
一般情況下,并不需要所有的定位數(shù)據(jù)而只需要其中的一部分,所以在存儲數(shù)據(jù)之前一般先要對數(shù)據(jù)預(yù)處理。
GPS數(shù)據(jù)的采集一般都是通過串口通信進(jìn)行的,接收機(jī)都提供有串口接口,常用的GPS接收器一般遵循NMEA-0183協(xié)議且提供串行通信接口與計算機(jī)通信。VC++提供的串口通信編程方法有好幾種,其中利用MSComm控件實現(xiàn)串口通信是較為方便的一種,程序員不必去學(xué)習(xí)復(fù)雜的API函數(shù),只需對串口進(jìn)行簡單配置,這方面的例子相當(dāng)普遍,這里不作詳細(xì)介紹。GPS接收機(jī)工作時會源源不斷地把接收到的GPS定位數(shù)據(jù)傳送到PC機(jī)中[4]。串口通訊代碼從串口接收數(shù)據(jù)并將其放置于緩存data中,等待下一步的處理。
在對GPS數(shù)據(jù)進(jìn)行某種壓縮處理之前,應(yīng)該先對其進(jìn)行預(yù)處理。GPS數(shù)據(jù)預(yù)處理是一種最直接的處理方式,也是減小數(shù)據(jù)容量的一種比較直觀有效的方法。分析GPS數(shù)據(jù),可以知道這些信息中,有很多屬于冗余信息。為了方便后續(xù)壓縮的進(jìn)行,先對輸出的信號進(jìn)行壓縮預(yù)處理[5],預(yù)處理之后只保留必須要的信息,步驟如下:
1)語句標(biāo)識頭(ID):數(shù)據(jù)出自同一GPS接收機(jī),每個語句的標(biāo)識頭都一樣,所以該記錄段屬冗余信息,完全可以去除,在解壓縮時再在每個語句前加上該標(biāo)識頭即可。
2)世界時間(UTC):該信息段以時、分、秒、毫秒的格式指示出當(dāng)時世界時間。不進(jìn)行預(yù)處理。
3)定位狀態(tài)(A/V):占用1個字節(jié),不進(jìn)行預(yù)處理。
4)緯度:占用9個字節(jié),不進(jìn)行預(yù)處理。
5)經(jīng)度:占用10個字節(jié),不進(jìn)行預(yù)處理。
6)經(jīng)度指示器(E/W):占一個字節(jié),它指示東西經(jīng)。只研究在東經(jīng)的情況,所以它是冗余信息,可以去除。
7)緯度指示器(N/S):占一個字節(jié)。處理同上。
8)地面速度:占用4個字節(jié),可以去除。
9)日期:占用6個字節(jié),以日、月、年的格式顯示。因為該系統(tǒng)一天啟動一次,日期相同,是冗余信息。
10)地磁變化:可以去除。
11)校驗和、結(jié)束符:在完成對數(shù)據(jù)的校驗后,校驗和便可去除。結(jié)束符由回車、換行組成,由于語句長度已知所以也可以去除。
對一組數(shù)據(jù):
$GPRMC,032510,A,2934.0467,N,10634.3591,E,000.0,000.0,191203,001.6,w*65則經(jīng)過預(yù)處理后的 GPS數(shù)據(jù)格式為:032510,A,2934.0467,10634.3591,只剩下時間、狀態(tài)、緯度和經(jīng)度,共29個字節(jié)。進(jìn)一步處理,可以將逗號去掉,將新的 數(shù) 據(jù) 變 成 為 已 “A” 為 首 的 字 符 串A0325102934.046710634.3591,把A放在第一個字節(jié)是為了方便遍歷字符,此時,剩下26個字節(jié),與原始數(shù)據(jù)的70個字節(jié)相比減小了62%。
利用VC++編程以上預(yù)處理時一般先通過對幀頭的判斷來進(jìn)行數(shù)據(jù)的提取處理。由于幀內(nèi)各數(shù)據(jù)段由逗號分割。因此在處理緩存數(shù)據(jù)時一般是通過搜尋ASCII碼“$”來判斷是否是幀頭。在對幀頭的類別進(jìn)行識別后再通過對所經(jīng)歷逗號個數(shù)的計數(shù)來判斷出當(dāng)前正在處理的是哪一種定位導(dǎo)航參數(shù)[6]。下面是對緩存中的數(shù)據(jù)進(jìn)行參數(shù)處理的部分代碼:

這樣就提取出了時間、狀態(tài)、經(jīng)度和緯度,后續(xù)的處理只需在此基礎(chǔ)上再進(jìn)行即可。
數(shù)據(jù)壓縮的方法很多,總的來說可以分為無損壓縮和有損壓縮兩大類。本文針對預(yù)處理過的GPS數(shù)據(jù)的格式特點,采用半字節(jié)的方法[7]進(jìn)行編碼。可以看到,預(yù)處理過的數(shù)據(jù)為A0325102934.046710634.3591,即“A時間緯度經(jīng)度”的格式。為了方便檢測數(shù)據(jù)的完整性和方便編程實現(xiàn),這里我們在后面加入結(jié)束標(biāo)識C,變成“A時間緯度經(jīng)度C”的格式,則處理完的數(shù)據(jù)包括有0至9十個符號、小數(shù)點“.”以及字母“A”、“B”,共12個符號。事實上,四位二進(jìn)制編碼就能區(qū)分16中狀態(tài),所以用四位二進(jìn)制編碼來表示12個符號已經(jīng)足夠,而不必用八位。壓縮數(shù)據(jù)編碼表如下:

表1 編碼表Tab.1 Code table
這種編碼方式提供了16種狀態(tài),而我們只用到了12種,還冗余4種,我們還可以根據(jù)需要,利用這4種狀態(tài)進(jìn)行編碼實現(xiàn)其他功能,如用來實現(xiàn)糾錯功能等。圖1是進(jìn)行數(shù)據(jù)壓縮的流程圖。

圖1 數(shù)據(jù)壓縮流程圖Fig.1 Flow chart of data compression
從壓縮編碼表可以看出,采取這種編碼方式可以直接使得數(shù)據(jù)壓縮了50%。對于“A0325102934.046710634.3591B”,壓縮編碼之后只需用108位編碼表示,和預(yù)處理前的數(shù)據(jù)(70個字節(jié),560位)相比,雖然后面加了一個結(jié)束標(biāo)識符B,但總的壓縮編碼壓縮比仍可達(dá)80%。
文中設(shè)計并實現(xiàn)了一種在數(shù)據(jù)預(yù)處理的基礎(chǔ)上進(jìn)行的GPS數(shù)據(jù)壓縮算法,壓縮比可達(dá)到 80%以上。本算法前期的數(shù)據(jù)預(yù)處理之后GPS定位數(shù)據(jù)中只剩下12個符號表示,一方面去掉了很大一部分冗余信息,使數(shù)據(jù)量明顯減小,另一方面符號數(shù)目減少且已知,因此在編碼時只需根據(jù)ASCII碼值建立較小的數(shù)組。這種數(shù)據(jù)處理方式比較簡單,程序量小,壓縮比大,且易于實現(xiàn),對解決GPS應(yīng)用中數(shù)據(jù)量大而存儲器資源有限的問題以及數(shù)據(jù)傳輸帶寬等問題具有重要的實際意義。
[1]羅海英,李強(qiáng),劉旭東.基于VC++的GPS狀態(tài)監(jiān)控與數(shù)據(jù)采集軟件的設(shè)計與實現(xiàn)[J].測繪通報,2010(12):27-29.
LUO Hai-ying,LI Qiang,LIU Xu-dong. Desigen and implementation of GPS state monitoring and data acquisition soffware based on VC++[J].Surveying and Mapping,2010(12):27-29.
[2]馬飛,諸昌鈐.利用VC++實現(xiàn)GPS數(shù)據(jù)采集[J].計算機(jī)時代,2005(6):13-15.
MA Fei,ZHU Chang-qian.GPS data acquisition Using VC++[J].Computer Age,2005(6):13-15.
[3]趙曉煒.基于Huffman編碼的GPS定位數(shù)據(jù)壓縮算法及實現(xiàn)[D].內(nèi)蒙古:內(nèi)蒙古工業(yè)大學(xué),2006.
[4]陳靜,許劼,邱國廷.用VC++6.0實現(xiàn)計算機(jī)與GPS通信[J].北京測繪,2004(3):25-29.
CHEN Jing,XU Jie,QIU Guo-ting.Using VC++6.0 to design the GPS-computer communication[J].Beijing Surveying and Mapping,2004(3):25-29.
[5]任華新.GPS定位數(shù)據(jù)壓縮算法的設(shè)計[J].長春工程學(xué)院學(xué)報,2008,9(3):74-76.
REN Hua-xin.The design of the data compression algorithm on GPS system[J].J.Changchun Inst.Tech,2008,9 (3):74-76.
[6]邱治國,王向武.VC++實現(xiàn)GPS全球定位系統(tǒng)定位數(shù)據(jù)的提取[J].科技信息,2007(3):20-21.
QIU Zhi-guo,WANG,Xiang-wu.Location data extraction of GPS globalpositioningsystem with VC++[J].Science Information,2007(3):20-21.
[7]楊宏業(yè),張躍.GPS定位數(shù)據(jù)壓縮算法的設(shè)計與實現(xiàn)[J].電子技術(shù)應(yīng)用,2002(12):29-32.
YANG Hong-ye,ZHANG Yue.GPS positioning data compression algorithm design and implementation[J].Electronic Technology,2002(12):29-32.
[8]馬蘭,袁衛(wèi).基于GPS的數(shù)據(jù)采集處理系統(tǒng)設(shè)計[J].現(xiàn)代電子技術(shù),2010(15):171-172,176.
MA Lan,YUAN Wei.Design of data acquisition system based on GPS[J].Modern Electronic Technique,2010(15):171-172,176.