2011-10-24 6 views
17

la mia applicazione Android mostra la direzione di un luogo particolare nel mondo e quindi ha bisogno di ottenere il grado di bussola.
Questo è il codice che ho usato per calcolare i gradi:Come realizzare una bussola accurata su Android

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

Questo metodo di solito funziona, ma a volte si ottiene solo il nord sbagliato, che cosa devo fare per ottenere una posizione più precisa?

+0

Questa sarebbe una buona domanda da aggiungere alla nuova http://area51.stackexchange.com/proposals/102228/virtual-and-augmented-reality proposta di StackExchange. – SashaZd

risposta

33

Ho un paio di suggerimenti per voi:

1) Il dispositivo non può essere tarato. Per farlo, spostalo in una forma di 8 (see this). In caso contrario, se il dispositivo è calibrato o non eseguire alcuni test, puntare il dispositivo verso una direzione nota del punto cardinale e confrontare i valori. In genere, se un dispositivo non è calibrato, vedrai grandi variazioni nel valore di azimuth per piccole rotazioni. Questo è ciò di cui sarei preoccupato.

Ora, non dimenticare che il sensore fornisce il rilevamento del Nord magnetico e non del Nord vero! Questa differenza è nota come declinazione del campo magnetico e il suo valore cambia da luogo a luogo e di volta in volta a causa di cambiamenti nel campo magnetico terrestre. This app può calcolare alcuni dei valori per te con relativa precisione. Non sarei troppo preoccupato di questo perché la declinazione è in genere piccola, ma potresti cercare una buona precisione (dove vivo la declinazione è 3º, attualmente).

2) Stare lontano da oggetti metallici o cose che generano un forte campo magnetico. Ad esempio, non eseguire test se hai il telefono vicino al computer o qualsiasi tastiera fisica! Questo è puro veleno per testare la bussola-geolocalizzazione. Alcuni apps possono misurare l'intensità del campo magnetico (se il dispositivo lo supporta). Quando ti avvicini alle cose di metallo, sperimenterai valori più alti e forti cambiamenti nelle direzioni. Per il divertimento, ci sono anche alcuni "metal detectors": questa app riconosce i cambiamenti nel campo magnetico e vibra quando si è vicini "oggetti metallici" o cose che interferiscono magneticamente con il dispositivo.

3) Ricordarsi di aggiornare il rilevamento quando si inclina il dispositivo in modalità orizzontale. (article is a must read!) Questo perché il valore dell'azimut si basa sulla rotazione dell'asse perpendicolare al piano del telefono. Quando si ruota il dispositivo in orizzontale, questo valore viene modificato di +/- 90º! Questo problema non viene risolto disabilitando la modalità panorama dell'applicazione! Dovrai determinarlo programmaticamente analizzando le rotazioni attorno agli altri due assi (intonazione e rollio). Questo non è banale, ma ci sono alcuni esempi da qualche parte nella rete.

edit: Se siete interessati a un certo codice, check out Mixare, è una fonte aumentata quadro realtà aperta sotto la GPL3 per Android. Dai un'occhiata al loro codice riguardante l'orientamento, la geolocalizzazione della bussola e il rilevamento.

PS: Non ho alcun tipo di connessione con i creatori delle applicazioni citate.

+1

1) C'è un modo per dire all'utente che il dispositivo non è calibrato?2) C'è un modo per sapere quando c'è interferenza magnetica? 3) Ho disabilitato la modalità orizzontale, quindi non me ne devo preoccupare, giusto? – eladrich

+0

Ho aggiornato la risposta. Spero di aver risposto ad alcune delle tue domande – MobileCushion

+0

@MobileCushion risposta molto bella, grazie mille – RiadSaadi