2013-01-07 435 views
5

我有下面的代碼下面,這似乎是做工精細:Android的GPS座標散

// GPS Reader 
    // Criteria 
    Criteria criteria = new Criteria(); 
    //criteria.setAccuracy(Criteria.ACCURACY_COARSE); // Used when we can't get a GPS Fix 
    criteria.setAccuracy(Criteria.ACCURACY_FINE); // Used when we can get a GPS Fix 

    criteria.setAltitudeRequired(false); 
    criteria.setBearingRequired(false); 
    criteria.setCostAllowed(true); 
    criteria.setPowerRequirement(Criteria.POWER_LOW); 

    LocationListener locationListener = new MyLocationListener(); 
    LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    lm.requestLocationUpdates(lm.getBestProvider(criteria, true), 0, 0, 
      locationListener); 

然而,當我繪製我已經收集了谷歌地圖數據,GPS座標都非常在某些情況下散落,或者它將沿着我正在散步的路線前進,然後突然跳到一英里遠的地方然後回來。有沒有什麼辦法解決這一問題?我猜測某種精度檢查?

更新

基本上我的問題是這樣的一個例子 - GPS Jitter

更新2

我認爲不使這個賞金,但我想我還不如完全理解這裏發生的事情,看看我的方法是否過於殺人。我仍然有同樣的問題,即使我的座標具有3m的精度等等,我的座標仍然存在抖動。現在這可能是可用的衛星等。我不知道,但基本上我試圖瞭解是所有這些其他應用程序,尤其是練習應用程序,能夠在相同的情況下獲得如此平穩的讀數。

我當時在Quora,並能找到這個Does any running app have a feature of filtering GPS data to get more accurate tracking?不幸的是,除了你可以使用卡爾曼濾波器,如果你想要的話,它並沒有給我很多洞察力,但肯定必須有不那麼複雜的方法,因爲我懷疑大多數應用程序都在實施這個。

無論如何,如果一個開發人員願意分享他們正在做的一些僞代碼,將不勝感激。我的意思是,如果我卡爾曼卡住了,但我確定必須更容易實現算法,並且希望能夠學習那些以及如何實施它們,這些都是合適的。

上下文:這是一個移動步行應用程序。

我試圖從 Create a smooth curve from a series of GPS coordinates Smooth gps data蒐集信息相關的SO問題:這是一個良好的開端,但我不知道我需要實現正確得到最小二乘法擬合工作適當有啥僞我將有一個樣條GPS數據,然後我可以查看類似谷歌地圖的東西,以確認我做得正確。我認爲問題在於,如果這是我正在處理的一般X和Y數據,而不是GEO的座標,我可以在matlab中寫一些東西進行測試,然後繼續。

更新3

我recieving https://www.dropbox.com/s/ilsf8snao2no65e/gpsdata2.png

守則搞砸了GPS數據的圖像 https://gist.github.com/4505688

+2

你的能量需求和準確性似乎是相互矛盾的。爲ACCURACY_FINE提供結果的唯一提供者是LocationManager.GPS_PROVIDER。爲什麼不直接使用它,而不是像這樣創建一些條件:locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,MyLocationListener)? –

+2

此外,它可能是分散的,因爲設備不在露天/其他原因導致延遲修復接收。 –

+0

好的,我會回到那個 - 因爲我原來是這樣設置的,但是認爲標準會更好,明天再試。在開闊的天空 - 我在開闊的天空區域,在運行測試時 - 但是當我運行像mapmywalk這樣的程序時,並沒有散射。 – eWizardII

回答

4

你所得到的是因爲你的標準確定最佳供應商爲NETWORK_PROVIDER。 哪一個不能識別你的位置,而是給你的手機信號塔的位置,其範圍覆蓋你的設備。所以當你在任何建築物外時,最好使用GPS_PROVIDER來獲得精確的地理位置精度。爲什麼你分散座標是因爲你的設備來到另一個單元塔的範圍,因此發生位置跳躍。直接使用GPS_PROVIDER是您將獲得的最佳解決方案。

+0

我應該補充一點,感謝來自Nitin的建議,我僅使用GPS實現,如下所示: // GPS閱讀器 LocationListener locationListener = new MyLocationListener(); LocationManager lm =(LocationManager)getSystemService(Context.LOCATION_SERVICE); lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0, locationListener); 但問題仍然存在。 – eWizardII

+0

感謝您的洞察力,不幸的是,由於考試不是我的SO問題之上,但基本上從這個提示一些提示,http://stackoverflow.com/questions/6181704/good-way-of-getting-the-用戶位置在Android中,我仔細研究了另一個程序實現https://github.com/marcfasel/LocationMapper。我相信這個問題是因爲我正在使用其他類來處理位置管理器,我沒有像他們那樣做這個類就重新實現了它,而且一切似乎都很順利。現在需要優化電池壽命。多謝你們! :) – eWizardII

+0

非常感謝。簡單而好的解釋。解決了我的直接問題。我開始考慮用Kalman和blahblahblah重新過濾傳入數據,最後只是位置數據提供者選擇問題。大! – cedbeu

2

檢查this Reto Meier的文章(包括代碼)。它應該給你很多信息來思考。您至少應設置最小距離和時間參數。

lm.requestLocationUpdates(lm.getBestProvider(criteria, true), 5000, 20, 
     locationListener); 

此外,您可以結合幾個提供商,以獲得您可以在此刻的最佳座標。祝你好運!

+0

我會再次嘗試標準設置並查看收益率。 – eWizardII

+0

我實施了你的建議,我仍然遇到GPS散射問題 - 請參閱以下圖像 - https://www.dropbox.com/s/ilsf8snao2no65e/gpsdata2.png藍色路徑是真正的路徑 - 但紅色是什麼GPS記錄。 – eWizardII

+0

這個座標的準確性怎麼樣?你能不能把它畫出來?你可以給我發郵件給你,如果你願意的話,我想我會幫你解決這個問題。 – Evos

5

GPS數據本身很容易出錯。即使您已經正確設置了所有LocationManager(並且看起來像您這樣做),您也會看到位置中偶爾會出現抖動。

精度

有一點要注意的是,GPS的精確度只給你一個估計的計算是如何給好接收信號的GPS。系統誤差會給你一個很好的準確性數字(< 10m),但仍然代表一個很大的位置誤差。這就是爲什麼即使你的精度非常好,你也會看到抖動。精度測量很好地消除了非常大的錯誤(> 100m),但是在較低的水平上它只是給你一個表明計算收斂的指示。

過濾

過濾,像許多事情,是最好的,如果你做的儘可能少。精度過濾器應該能夠消除較大的錯誤,如果最終達到一個良好的閾值,您可能會獲得流暢的數據。

如果您對正在運行的應用的位置更改設置閾值,您也可能會獲得一些好處。例如,跑步者只能隨着時間的推移覆蓋一定的距離,並通過設置上限(Usain Bolt Cutoff),您應該能夠消除不良分。問題是,如果你的第一點是錯誤,你最終刪除所有其他點。

卡爾曼濾波

卡爾曼濾波器是一個很好的解決方案,我已經實現了它在我的工作的導航應用。結果非常合理,甚至可以在GPS不好或不可用的情況下進行有限的航位推算。不幸的是我不能分享源代碼,但如果你決定這樣做,我可以給你一點指導。最好的結果來自6個DoF濾波器,您可以計算加速度和速度,並使用它來估計位置。這不是最簡單的解決方案,但我們從中看到了很好的結果。

最小二乘

卡爾曼濾波器是偉大的,因爲它可以實時用於過濾的位置。它跟蹤自己的狀態,不需要存儲舊的位置。但另一方面,如果您想要後續處理您的路線,最小二乘擬合是最佳路線。 (卡爾曼來自LSQ公式)。我不做很多後處理,但我懷疑我可以挖掘一些舊的教科書。但理論應該是一樣的。

大多數GPS設備都非常好,而且從我看過的所有測試中,我經常看不到您在示例中看到的抖動。然而,我實施卡爾曼濾波器的一大優點和原因在於您的行駛距離和速度計算準確得多

+0

「問題是,如果你的第一點是錯誤,你最終將刪除所有其他點。」經典問題,一直讓我瘋狂 –

2

一種簡單的方法是丟棄任何舊的或不準確的數據並保持經度平均值和緯度。

private static final long WILDLY_OUT = 15; 
private static final long TOO_OLD = 30000; 
private static final long NO_SAMPLES = 5; 

double lastLocationTime; 

double calclongitude(Location location, double oldLongitude) { 
    double newLongitude = oldLongitude; 

    if (location.getAccuracy() < WILDLY_OUT) { 
     newLongitude = (NO_SAMPLES * oldLongitude + location 
       .getLongitude())/(NO_SAMPLES + 1); 
     lastLocationTime = System.currentTimeMillis(); 
    } 

    if (lastLocationTime > TOO_OLD) { 
     newLongitude = location.getLongitude(); 
    } 

    return newLongitude; 
} 

而緯度也是這樣。