GPS路线长度估算,占位置的不确定性

时间:2011-11-16 12:33:23

标签: android ios gps

因此,这是在旅程中跟踪您的位置的应用程序中的常见问题(例如,跑步或骑行训练)。

显然,GPS导航仪的麻烦较少,因为它们可以假设你在道路上的某个点上蹦蹦跳跳 - 然而,如果你在公园里跑步,那么捕捉到一些道路网格会给你完全疯狂的数字。

我认为问题在于结合航点之间的大圆距离,但考虑到误差(准确度值),这样你就不会因为低精度点而偏离太远。我头脑中的粗略实现包括绘制一些贝塞尔曲线(使用点处的速度/方位来增加样条方向和重量)并在其上积分。

然而,显然这是人们之前所做的事情。任何人都知道这些实现,还是全都隐藏在专有软件中?

奖励积分适用于任何人也可以使用(大部分)不太准确的手机信号塔点(具有不同/不同步时间戳,没有速度或方位信息)。

最终的实现将在javascript或python中,以较快者为准(我正在使用SL4A),但我在这里寻找通用算法。

1 个答案:

答案 0 :(得分:2)

为了让每个人都开始,这里是天真的算法,不使用任何速度或方位信息。

弧长s可以通过标准公式从我们开始的段的两个(长,纬度)对(起点和终点航点)计算。

假设我们已将值对转换为标准球面坐标phitheta(此处为数组,因此对于位置0和1使用phi[0]phi[1]以弧度为单位,弧长只是:

from math import sin, cos, arccos, sqrt

s = arccos(
  sin(phi[0]) * sin(phi[1]) * cos(theta[0] - theta[1]) + 
  cos(phi[0]) * cos(phi[1])
)

然而,由于我们有一个巨大的可怕功能,我们需要使用链式规则来计算出第一个错误,我们得到delta_s的以下怪物:

delta_s = (1.0 / abs(sin(s))) * (
  delta_phi[0] * abs(
    sin(phi[0]) * cos(phi[1]) -
    cos(phi[0]) * sin(phi[1]) * cos(theta[0] - theta[1])
  ) +
  delta_phi[1] * abs(
    sin(phi[1]) * cos(phi[0]) -
    cos(phi[1]) * sin(phi[0]) * cos(theta[0] - theta[1])
  ) +
  (delta_theta[0] + delta_theta[1]) * abs(
    sin(phi[0]) * sin(phi[1]) * sin(theta[0] - theta[1])
  )
)

我们按顺序对每对连续点执行此操作,求和s s,正常添加误差:

accumulator = 0.0
for error in errors:
  accumulator += error * error

journey_error = sqrt(accumulator)

因此,我们知道垃圾距离估算的不确定性。 (如果我们在最后添加几个点,我们甚至可以保持accumulator以加速计算 - 正如我们在实践中可以使用实时数据。)

然而,这将给我们带来巨大的错误,而且只是对我们实际走了多远的一个非常模糊的想法。这不可能是实际的GPS设备估算距离的方式,因为除非它始终具有惊人的信号,否则它将永远不够准确:

Rubbish approximation to the path

我们需要的是一些更细微的路径近似,它只会使所显示的不准确点类型的路径偏离路径,而不是完全转移它并大量增加距离估计 - 在询问我希望找到的问题时了解所有现有的实现(可能)如何做到这一点!