2012-06-23 10 views
5

Testuję aplikację na Androida, która rejestruje lokalizację (lat/długo/alt). Używam aplikacji na telefonie Samsung GTS5830 z systemem Android 2.2.1Czy wysokość GPS systemu Android jest niepoprawna z powodu braku wysokości geoidy?

Tu i tam czytam, że wysokość GPS jest często niepoprawna, ponieważ ziemia nie jest idealnie sferyczna. W mojej lokalizacji na przykład the geoid's height ma 52 metry.

Rozumiem, że wysokość ta zostanie odjęta od "czystej" wysokości GPS. To miałoby sens dla mojej lokalizacji jako:

- altitude from GPS phone: 535 m 
- geoid altitude: 52 m 
- altitude from phone's GPS minus geoid height: 482m 

- correct atlitude: 478 m 

482 jest wystarczająco blisko, aby prawdziwe dla mnie śledzić elewację podczas wędrówek

  1. Czy powyższy wzór wysokości GPS minus wysokość geoidy jest poprawna ?
  2. Czy słusznie zakładam, że Android nie uwzględnia wysokości geoidy podczas zwracania wysokości GPS?
  3. Jeśli powyższe stwierdzenie jest prawdziwe, czy dotyczy wszystkich wersji Androida?

Oto kod używam aby uzyskać współrzędne GPS:

public class HelloAndroid extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     Log.d("main", "onCreate"); 
     setupGps(); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 

    LocationListener locationListener; 
    LocationManager lm; 

    void setupGps() { 
     Log.d("gps", "Setting up GPS..."); 
     locationListener = new MyLocationListener(); 
     lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 20000, 5, 
       locationListener); 

     Log.d("gps", 
       "GPS supports altitude: " 
         + lm.getProvider(LocationManager.GPS_PROVIDER) 
           .supportsAltitude()); 
     Log.d("gps", "Finished setting up GPS."); 
    } 

    static class MyLocationListener implements LocationListener { 

     public void onLocationChanged(Location location) { 
      Log.d("gps", "long: " + location.getLongitude() + ", lat: " 
        + location.getLatitude() + ", alt: " 
        + location.getAltitude()); 
     } 
    } 
} 

Odpowiedz

6

Odpowiedzi na wszystkie trzy pytania są twierdzące.

Wysokość, jaką uzyskuje się z GPS, to wysokość nad elipsoidą WGS84 w metrach, która jest przybliżeniem powierzchni Ziemi. Wiem o tym, ponieważ opracowuję oprogramowanie Android, aby z niego korzystać.

Należy zastosować korektę, aby przekonwertować figurę na wysokość powyżej średniego poziomu morza lub wysokości, jak zwykle wiadomo. Zauważ, że może to różnić się od wysokości zadeklarowanej przez zestaw wysokościomierza do aktualnego ciśnienia na średnim poziomie morza, ponieważ wysokościomierz faktycznie mierzy ciśnienie powietrza, ale ciśnienie powietrza nie jest tylko funkcją wysokości; Jest to również funkcja gęstości i temperatury powietrza, więc wysokościomierz pokazuje przybliżenie. Ten efekt nie jest widoczny w przypadku GPS.

Model grawitacyjny Ziemi 2008 (EGM2008) mapuje różnicę średniego poziomu morza z elipsoidą w funkcji długości i szerokości geograficznej. Szczegóły tutaj:

http://earth-info.nga.mil/GandG/wgs84/gravitymod/egm2008/egm08_wgs84.html

Mniej dokładny model, który wykorzystuje mniej danych zwanych EGM96 jest również dostępna. Google oba te, aby lepiej je zrozumieć.

+0

Odpowiedzi na wszystkie trzy pytania są również twierdzące. – davtom

+0

umieść ten komentarz w swojej odpowiedzi, a oznaczy to jako zaakceptowaną odpowiedź. –

+0

Zrobiłem to, dzięki. – davtom

4

Błędy w wysokości nie może być dobrze w dół do GPS i geoidy separacji wysokościowej.

Wartość wysokości zwracana przez dowolny odbiornik GPS jest zawsze najmniej dokładną wartością. Często widziałem, że mój biurowiec donosi, że porusza się na wysokości od -200 do + 750 metrów. Jednym z podstawowych powodów jest to, że niemożliwe jest równomierne rozłożenie satelitów w kierunku wysokości; oni zawsze będą nad tobą, a jeśli będzie jakieś zaciemnienie nieba na niskich wysokościach, będą one umieszczone w stożku nad tobą. W kierunkach X i Y zawsze, zakładając dobry widok nieba, satelity będą się rozprzestrzeniać w prawo i lewo; z przodu iz tyłu odbiornika. Rozprzestrzenianie się zwiększa dokładność rozwiązania pozycji.

+0

„-200 do +750 metrów”: nie wierzę, że na drugi odbiorniki GPS są tak nieprecyzyjne z wysokości, chyba że takie zmiany mieszczą się w dokładności pomiaru, ale nawet to brzmi nieprawdopodobne. –

+0

W przypadku anteny ściennej (zasłoniętej dla więcej niż 50% nieba), w określonych porach dnia, gdy widoczna konstelacja ma niekorzystną geometrię, i wykonanie zimnego startu (tj. Wrogie warunki pracy), są to typowe widziałem. Wartości te zostały zaobserwowane w przypadku SiRFStar-2, SiRFStar-3, Ublox 5 i Ublox 6. Ogólnie wysokość wciąga do +/- 75 metrów po kilku minutach ciągłej pracy. –

5

To nie dość, że proste - Android API ma albo zmienione lub ma błędów. Mam dwa urządzenia z Androidem - "ogólny" (Android 2.3.6) i Nexus 7 (Android 4.x).

W telefonie getAltitude() podaje odpowiedź zgodną z moją rzeczywistą wysokością AMSL (tj. Skorygowaną o geoid). Na Nexus 7 zwrócona wysokość jest nieskorygowana. Dokumentacja dla API nie określa, która jest zwrócona - więc w pewnym sensie obie są "poprawne".

Oba urządzenia wydają się mieć przyzwoite GPS modules - komunikat $GPGGA NMEA pokazuje zarówno poprawną zmianę, jak i korektę geoidy. Wygląda więc na to, że trzeba przeanalizować komunikaty, aby uzyskać prawidłową wysokość, a metoda getAltitude() jest niewiarygodna.