与GPS的串行通信 - 连续数据传输

时间:2016-06-01 05:23:17

标签: c++ gps serial-port

我从C ++的Hemisphere GPS单元获取数据进行一些后期处理。我正在使用a serial library与该单位进行通信。您只能订阅此GPS装置的数据。您可以获得的位置范围从20Hz,10Hz,5Hz,......到最多5秒。我之前使用串行通信的经验是发送命令并等待响应。我有两个问题。

我遇到的第一个问题是,当我移动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 个答案:

答案 0 :(得分:3)

这里的问题看起来不像是C ++问题,而是GPS系统问题。我不了解您使用GPS系统的经验,但可能会发生一些事情:

  

我遇到的第一个问题是,当我移动GPS和报告它已经移动(大约3-5秒)之间似乎存在延迟。

说明: 通常情况下,GPS不准确。 如果你是静止的,听起来就像你一样,GPS的误区大约为10距离中心位置-30米,甚至高达100米或更远。此外,GPS在移动时最准确。

但是,如果将接收器从一个静止点移动到另一个静止点,则获得良好信号变得更加困难,因为它必须:

  1. 检测到它首先移动,这是难以,接收器可以从一个静止点到另一个静止点进行检测。
  2. 然后重新计算其位置,这在很大程度上取决于环境,如果在城市或建筑物附近进行测试,尤其。如果接收者在几乎默认为multipath环境的情况下计算它的位置,则会更加糟糕。
  3. 因此接收器很可能在更新其位置之前需要3-5秒,而直到然后它将发送其最后已知的最佳位置,这是原始位置(现在甚至更少)准确)。

    旁注:这就是为什么GPS漂移发生在汽车中;当静止时,GPS失去方向并开始偏离其实际位置.Google和Apple地图试图通过“修复”来减少这种情况(一个更好的词是“粘贴”,但通俗地讲,它正在修复。)智能手机检测静止运动时的GPS点;这个过程变得更容易,因为智能手机中的GPS enhanced GPS - 这意味着GPS接收器通过蜂窝技术以及智能手机的板载传感器(例如陀螺仪,加速度计,磁力计和重力传感器)进行增强。(或者也称为先前HEAT映射的WiFi接入点,即GPS坐标与MAC地址和信号环境相关联,就像谷歌地图与其地图车辆和室内地图一样。)几乎所有各种集成传感器都可以比谨慎的GPS传感器系统更容易,更快速地检测到移动(或缺失) ;甚至非常昂贵sive one。

      

    第二个问题是我得到的结果,两个结果合并在一起或者取出。

    错误的数据是由多种原因引起的,通常是错误的计算,原因是:

    1. 电磁干扰,例如靠近电源,车辆或其他(即任何)发射器。
    2. 来自一颗或多颗GPS卫星的数据不完整。这种情况发生在高层建筑附近,特别是很多,或者如果有悬垂。即使是地平线附近的卫星也可能导致这种情况,因为地球本身阻挡了一条清晰的信号路径。
    3. 通常的嫌疑人 不安全的信号线
    4. 大多数接收者通常会“抛出”不良数据,选择解决方案轮询由滚动平均值确定的最高位置。虽然原始数据中显示“错误数据”,但位置不受影响

      看起来您使用的图书馆的代码没有任何问题,但GPS传感器的行为应该是 ,这通常是不完美的 ,而且没有非常昂贵的精度时序单元与非常昂贵的数字罗盘等相结合;如果没有来自众多外部传感器的增强功能,这些仍然很难检测到移动,并且肯定会在静止时表现出一定程度的预期不精确性