我从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