2016-06-01 85 views
1

我從C++的半球GPS單元獲取數據以進行一些後期處理。我正在使用a serial library與本機通信。您只能訂閱此GPS單元的數據。您可以從20Hz,10Hz,5Hz,...到最多5秒鐘內接收您的位置範圍。我以前使用串口通信的經驗是發送命令並等待響應。我有兩個問題。使用GPS進行串行通信 - 連續數據傳輸

我遇到的第一個問題是,在我移動GPS時以及它報告已移動(大約3-5秒)之間似乎存在延遲。有沒有一種類似隊列的緩衝區正在被填滿?所以當我靜止的時候,靜止的位置填滿隊列,當我移動幾米遠時,靜止的位置仍然被報告。如果是這樣,我怎麼能刪除這個緩衝區,所以我只得到最新的數據?

第二個問題是,我得到的結果,兩個結果合併在一起,或件取出。這裏是原始數據,我得到的一個樣本:

$GPGLL,5804.7646091,N,11407.8367957,W,035009.40,A,D*7C 
$GPGLL,5804.7646449,N,11407.8368155,W,035009.50,A,D*79 
$GPGLL,5804.7646737,N,11407.8368444,W,035009.60,A,D*75 
$GPGLL,5804.7647076,N,11407.8368787,W,035009.70,A,D*7B 
$GPGLL,5804.7647484,N,11407.8368970,W,035009.80,A,D*7B 
$GPGLL,5804.7647751,N,11407.8369257,W,035009.90,A,D*7E 
$GPGLL,5804.7648048,N,1.7650578,N,11407.8372036,W,035010.80,A,D*77 //bad data 
$GPGLL,5804.7650880,N,11407.8372280,W,035010.90,A,D*73 
$GPGLL,5804.7651175,N,11407.8372626,W,035011.00,A,D*71 
$GPGLL,5804.7651413,N,11407.8372992,W,035011.10,A,D*75 
$GPGLL,5804.7651673,N,11407.8373189,W,035011.20,A,D*71 
$GP,N,11407.8374179,W,035012.90,A,D*72 //bad data 
$GPGLL,5804.7652561,N,11407.8374194,W,035013.00,A,D*79 
$GPGLL,5804.7652545,N,11407.8374191,W,035013.10,A,D*7B 
$GPGLL,5804.7652553,N,11407.8374223,W,035013.20,A,D*75 
$GPGLL,5804.7652543,N,11407.8374190,W,035013.30,A,D*7E 
$GPGLL,580407.8374360,W,035015.00,A,D*76 //bad data 
$GPGLL,5804.7652603,N,11407.8374404,W,035015.10,A,D*75 
$GPGLL,5804.7652625,N,11407.8374373,W,035015.20,A,D*75 
$GPGLL,5804.7652647,N,11407.8374386,W,035015.30,A,D*7A 
$GPGLL,5804.7652668,N,11407.8374359,W,035015.40,A,D*72 
$GPGLL,5804.76526W,035017.10,A,D*7F //bad data 
$GPGLL,5804.7652684,N,11407.8374404,W,035017.20,A,D*7B 

這裏是我如何閱讀它的代碼片段:

int baudrate = 9600; 
serial::bytesize_t databits = serial::eightbits; 
serial::parity_t parity = serial::parity_none; 
serial::stopbits_t stopbits = serial::stopbits_one; 
serial::flowcontrol_t flowcontrol = serial::flowcontrol_none; 
Serial* serialObj = new serial::Serial(ss.str(), baudrate, serial::Timeout(), 
         databits, parity, stopbits, flowcontrol); 

while (true) 
{ 
    std::string rawData = serialObj->readline(); 
    std::cout << rawData << std::endl; 
    //decode and do other processing - takes about 0.5 seconds 
} 

我試着用申購費率打轉轉,但它似乎仍然有相同的結果。任何想法可能會干擾通信?

注意:數據訂閱是使用製造商提供的安裝工具完成的。

回答

1

這裏的問題看起來不像一個C++問題,而是一個GPS系統。我不知道你使用GPS系統的經驗,但這裏可能會發生幾件事情:

我遇到的第一個問題是,當我移動GPS時,它報告它已經移動(約3-5秒)。

說明:通常,GPS滯後......如果你是靜止的,它聽起來就像是你,GPS有一個10-30米,甚至高達100米或更高的誤差區,從中心位置。 GPS在移動時最準確。因此,如果接收器正在從一個固定點移動到另一個,它必須:

  1. 檢測到它擺在首位,這是很難的接收器從一個固定點到另一個接近檢測移動。
  2. 重新計算它的位置,這很大程度上取決於環境,如果測試是在城市或建築物附近進行的,則尤其是。如果接收者計算出它在幾乎默認爲multipath的環境中的位置,這使得它尤其更糟糕。

所以在接收機更新它的位置之前,它很可能需要3-5秒,並且在那之前它會發送最後一個已知的最佳位置,這是原始位置。 (這就是GPS漂移發生在汽車中的原因;在靜止的時候,GPS失去了方向並開始偏離其實際位置。谷歌和蘋果的地圖試圖通過固定GPS點來減少這一點,當智能手機檢測到靜止移動時,這一點變得更加容易,因爲智能手機中的GPS是GPS,這意味着GPS接收器通過蜂窩技術和智能手機諸如陀螺儀,加速度計,磁力計和重力傳感器之類的板載傳感器(或之前被HEAT映射的已知WiFi接入點,其是當GPS座標與MAC地址和信號環境相關聯時,例如Google地圖用其地圖車輛和室內地圖),它可以比一個謹慎的GPS傳感器系統更容易和更快速地檢測移動;即使是非常昂貴的。)

第二個問題是,我得到的結果,兩個結果合併在一起或件取出。

錯誤數據是由許多原因造成的,通常是由計算錯誤:

  1. 電磁干擾,例如是靠近電源,車輛,或其它(即,任何)發射器。
  2. 來自一個或多個GPS衛星的不完整數據。這種情況發生在靠近高層建築物的地方,尤其是很多,或者如果有懸垂物。即使地平線附近的衛星也可能造成這種情況,因爲地球本身會阻塞一條清晰的信號路徑。
  3. 或者,通常骯髒的嫌疑犯,一個不安全的信號電纜。

大多數接收者通常會「拋出」不良數據,選擇解決方案輪詢最高位置。雖然它在原始數據中可見,但位置不受影響。

看起來代碼沒有什麼不對,但是GPS傳感器表現得像它應該那樣 - 這通常是不完美的,沒有昂貴的精確計時單位和昂貴的數字羅盤;並且這些在沒有來自外部傳感器的增強的情況下檢測運動仍然很慢,並且在靜止時表現出一定程度的預期不精確性。

+0

GPS裝置安裝在車輪上的編碼器(用於檢測旋轉)和加速度計。從一個快速谷歌我發現[卡爾曼過濾器](http://stackoverflow.com/questions/1134579/smooth-gps-data)已被用來估計錯誤。你會建議使用這兩個其他位的信息,以及卡爾曼濾波器來獲得更好的結果嗎? – McAngus

+0

是的,這是一個很好的建議,可以提供更好的位置結果。 – NonCreature0714