2011-10-24 13 views
17

Moja aplikacja na Androida pokazuje kierunek określonego miejsca na świecie i dlatego potrzebuje uzyskać stopień kompasu.
Jest to kod używam obliczyć stopnie:Jak wykonać dokładny kompas na Androidzie

public void getDirection() {   
    mySensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); 
    List<Sensor> mySensors = mySensorManager.getSensorList(Sensor.TYPE_ORIENTATION); 
    if(mySensors.size() > 0){ 
     mySensorManager.registerListener(mySensorEventListener, mySensors.get(0), SensorManager.SENSOR_DELAY_UI);   
    } 
    else{ 
     TextView alert = (TextView)findViewById(R.id.instruct); 
     alert.setText(getString(R.string.direction_not_found)); 
     myCompassView.setVisibility(myCompassView.INVISIBLE); 

    } 
} 
private SensorEventListener mySensorEventListener = new SensorEventListener(){ 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     // TODO Auto-generated method stub 
     compassBearing = (float)event.values[0]; 
     float bearing; 
     bearing = compassBearing - templeBearing; 
     if (bearing < 0) 
      bearing = 360 + bearing; 
     myCompassView.updateDirection(bearing); 
     } 
}; 

Metoda ta zazwyczaj działa, ale czasami po prostu dostaje złą północ, co mam zrobić, aby uzyskać bardziej dokładną lokalizację?

+0

To byłoby dobre pytanie, aby dodać nową propozycję StackExchange http://area51.stackexchange.com/proposals/102228/virtual-and-augmented-reality. – SashaZd

Odpowiedz

33

Mam kilka sugestii dla Ciebie:

1) Twojego urządzenia nie może być kalibrowany. Aby to zrobić, przenieś go w postaci 8 (see this). Jeśli nie, jeśli urządzenie jest skalibrowane lub nie wykonuje niektórych testów, kierując urządzenie w kierunku znanym kardynalnym punktem i porównuj wartości. Zazwyczaj, jeśli urządzenie nie jest skalibrowane, zobaczysz duże różnice w wartości azymutu dla małych obrotów. Właśnie o to bym się martwił.

Teraz nie zapominaj, że czujnik podaje namiar na północ magnetyczną, a nie na północ od północy! Różnica ta jest znana jako deklinacja pola magnetycznego i jego wartość zmienia się z miejsca na miejsce i od czasu do czasu ze względu na zmiany w polu magnetycznym Ziemi. This app może obliczyć niektóre wartości dla ciebie z względną dokładnością. Nie martwiłbym się tym zbytnio, ponieważ deklinacja jest zazwyczaj niewielka, ale możesz spodziewać się dobrej precyzji (gdzie obecnie żyje deklinacja to 3º, obecnie).

2) Trzymaj się z dala od metalowych przedmiotów lub przedmiotów generujących silne pole magnetyczne. Na przykład nie rób testów, jeśli masz telefon w pobliżu komputera lub fizycznych klawiatur! To czysta trucizna do testowania geolokalizacji kompasu. Niektóre apps mogą mierzyć natężenie pola magnetycznego (jeśli urządzenie je obsługuje). Kiedy zbliżysz się do metalowych rzeczy, doświadczasz wyższych wartości i silnych zmian w kierunkach. Dla przyjemności, są też pewne "metal detectors": ta aplikacja rozpoznaje zmiany w polu magnetycznym i wibruje, gdy jesteś blisko "przedmiotu metalowego" lub rzeczy, które magnetycznie ingerują w urządzenie.

3) Należy pamiętać o aktualizacji łożyska po przechyleniu urządzenia do trybu poziomego. (article is a must read!) Jest tak, ponieważ wartość azymutu opiera się na obrocie prostopadłej osi do płaszczyzny telefonu. Po obróceniu urządzenia do pozycji poziomej wartość ta zmienia się o +/- 90º! Nie można tego rozwiązać, wyłączając tryb krajobrazu aplikacji! Będziesz musiał określić programowo, analizując obroty wokół pozostałych dwóch osi (pitch and roll). To nie jest trywialne, ale jest kilka przykładów gdzieś w sieci.

edit: Jeżeli jesteś zainteresowany jakimś kodem, sprawdź Mixare, to jest open source rzeczywistość rozszerzona ramy pod GPL3 dla Androida. Przyjrzyj się ich kodowi dotyczącemu orientacji, geolokacji i orientacji kompasu.

PS: Nie mam żadnego połączenia z twórcami wspomnianych aplikacji.

+1

1) Czy istnieje sposób poinformowania użytkownika, że ​​urządzenie nie jest skalibrowane?2) Czy istnieje sposób, aby wiedzieć, kiedy występują zakłócenia magnetyczne? 3) Wyłączyłem tryb krajobrazu, więc nie martwię się o to, prawda? – eladrich

+0

Zaktualizowałem odpowiedź. Mam nadzieję, że odpowiedziałem na niektóre z twoich pytań. – MobileCushion

+0

@MobileCushion bardzo dobra odpowiedź, bardzo dziękuję – RiadSaadi