代码之家  ›  专栏  ›  技术社区  ›  Corey Trager

我得到了一个纬度和经度的回调,如何才能最好地计算“当前速度”和其他派生值?

gps
  •  6
  • Corey Trager  · 技术社区  · 15 年前

    (我认为这个问题是独立于平台的,但我恰好在为NexusOne编码)。

    关于“当前速度”:我每秒都会收到一个回调,告诉我当前的纬度和经度是多少。我可以计算当前位置和上一个位置之间的距离,以便跟踪累积距离和累积时间。有了这个,我可以说整个行程的平均速度是多少。

    但是我如何计算当前的速度呢?我怀疑我需要使用最近的N个样本,对吗?我这样想对吗?对N来说什么是好的经验法则?有多少个样品,或者几秒钟前?

    关于“停止时间”:如果我只是站着不动,我仍然可以得到轻微不同的纬度和经度报告给我,对吗?所以,决定我不是真的在动,就意味着说“以前的x个位置都在y米之内”,对吗?我这样想对吗?X和Y的一个好经验法则是什么?

    即使是关于“距离”:我会理解它吗,因为我实际上是在抄近路?有没有一个算法或经验法则来决定我什么时候“转弯”,我应该加一点软糖?

    编辑:我道歉:我对浪费人们的时间和善意感到很难过,但遗憾的是,这个设备 给我速度。我认为这不是因为在模拟器中不是,但在真正的设备上是。谢谢大家。我仍然需要编写一些经验法则代码,但速度是最大的挑战。

    编辑:我收回道歉。在我最初的问题中,我写道距离也是一个派生值。如果我只是使用原始的GPS数据,我会因为不准确而夸大距离。我可能走直线,但原始的GPS纬度/经度会摆动,所以如果我通过测量点之间的距离计算总距离,我会夸大它。以下是一些与此问题相关的链接。

    Smooth GPS data
    http://www.cs.unc.edu/~welch/kalman/Levy1997/index.html
    How to intelligently degrade or smooth GIS data (simplifying polygons)?
    How to 'smooth' data and calculate line gradient?

    5 回复  |  直到 6 年前
        1
  •  1
  •   Thanos Papathanasiou    15 年前

    关于当前速度:大多数GPS设备都会自己向您发送这些信息

        2
  •  3
  •   Rik Heywood    15 年前

    记住位置的简短历史记录,后退几秒钟。5秒应该给你一个相当准确的结果,更新相当快…

    // delay is the time difference between the 2 samples you have
    delay = 5;   // 5 second delay
    
    // figure out how far along x and y we have moved since last time
    dx = newx - oldx;
    dy = newy - oldy;
    
    // distance travelled
    distance = sqrt(dx*dx + dy*dy);
    
    // find the speed. if the positions were measured in metres and the time in seconds
    // this will be the average speed in metres per second, over the last 5 seconds
    speed = distance / delay;
    

    在两个样本之间等待的时间越长(例如,如果您保留最后30个位置的样本并使用30秒的延迟),您的答案就越稳定(即,噪音越小),但响应速度变化的速度越慢。

    你为什么要添加这种延迟的东西?嗯,你手机里的GPS装置可能不太准确。如果你站着不动,它每秒返回的位置可能会有相当大的摆动。这种摇晃的噪音会让你看起来像是在房间里随意地奔跑,可能会导致你报告一个中等的高速,即使你根本不动。我列出的解决方案在你静止的时候不会真正有帮助,因为30秒前的结果和1秒前的位置一样错误。你真正需要做的是在一段时间内对位置进行平均,然后将其与稍早一点的平均位置进行比较。如。。。

    取10个位置样本,取其平均值。这是位置1。
    再取10个样品,取其平均值。这是位置2。
    使用上面代码的这两个位置来获得速度。

    同样,你可以采集的样本越多,你的位置就越精确和稳定,但这会使你的速度测量响应性降低。

        3
  •  2
  •   ima    15 年前

    你的方法不是真的错,而是天真的。这些任务有一个巨大的数学基础,这就不足为奇了。您可以得到比“平均最后n个值”更好的结果。

    首先,卡尔曼滤波器很容易实现和调整,一般来说,对于实际任务来说已经足够好了。

    另外,不要试图平滑或平均的GPS信号-GPS接收器本身就是这样做的。相反,基于车辆(或人类)的预期加速度进行过滤。

    最后,如果你能得到这个信息,瞬时速度可以通过频移计算出来。

        4
  •  1
  •   Ofir    15 年前

    关于“切角”,你总是可以近似一条曲线(使用样条曲线或用于真正的过度杀伤力回归),否则我认为你是在正确的轨道上。

    关于有多少个样本和静止不动,我将观察样本的偏差,而不是取一个常数n。

        5
  •  0
  •   Morfildur    15 年前

    当前速度是位置(现在)和位置(上一个)之间的差,因此要获得当前速度,只需要比较当前位置和最后一个位置。

    但是:由于这很容易受到时间/位置跟踪方面的小误差的影响,因此它不可靠,因此您必须对上一个位置进行平均。多少取决于用例,时间框架越长,速度“电流”越小,但越精确。