我正在编写一个应用程序,它需要知道您正在行驶的速度。我的应用程序与几个设备通信,每个设备都有不同的内置GPS接收器。当我使用的硬件报告速度时,我使用该参数。但在某些情况下,我的硬件不报告速度,只报告纬度和经度。
在这种情况下,我一直在做的是标记收到第一个坐标的时间,然后等待另一个坐标进入。然后,我计算了行驶的距离,并除以经过的时间。
我遇到的问题是一些硬件报告定位很快(每秒5-10次),而另一些报告定位很慢(每秒0.5次)。当我快速接收GPS位置时,由于GPS接收机固有的误差,我的算法无法准确计算速度。换句话说,由于GPS的不准确,位置会自然地移动,而且由于从最后接收到的位置经过的时间跨度很小,我的算法认为我们在短时间内移动了很远-这意味着我们正在快速移动(而实际上我们可能是静止不动的)。
我怎样才能平均速度来避免这个问题?似乎这个过程必须根据点数的速度进行自适应。例如,如果我简单地对收集的最后5个点进行平均来进行速度计算,这可能对“快速”报告单位很有效,但它会损害我对“慢”报告单位的准确性。
有什么想法吗?
发布于 2013-04-03 02:35:44
使用一个简单的过滤器:
只有当一个位置距离上次拍摄的位置超过10米时,才采取该位置。
然后计算lastGood和thisGood之间的距离,并除以timeDiff。
你还想忽略所有低于5 5km/h的速度,因为GPS是最嘈杂的。
你可以通过计算上一个和这个之间的方向来进一步优化,如果它保持稳定,你就接受它。这有助于过滤。
发布于 2013-04-02 22:03:17
我会平均过去X秒的速度。让我们选择X=3。对于你的快速记者来说,这意味着你的平均速度大约有20个数据点。对于慢吞吞的记者来说,这可能只会给你带来6个数据点。这应该会保持相当高的准确性,甚至是全面的。
发布于 2013-04-02 22:07:40
您可能已经有一个现有的数据点结构,可以从其中提取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;
}
}但正如评论中指出的那样,没有一个神奇的算法,你必须根据自己的情况和需求对其进行调整。
https://stackoverflow.com/questions/15765870
复制相似问题