我從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
}
我試着用申購費率打轉轉,但它似乎仍然有相同的結果。任何想法可能會干擾通信?
注意:數據訂閱是使用製造商提供的安裝工具完成的。
GPS裝置安裝在車輪上的編碼器(用於檢測旋轉)和加速度計。從一個快速谷歌我發現[卡爾曼過濾器](http://stackoverflow.com/questions/1134579/smooth-gps-data)已被用來估計錯誤。你會建議使用這兩個其他位的信息,以及卡爾曼濾波器來獲得更好的結果嗎? – McAngus
是的,這是一個很好的建議,可以提供更好的位置結果。 – NonCreature0714