基于随机定时接收位置坐标的计算速度

时间:2013-04-02 13:50:00

标签: c# algorithm gps

我正在编写一个需要知道你旅行速度的应用程序。我的应用程序与几个设备进行对话,所有设备都配有不同的内置GPS接收器。我正在使用的硬件报告速度快,我使用该参数。但在某些情况下,我的硬件不会报告速度,只是纬度和经度。

在这种情况下我一直在做的是标记我收到第一个坐标的时间,然后等待另一个坐标进入。然后我计算行进的距离并除以经过的时间。

我遇到的问题是一些硬件报告位置很快(每秒5-10次),而一些报告位置缓慢(每秒0.5次)。当我快速接收GPS位置时,由于GPS接收器固有的不准确性,我的算法无法准确计算速度。顺便说一句,由于GPS的不准确性,位置会自然地移动,并且由于从最后一个接收位置开始的经过时间跨度很小,我的算法认为我们已经在很短的时间内移动了 - 这意味着我们要快速(在现实我们可能会静止不动。)

如何平均速度以避免此问题?似乎这个过程必须根据点的速度来自适应。例如,如果我只是平均收集的最后5个点来进行速度计算,它可能对“快速”报告单位很有用,但它会损害了我对“慢”报告单位的准确性。

有什么想法吗?

5 个答案:

答案 0 :(得分:1)

我将平均速度超过最后X秒。我们选择X = 3。对于快速记者而言,这意味着将您的速度平均为大约20个数据点。对于你的慢速记者,这可能只能获得6个数据点。这应该保持相当均匀的准确性。

答案 1 :(得分:1)

您可能有一个现有的数据点结构来从中提取linq查询?

根据我们需要考虑负向量的说明,并且考虑已知的误差幅度的建议是一个更复杂的例子:

class GPS
{
    List<GPSData> recentData;
    TimeSpan speedCalcZone = new TimeSpan(100000);
    decimal acceptableError = .5m;

    double CalcAverageSpeed(GPSData newestPoint)
    {
        var vectors = (from point in recentData
                       where point.timestamp > DateTime.Now - speedCalcZone
                       where newestPoint.VectorErrorMargin(point) < acceptableError
                       select new
                       {
                           xVector = newestPoint.XVector(point),
                           yVector = newestPoint.YVector(point)
                       });
        var averageXVector = (from vector in vectors
                              select vector.xVector).Average();
        var averageYVector = (from vector in vectors
                              select vector.yVector).Average();
        var averagedSpeed = Math.Sqrt(Math.Pow(averageXVector, 2) + Math.Pow(averageYVector, 2));

        return averagedSpeed;
    }
}

但正如评论中指出的那样,没有一种神奇的算法,你必须根据自己的情况和需要进行调整。

答案 2 :(得分:1)

我尝试使用过去X秒的平均POSITION。

这应该“平均”与高频位置输入相关的随机噪声....这应该产生更好的速度计算。

(显然你会使用“平均”位置来计算你的速度)

答案 3 :(得分:1)

使用简单的过滤器:

只有在离最后一个位置超过10米的位置才能占据位置。

然后计算lastGood和thisGood之间的距离,并除以timeDiff。

如果GPS最嘈杂,你还想忽略5km / h以下的所有速度。

您还可以通过计算最后一个和此之间的方向进行优化,如果它保持稳定,则可以进行优化。这有助于过滤。

答案 4 :(得分:0)

您正在寻找一种可能不存在的理想算法,其原因很简单:您无法在没有任何数据的情况下发明数据,有时甚至无法确定数据何处结束且错误开始。

话虽如此,有些方法可以减少“噪音”,因为你已经发现平均连续5次测量,我会补充说你可以扔掉“异常值”并选择最接近5的3中的3个每个-其他

这里的问题是对你的情况最有效(或可接受的好)。如果你跟踪卡车在非洲大陆上行驶,几英里/小时的速度无关紧要,因为错误会自行消除,但如果你跟踪一架在建筑物之间移动的飞行无人机,差异可能非常大。

以下是一些更多的想法,您可以选择并选择您可以走多远,我假设卡车情况,并且想法是在您没有准确读数时获得最可能的速度: - 放弃“不太可能”的速度 - 高层建筑可以反射GPS信号,当你走路时会导致超过100英里每小时的速度,拥有“高速公路地图”(见下文)可以帮助管理截止值 - 使用误差范围而不是点值传输,存储和计算(某些GPS报告误差范围)。 - 保持每个位置的平均误差 - 保持每个报告设备的平均错误 - 保持每个位置的平均速度,你最终会有一张高速公路与其他道路的地图 - 您可以关联位置速度方向