本發(fā)明涉及GPS定位技術(shù)領(lǐng)域,具體是一種智能導(dǎo)游系統(tǒng)中GPS定位導(dǎo)航數(shù)據(jù)的提取方法。
背景技術(shù):
隨著人們生活水平的日益提高,旅游在人們的生活中的地位已經(jīng)越來越重要。在人們越來越熱衷于旅游的同時,一些不可忽略的問題凸現(xiàn)出來,傳統(tǒng)的人工導(dǎo)游已經(jīng)不能滿足游客的需求了。這就需要一種能夠提供更加方便,更加貼心的智能導(dǎo)游。它可以向游客提供基本的導(dǎo)游解說,位置動態(tài)顯示,景點預(yù)覽,目的地最優(yōu)路徑規(guī)劃,團(tuán)隊信息交互及集合等。在整個系統(tǒng)中最重要的一步是定位導(dǎo)航數(shù)據(jù)的提取。
技術(shù)實現(xiàn)要素:
針對現(xiàn)有技術(shù)存在的問題,本發(fā)明提供一種智能導(dǎo)游系統(tǒng)中GPS定位導(dǎo)航數(shù)據(jù)的提取方法。
本發(fā)明的技術(shù)方案是:
一種智能導(dǎo)游系統(tǒng)中GPS定位導(dǎo)航數(shù)據(jù)的提取方法,包括以下步驟:
步驟1:定義GPS定位導(dǎo)航數(shù)據(jù)格式:采用NEMA0183格式,主要由幀頭、幀尾和幀內(nèi)數(shù)據(jù)組成;根據(jù)數(shù)據(jù)幀的不同,幀頭也不相同;
GPS,即Global Positioning System;
步驟2:GPS定位導(dǎo)航數(shù)據(jù)的接收:通過RS-232串口將定位信息從GPS接收機(jī)獲取,包括經(jīng)緯度、海拔高度;
步驟2-1:串口初始化操作;
步驟2-2:GPS定位導(dǎo)航數(shù)據(jù)的接收:采用輪詢串口方式或事件觸發(fā)方式對GPS定位信息進(jìn)行接收;
步驟3:GPS定位導(dǎo)航數(shù)據(jù)的處理;
步驟3-1:從串口接收到的數(shù)據(jù)并將被放置于緩存;
步驟3-2:開辟一個緩沖區(qū),調(diào)用ReadFile函數(shù)將串口緩存中的GPS定位導(dǎo)航數(shù)據(jù)讀到該緩沖區(qū)中;
步驟3-3:對所述緩沖區(qū)中的數(shù)據(jù)進(jìn)行處理:調(diào)用strstr函數(shù)在緩沖區(qū)中尋找數(shù)據(jù)幀的位置:如果找到,則返回數(shù)據(jù)幀的首地址,并賦給字符串指針變量dwFind-Address;如果沒找到,則返回0。
所述步驟2-1串口初始化操作的具體步驟如下:
步驟2-1-1:使用Win32 API函數(shù)CreateFile打開串口;
步驟2-1-2:進(jìn)行串口配置;
步驟2-1-3:進(jìn)行超時參數(shù)的設(shè)置;
步驟2-1-4:進(jìn)行串口緩沖區(qū)的設(shè)置。
所述步驟2-1-2進(jìn)行串口配置過程中,先用GetCommState檢索端口的當(dāng)前設(shè)置修改其中的部分字段,然后再用函數(shù)SetCommState進(jìn)行端口設(shè)定。
有益效果:
本發(fā)明方法首先分析了GPS導(dǎo)航數(shù)據(jù)的格式及在智能導(dǎo)游系統(tǒng)中需要的關(guān)鍵數(shù)據(jù)。然后提取GPS導(dǎo)航數(shù)據(jù)的串口操作及緩沖區(qū)的設(shè)置。最后給出了GPS串口通信及其定位導(dǎo)航數(shù)據(jù)提取模塊的實現(xiàn)方法,為智能導(dǎo)游系統(tǒng)的GPS導(dǎo)航提供精準(zhǔn)的數(shù)據(jù)支持。本方法可以將GPS定位導(dǎo)航信息從GPS接收機(jī)完整接收,通過定位參數(shù)的提取,可將其應(yīng)用于其他高層應(yīng)用決策如智能導(dǎo)游系統(tǒng)及各種導(dǎo)航定位系統(tǒng)等。
附圖說明
圖1是本發(fā)明具體實施方式的緩沖區(qū)大小影響提取定位數(shù)據(jù)命中率的情況;
圖2是本發(fā)明具體實施方式的智能導(dǎo)游系統(tǒng)中GPS定位導(dǎo)航數(shù)據(jù)的提取方法流程圖。
具體實施方式
下面結(jié)合附圖對本發(fā)明的具體實施方式做詳細(xì)說明。
一種智能導(dǎo)游系統(tǒng)中GPS定位導(dǎo)航數(shù)據(jù)的提取方法,包括以下步驟:
步驟1:定義GPS定位導(dǎo)航數(shù)據(jù)格式:采用NEMA0183格式,主要由幀頭、幀尾和幀內(nèi)數(shù)據(jù)組成;根據(jù)數(shù)據(jù)幀的不同,幀頭也不相同;
GPS利用導(dǎo)航衛(wèi)星進(jìn)行測時和測距,以構(gòu)成全球定位系統(tǒng)。這一系統(tǒng)由空間星座、地面監(jiān)控系統(tǒng)、用戶接收機(jī)三大部分組成。用戶通過接收機(jī)接收GPS衛(wèi)星信號,經(jīng)信號處理而獲得三維位置、航向和時間等信息,進(jìn)而實現(xiàn)利用GPS進(jìn)行導(dǎo)航和定位的目的。
GPS定位導(dǎo)航數(shù)據(jù)格式常采用NEMA0183格式,數(shù)據(jù)內(nèi)容較少,因此多用RS-232串口將定位信息從GPS接收機(jī)傳送到數(shù)據(jù)處理模塊中進(jìn)行信息提取處理。GPS定位導(dǎo)航數(shù)據(jù)主要由幀頭、幀尾和幀內(nèi)數(shù)據(jù)組成。根據(jù)數(shù)據(jù)幀的不同,幀頭也不相同,主要有"$GPGGA"、"$GPGSA"、"$ GPGSV"以及"$GPRMC"等。在智能導(dǎo)游系統(tǒng)中,定位數(shù)據(jù)主要有經(jīng)緯度、海拔高度等。這些數(shù)據(jù)可以從"$GPGGA"幀中獲取得到,該幀的結(jié)構(gòu)及各字段標(biāo)記如下: $GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh
本方法所需要的數(shù)據(jù)是"$GPGGA"的<2>、<4>、<9>。<2>、<4>是定位的基本數(shù)據(jù)。<9>是相對于海平面的高度,當(dāng)景區(qū)是非平坦的地域時,它可以標(biāo)識游客所處位置相對于海平面的高度。
步驟2:GPS定位導(dǎo)航數(shù)據(jù)的接收:通過RS-232串口將定位信息從GPS接收機(jī)獲取,包括經(jīng)緯度、海拔高度;
步驟2-1:串口初始化操作;
由于GPS定位信息內(nèi)容較少,因此多用RS-232串口將定位信(NEMA0183語句)從GPS接收機(jī)傳送到計算機(jī)中進(jìn)行信息提取處理。從串口讀取數(shù)據(jù)有多種方法,比如直接使用 Win32 API函數(shù)對其進(jìn)行編程處理。在Windows下不允許直接對硬件端口進(jìn)行控制操作,所有的端口均被視為"文件",因此在對串口進(jìn)行偵聽之前需要通過打開文件來打開串口,并對其進(jìn)行相關(guān)參數(shù)配置。串口設(shè)置一般為:1 bit開始位,8 bit數(shù)據(jù)位,1 bit結(jié)束位,沒有奇偶校驗,波特率參考設(shè)備說明書。
步驟2-1-1:使用Win32 API函數(shù)CreateFile打開串口;
使用Win32 API函數(shù)CreateFile打開串口。與其他對象一樣,通信端口也是用句柄來標(biāo)識的。CreateFile函數(shù)返回被操作的通信端口句柄,如果串口被成功打開時,則返回其句柄,否則返回INVALID_HANDLE_ VALUE。
步驟2-1-2:進(jìn)行串口配置;
當(dāng)調(diào)用CreateFile成功打開串口之后,接下來就要進(jìn)行串口配置了。函數(shù)GetCommState和SetCommState可用于檢索和設(shè)定端口設(shè)置的DCB(設(shè)備控制塊)結(jié)構(gòu)。該結(jié)構(gòu)中BaudRate、ByteSize、StopBits和Parity為串口波特率、數(shù)據(jù)位數(shù)、停止位和奇偶校驗控制等信息??上扔肎etCommState檢索端口的當(dāng)前設(shè)置修改其中的部分字段,然后再用函數(shù)SetCommState進(jìn)行端口設(shè)定。
步驟2-1-3:進(jìn)行超時參數(shù)的設(shè)置;
成功設(shè)置完端口參數(shù)后,就要進(jìn)行超時參數(shù)的設(shè)置。通過GetCommTime-outs函數(shù)得到系統(tǒng)默認(rèn)的超時參數(shù),進(jìn)行適當(dāng)配置,然后用SetCommTime-outs函數(shù)進(jìn)行重設(shè)超時參數(shù)。
步驟2-1-4:進(jìn)行串口緩沖區(qū)的設(shè)置。
串口初始化,還要進(jìn)行串口緩沖區(qū)的設(shè)置。調(diào)用SetupComm(HANDLE hFile, DWORD dwInQueue, DWORD dwOutQueue)函數(shù),其中第一個參數(shù)是打開串口的句柄,第二個參數(shù)是輸入緩沖區(qū)大小,第三個是輸出緩沖區(qū)大小。
步驟2-2:GPS定位導(dǎo)航數(shù)據(jù)的接收:采用輪詢串口方式或事件觸發(fā)方式對GPS定位信息進(jìn)行接收;
在成功打開并設(shè)置串口后,可采用輪詢串口方式或事件觸發(fā)方式對GPS數(shù)據(jù)進(jìn)行接收處理。采用事件觸發(fā)方式效率比較高,調(diào)用SetCommMask函數(shù)設(shè)置串口事件。本實施方式設(shè)為EV_RXCHAR事件觸發(fā)方式,當(dāng)串口有字符到達(dá)時就會啟動ReadFile函數(shù)完成對GPS定位信息的接收。ReadFile函數(shù)負(fù)責(zé)將串口緩沖區(qū)中的數(shù)據(jù)讀到緩存。
經(jīng)過多次實驗統(tǒng)計,發(fā)現(xiàn)在處理接收GPS定位數(shù)據(jù)時有一種更合適的方法:將緩沖區(qū)lpBuffer的大小和讀到緩沖區(qū)的字節(jié)數(shù)目設(shè)為相同的固定值。這個值的大小影響直接影響了內(nèi)存的占用率,間接影響了提取定位數(shù)據(jù)的命中率。
當(dāng)程序剛開始運行時,由于GPS模塊正在初始化,還不會有數(shù)據(jù)發(fā)送到串口上,所以當(dāng)采用后新方法時,到緩沖區(qū)讀數(shù)據(jù)會讀不到結(jié)果;當(dāng)采用普通方法時,COMSTAT的屬性cbInQue值為0,所以在緩沖區(qū)中不會讀空。隨著時間增加,GPS設(shè)備已經(jīng)完全初始化,采用新方法就幾乎不會出現(xiàn)到緩沖區(qū)中讀空的現(xiàn)象;由于硬件設(shè)備或一些不可預(yù)測的原因,會導(dǎo)致出錯率增加,但是只能增加到某個值。
如果將第二個參數(shù)lpBuffer緩沖區(qū)設(shè)得足夠大,將會提高提取定位數(shù)據(jù)的命中率,使得每次總能在緩沖區(qū)中尋找到所需定位數(shù)據(jù),但是這同樣會浪費內(nèi)存。如果將lpBuffer緩沖區(qū)設(shè)得非常小,雖然節(jié)省了內(nèi)存,但是卻降低了提取定位數(shù)據(jù)的命中率,使得每次在緩沖區(qū)中找不到所需定位數(shù)據(jù)的概率大大增加。圖1說明了緩沖區(qū)大小影響提取定位數(shù)據(jù)命中率的情況,Y軸綜合考慮提取定位數(shù)據(jù)的命中率和內(nèi)存占用率,X軸代表lpBuffer緩沖區(qū)的大小。通過我們多次實驗統(tǒng)計,得出當(dāng)緩沖區(qū)的大小越接近482字節(jié)時,提取定位數(shù)據(jù)的命中率越高。但是考慮到計算機(jī)的二進(jìn)制特性,所以將緩沖區(qū)的大小設(shè)為512字節(jié)。
步驟3:GPS定位導(dǎo)航數(shù)據(jù)的處理;
從串口接收到的數(shù)據(jù)并將被放置于緩存, 在沒有進(jìn)一步處理之前緩存中是一長串字節(jié)流, 這些信息在沒有經(jīng)過分類提取之前是無法加以利用的。因此, 必須通過將各個字段的信息從緩存字節(jié)流中提取出來,將其轉(zhuǎn)化成有實際意義的, 可供高層決策使用的定位信息數(shù)據(jù)。 本方法所需要的經(jīng)緯度、海拔高度信息可以從“$GPGGA”結(jié)構(gòu)幀中獲得??紤]到“$GPGGA”結(jié)構(gòu)幀中,海拔高度之前的數(shù)據(jù)格式長度是固定的,本文提出一種新的提取經(jīng)緯度和海拔高度的方法。這種提取方法效率比較高并且簡潔。
步驟3-1:從串口接收到的數(shù)據(jù)并將被放置于緩存;
步驟3-2:開辟一個緩沖區(qū),調(diào)用ReadFile函數(shù)將串口緩存中的GPS定位導(dǎo)航數(shù)據(jù)讀到該緩沖區(qū)中;
步驟3-3:對所述緩沖區(qū)中的數(shù)據(jù)進(jìn)行處理:調(diào)用strstr函數(shù)在緩沖區(qū)中尋找數(shù)據(jù)幀的位置:如果找到,則返回數(shù)據(jù)幀的首地址,并賦給字符串指針變量dwFind-Address;如果沒找到,則返回0。