2011-11-16 80 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

我們需要的是一些更細緻的路徑近似,只彎曲顯示的不準確的點類型的路徑不在位置,而不是完全分散它,並大量增加距離估計—在提問我希望找出所有現有的實現(可能)如何做!