3

我正在编写一个需要知道您行驶速度的应用程序。我的应用程序与几台设备通信,它们都带有不同的内置 GPS 接收器。在我使用的硬件报告速度的地方,我使用该参数。但在某些情况下,我的硬件不报告速度,只报告纬度和经度。

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

我遇到的问题是一些硬件报告定位很快(每秒 5-10 次),而一些报告定位缓慢(每秒 0.5 次)。当我快速接收 GPS 位置时,由于 GPS 接收器固有的不准确性,我的算法无法准确计算速度。换句话说,由于 GPS 不准确,位置自然会移动,并且由于从上次接收到的位置经过的时间跨度非常小,我的算法认为我们在很短的时间内移动了很远——这意味着我们走得很快(当现实我们可能停滞不前)。

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

有任何想法吗?

4

5 回答 5

1

我会平均最后 X 秒的速度。让我们选择 X=3。对于你的快速记者来说,这意味着用大约 20 个数据点来平均你的速度。对于你的慢速记者来说,这可能只会给你 6 个数据点。这应该保持准确度相当均匀。

于 2013-04-02T14:03:17.423 回答
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;
    }
}

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

于 2013-04-02T14:07:39.647 回答
1

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

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

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

于 2013-04-02T14:11:54.837 回答
1

使用一个简单的过滤器:

仅当距离上次采取的位置超过 10 米时才采取立场。

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

如果 GPS 噪音最大,您还想忽略 5 公里/小时以下的所有速度。

如果它保持稳定,您可以通过计算 last 和 this 之间的方向来进一步优化。这有助于过滤。

于 2013-04-02T18:35:43.503 回答
0

您正在寻找一种可能不存在的理想算法,原因很简单:您无法在没有数据的地方发明数据,有时您甚至无法分辨数据的结束位置和错误的开始位置。

话虽这么说,正如您通过平均 5 次连续测量发现的那样,有一些方法可以减少“噪音”,我还要补充一点,您可以丢弃“异常值”并选择 5 个彼此最接近的 3 个.

这里的问题是什么最适合您的情况(或可接受的好)。如果您正在跟踪在大陆上移动几英里/小时的卡车,因为错误会自行抵消,但如果您正在跟踪在建筑物之间移动的飞行无人机,则差异可能非常显着。

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

于 2013-04-02T14:29:28.593 回答