2011-11-16 81 views
2

因此,这是应用程序中跟踪您的位置(例如跑步或周期锻炼)的常见问题。GPS路线长度估计,考虑位置的不确定性

很明显,GPS导航仪的麻烦较少,因为他们可以假设你在路上的一个点上 - 但是,如果你在公园跑步,捕捉到一些道路网格会给你完全疯狂的数字。

问题据我所知,它是将两个航点之间的大圆距离结合起来,但考虑到误差(准确度值),这样您就不会偏离航线以避免低精度点。我头脑中的粗略实现包括绘制一些贝塞尔曲线(使用速度/方位角来添加样条方向和重量)并对其进行积分。

但是,很明显这是人们以前所清楚的。任何人都知道这些实现,或者他们都被埋在专有软件中?

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

最终的实现将在JavaScript或Python中,以较快者为准(我使用SL4A),但我在这里寻找一般算法。

回答

2

为了让每个人都开始使用,以下是朴素的算法,不使用任何速度或方位信息。

圆弧长度s可以通过标准公式从我们开始的线段的两个(长,纬度)对(开始和结束路标)计算出来。

假设我们(因此使用用于位置0 phi[0]phi[1]和1这里阵列)弧度转换的值对成标准球面坐标phitheta,电弧长度刚好:

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

我们需要的是一些更细致的路径近似,只弯曲显示的不准确的点类型的路径不在位置,而不是完全分散它,并大量增加距离估计—在提问我希望找出所有现有的实现(可能)如何做!