2016-06-01 94 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