2013-01-07 16 views
5

Mam następujący kod poniżej którego wydaje się działać prawidłowo:Android Współrzędne GPS Rozproszone

// 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); 

Jednak, kiedy wykres danych zebrałem na mapie, współrzędne GPS są bardzo rozproszone w niektórych przypadkach, albo pójdzie ścieżką, którą idę, po prostu znajdę, a potem cały nagły skok do punktu oddalonego o milę, a potem z powrotem. Czy istnieje sposób, aby to naprawić? Jakiś rodzaj kontroli dokładności, jak sądzę?

Aktualizacja:

Zasadniczo mój problem wygląda tak jak na przykładzie - GPS Jitter

Update 2:

nie rozważał złożenie tego bounty, ale pomyślałem, że równie dobrze może uzyskaj pełne zrozumienie tego, co się tutaj dzieje, i zobacz, czy moje podejście może zabić. Wciąż mam ten sam problem, że moje współrzędne mają drganie w nich pomimo faktu, że mam dokładność 3m, itd. Teraz może to być dostępne satelity, itp. Nie wiem, ale w zasadzie próbuję zrozumieć, jak są wszystkie te inne aplikacje, szczególnie aplikacje do ćwiczeń, które są w stanie uzyskać tak płynne odczyty w tych samych okolicznościach.

Byłem na Quora i udało mi się znaleźć to Does any running app have a feature of filtering GPS data to get more accurate tracking? Niestety nie dało mi to wiele wglądu w mój problem, z wyjątkiem tego, że możesz użyć filtru Kalmana, jeśli chcesz, ale na pewno musi być mniej skomplikowany sposób, ponieważ wątpliwość większość aplikacji tam to wdraża.

W każdym razie, jeśli inny programista chciałby podzielić się tym, co robią z pseudokodami, które byłyby bardzo cenne. Mam na myśli to, że utknąłem z Kalmanem, ale jestem pewien, że muszą być łatwiejsze do wdrożenia algorytmy, i mam nadzieję, że się ich nauczę i jak je wdrożyć, to są przyzwoite dopasowania.

Kontekst: Jest to mobilna aplikacja dla pieszych.

Istotne SO pytania starałem się zebrać informacje od Create a smooth curve from a series of GPS coordinates Smooth gps data: To był dobry początek, choć nie jestem pewien co pseudokod byłyby potrzebne do wdrożenia właściwie dostać najmniejszych kwadratów zdolny do pracy odpowiednio tak że będę miał dane GPS splajnów, które będę mógł następnie przeglądać na mapach google, aby potwierdzić, że zrobiłem to poprawnie. Myślę, że problem polega na tym, że to były ogólne dane X i Y, z jakimi miałem do czynienia, a nie współrzędne GEO, mógłbym napisać coś w testach matlab i kontynuować.

Update 3

Wizerunek zawiedli danych GPS mam już otrzymywać https://www.dropbox.com/s/ilsf8snao2no65e/gpsdata2.png

kod https://gist.github.com/4505688

+2

Twoje wymagania dotyczące mocy i dokładności wydają się sprzeczne. Jedynym dostawcą, który zapewnia wyniki, jest ACCURACY_FINE LocationManager.GPS_PROVIDER. Dlaczego nie użyjesz go bezpośrednio, zamiast tworzyć takie kryteria: locationManager.requestLocationUpdates (LocationManager.GPS_PROVIDER, 0, 0, MyLocationListener)? –

+2

Ponadto może być rozpraszany, ponieważ urządzenie nie znajdowało się pod otwartym niebem/innymi przyczynami, które prowadzą do opóźnionego odbioru poprawki. –

+0

OK, powrócę do tego - ponieważ początkowo miałem to ustawione, ale myślałem, że kryteria będą lepsze i spróbuję ponownie jutro. Na kartce otwartego nieba - podczas testu byłem w rejonie otwartego nieba - ale kiedy uruchamiam program taki jak mapmywalk, nie ma rozpraszania. – eWizardII

Odpowiedz

4

Co otrzymujesz dlatego Twoje kryteria identyfikuje najlepszego dostawcę jako NETWORK_PROVIDER. Co nie identyfikuje twojej lokalizacji, ale zamiast tego podaje lokalizację wieży celnej, której zasięg obejmuje twoje urządzenie. Tak więc, gdy jesteś poza jakimkolwiek budynkiem, lepiej użyć GPS_PROVIDER, aby uzyskać dokładną dokładność lokalizacji geograficznych.Dlaczego rozproszona koordynacja jest spowodowana tym, że urządzenie znajduje się w zasięgu innej wieży komórkowej, stąd skok lokalizacji. Bezpośrednie użycie GPS_PROVIDER jest najlepszym rozwiązaniem, jakie kiedykolwiek otrzymasz.

+0

Powinienem dodać, że dzięki radzie Nitin zaimplementowałem używając GPS tylko w następujący sposób : // GPS Reader LokalizacjaListener locationListener = new MyLocationListener(); LocationManager lm = (LocationManager) getSystemService (Context.LOCATION_SERVICE); lm.requestLocationUpdates (LocationManager.GPS_PROVIDER, 0, 0, locationListener); Ale problem nadal występuje. – eWizardII

+0

Dzięki za wgląd, niestety nie byłem na szczycie moich pytań SO z powodu egzaminów, ale zasadniczo wziąłem pewne wskazówki z tego, http://stackoverflow.com/questions/6181704/good-way-of-getting-the- użytkownicy-lokalizacja-w-Androidzie i dokładnie przestudiowałem inne programy implementationhttps: //github.com/marcfasel/LocationMapper. Sądzę, że problem polegał na tym, że korzystałem z innej klasy do obsługi menedżera lokalizacji, ponownie zaimplementowałem to bez tej klasy w sposób, w jaki robią i wszystko działa dobrze. Teraz trzeba zoptymalizować czas pracy baterii. Dzięki chłopaki! :) – eWizardII

+0

Dziękuję bardzo. Proste i świetne wyjaśnienie. Naprawiono mój natychmiastowy problem. Zacząłem myśleć o ponownym filtrowaniu przychodzących danych za pomocą Kalmana i blahblahblaha, a na koniec był to tylko problem wyboru dostawcy danych lokalizacyjnych. Wspaniały! – cedbeu

2

Sprawdź this artykuł Reto Meier (kod w zestawie). Powinien dać ci wiele informacji do przemyślenia. Powinieneś przynajmniej ustawić minimalne parametry odległości i czasu.

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

Możesz także połączyć kilku dostawców, aby uzyskać najlepsze współrzędne, jakie możesz w tej chwili. Powodzenia!

+0

Spróbuję ponownie ustawić kryteria i zobaczyć, co to daje. – eWizardII

+0

Zaimplementowałem twoją radę i nadal napotykam problem rozpraszania GPS - patrz poniższy obraz - https://www.dropbox.com/s/ilsf8snao2no65e/gpsdata2.png niebieska ścieżka to prawdziwa ścieżka - ale czerwony jest tym, co GPS zalogowany. – eWizardII

+0

A co z dokładnością tych współrzędnych? Mógłbyś również narysować tę mapę? Mógłbyś wysłać mi swój skype, jeśli masz ochotę i myślę, że pomogę ci w tej sytuacji. – Evos

5

Same dane GPS jest podatna na błędy. Nawet jeśli wszystkie ustawienia LocationManager są ustawione poprawnie (i wygląda na to, że robisz), zauważycie sporadyczne fluktuacje w lokalizacjach.

Dokładność

Jedną rzeczą jest, aby pamiętać, że dokładność GPS daje tylko oszacowanie na to, jak dobre obliczenie nadano GPS odbieranych sygnałów. Błędy systematyczne mogą dać Ci dobrą dokładność (< 10m), ale nadal przedstawiają błąd dużej pozycji. To dlatego zauważysz wahania, nawet jeśli Twoja dokładność jest bardzo dobra. Dokładność pomiarów jest dobra, aby usunąć bardzo duże błędy (> 100 m), ale na niższym poziomie daje tylko wskazówkę, że obliczenia są zbieżne.

Filtrowanie

filtrujący jak wiele rzeczy, najlepiej jest, jeśli nie tak mało, jak to możliwe. Filtr dokładności powinien być w stanie usunąć duże błędy, a jeśli uzyskasz dobry próg, możesz uzyskać płynne dane.

Można również uzyskać pewne korzyści, jeśli można umieścić w pozycji zmienia próg do uruchamiania aplikacji. Na przykład biegacz może tylko pokonać pewną odległość w czasie i ustawiając górny próg (Usain Bolt Cutoff) powinieneś być w stanie usunąć złe punkty. Problem polega na tym, że jeśli twoim pierwszym punktem jest błąd, usuniesz wszystkie pozostałe punkty.

Kalman Filter

filtr Kalmana jest doskonałym rozwiązaniem i I wprowadziły go na aplikacji nawigacyjnej, że pracuję nad. Rezultaty są bardzo rozsądne, a nawet pozwalają na ograniczone naliczanie w przypadku, gdy GPS jest zły lub niedostępny. Niestety nie mogę udostępnić kodu źródłowego, ale mogę dać ci trochę wskazówek, jeśli zdecydujesz się pójść tą drogą. Najlepsze wyniki uzyskano z filtra 6 DoF, w którym obliczono przyspieszenie i prędkość, i wykorzystano do oszacowania pozycji. To nie jest najprostsze rozwiązanie, ale osiągnęliśmy z tego dobre wyniki.

najmniejszych kwadratów

filtr Kalmana jest wielki, ponieważ może on być stosowany w czasie rzeczywistym filtrowanie pozycji. Śledzi swój własny stan i nie trzeba przechowywać starych lokalizacji. Ale z drugiej strony, jeśli chcesz przetworzyć trasę, dopasowanie najmniejszych kwadratów to optymalna droga. (Kalman pochodzi od formuł LSQ). Nie zajmuję się dużo przetwarzaniem, ale podejrzewam, że mogę wykopać na nim stare podręczniki. Teoria powinna być jednak taka sama.

Większość urządzeń GPS są dość dobre, a ze wszystkich testów widziałem ja nie często zobaczyć jitter widzisz na swoim przykładzie.Jednak jedną dużą zaletą i powodem, dla którego zaimplementowałem filtr Kalmana, jest to, że pokonana odległość i obliczenia prędkości są znacznie dokładniejsze.

+0

"Problem polega na tym, że jeśli twoim pierwszym punktem jest błąd, usuniesz wszystkie pozostałe punkty." Klasyczny problem, doprowadzał mnie do szału –

2

Prostym podejściem jest wyrzucenie starych lub niedokładnych danych i utrzymanie średniej długości geograficznej i szerokość geograficzna.

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; 
} 

I zrób to samo dla szerokości geograficznej.

Powiązane problemy