与GPS的串行通信-连续数据传输 我从C++中的半球GPS单元获取数据,进行一些后处理。我用它来与单位沟通。您只能订阅此GPS装置的数据。您可以接收的频率范围为20Hz、10Hz、5Hz。。。最多5秒一次。我以前的串行通信经验是发送命令并等待响应。我有两个问题

与GPS的串行通信-连续数据传输 我从C++中的半球GPS单元获取数据,进行一些后处理。我用它来与单位沟通。您只能订阅此GPS装置的数据。您可以接收的频率范围为20Hz、10Hz、5Hz。。。最多5秒一次。我以前的串行通信经验是发送命令并等待响应。我有两个问题,c++,gps,serial-port,C++,Gps,Serial Port,我遇到的第一个问题是,在我移动GPS和它报告GPS已移动(约3-5秒)之间似乎存在延迟。是否会有某种类型的队列缓冲区被填满?因此,当我站着不动时,固定位置会填满队列,当我移动几米远时,固定位置仍会被报告。如果是这样的话,我如何删除这个缓冲区,以便只获取最新的数据 第二个问题是我得到的结果,两个结果被合并在一起或者被删除。以下是我获得的原始数据示例: $GPGLL,5804.7646091,N,11407.8367957,W,035009.40,A,D*7C $GPGLL,5804.7646449

我遇到的第一个问题是,在我移动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
}
int波特率=9600;
串行::字节大小\u t数据位=串行::八位;
串行::奇偶校验\u t奇偶校验=串行::奇偶校验\u无;
串行::停止位\u t停止位=串行::停止位\u一;
串行::流量控制\u t流量控制=串行::流量控制\u无;
Serial*serialObj=new Serial::Serial(ss.str(),波特率,Serial::Timeout(),
数据位、奇偶校验、停止位、流量控制);
while(true)
{
std::string rawData=serialObj->readline();

STD:CUT< P>这里的问题看起来不像是C++问题,而是GPS系统的问题。我不知道你的GPS系统的经验,但是它可能在这里发生了一些事情:

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

说明:一般来说,GPS是不精确的。如果你是静止的,听起来像是静止的,GPS的误差范围大约是距离中心位置10-30米,甚至高达100米或更多。此外,GPS在移动时最精确

然而,如果接收器从一个固定点移动到另一个固定点,则获得良好信号变得更加困难,因为它必须:

  • 检测它首先移动,这对于接收器来说很难检测到从一个固定点到另一个非常接近的固定点
  • 然后重新计算它的位置,这在很大程度上取决于环境,尤其是在城市或建筑物附近进行测试时。如果接收器计算它在几乎默认环境中的位置,情况会更糟
  • 因此,接收器很可能需要3-5秒才能更新其位置,直到,然后它将发送其最后已知的最佳位置,即原始位置(现在更不准确)

    (旁注:这就是GPS漂移发生在汽车中的原因;在汽车静止时,GPS失去方向并开始偏离其实际位置。谷歌和苹果地图试图通过“固定”来减少这种情况(更好的词是“固定”,但通俗地说,它是固定的。)智能手机检测到静止运动时的GPS点;由于智能手机中的GPS是GPS,这意味着GPS接收器通过蜂窝技术以及智能手机的车载传感器(如陀螺仪、加速度计、磁强计和重力传感器)得到增强,因此这一过程变得更加容易。(也可以是之前热映射的已知WiFi接入点,即GPS坐标与MAC地址和信号环境相关联,就像谷歌地图对其地图车辆和室内地图所做的那样。)几乎所有的集成传感器都可以检测移动(或缺失)比谨慎的GPS传感器系统更容易、更快速;即使是非常昂贵的系统。)

    第二个问题是我得到的结果,两个结果被合并在一起或者被删除

    错误数据是由多种原因造成的,通常是计算错误,原因如下:

  • 电磁干扰,例如靠近电源、车辆或其他(即任何)发射器
  • 来自一个或多个GPS卫星的不完整数据。这种情况发生在高层建筑附近,尤其是许多高层建筑附近,或者如果有悬垂物。即使是地平线附近的卫星也可能导致这种情况,因为地球本身阻挡了清晰的信号路径
  • 通常怀疑的未固定的信号电缆
  • 大多数接收者通常会“抛出”坏数据,选择解决方案轮询由滚动平均值确定的最高位置。虽然“坏数据”在原始数据中可见,但位置不受影响


    看起来你使用的库中的代码没有什么问题,但是GPS传感器的表现应该是不完美的,如果没有昂贵的精密计时装置和昂贵的数字罗盘等等,GPS传感器通常是不完美的;如果没有增强功能,它们仍然很难检测到移动通过大量外部传感器,在静止时肯定会表现出一定程度的预期不精确性

    GPS装置安装在车轮上带有编码器的车辆上(用于检测旋转)还有一个加速计。我从谷歌上快速找到了用于估计误差的信息。你建议使用这两个其他信息,再加上一个卡尔曼滤波器来获得更好的结果吗?是的,这是一个很好的建议,可以提供更好的定位结果。