2010-07-04 15 views
16

Sto scrivendo un'app in Google Android 2.1 che deve sapere in quale direzione (n/w/s/e) il dispositivo (HTC Hero) è rivolto. Il sensore e il suo ascoltatore funzionano alla grande, ma i valori che ottengo dal sensore sono totalmente schifosi. per esempio. mi dice che sarei rivolto a nord quando il dispositivo è rivolto a SW o così ...come calibrare il sensore di orientamento in Android?

Questo sembra essere un problema noto con i dispositivi Android. Le "soluzioni" che ho trovato sul look web come questo:

  • scuotere il dispositivo intorno
  • mossa il dispositivo come un rubinetto otto
  • sui dispositivi di nuovo

Questo è pensato per innescare la ricalibrazione dei sensori. E: la cosa con lo "spostamento" funziona per me ... ma non è molto professionale, immagino ...

così - come faccio a far scattare la ricalibrazione del sensore di orientamento dall'SDK? Ho bisogno che il sensore sia calibrato correttamente senza alcuna fantasia che possa far sembrare gli utenti idioti completi mentre stanno "manualmente" ricalibrando i loro telefoni ...

C'è un modo per fare questo "giusto"?

EDIT:

Oppure: esiste un modo per determinare a livello di codice, se il dispositivo è correttamente calibrato o no? Come opzione di fallback, per così dire ... potrei avvertire l'utente che il dispositivo necessita di una ricalibratura "manuale".

+1

una volta che vedo un'applicazione bussola sul mercato. questa applicazione fornisce un messaggio se la trazione del campo magnetico è negativa. Non so come funziona, quindi sono interessato a questa risposta o – Michel

risposta

3

Non credo che ci sia un modo per sapere in modo programmatico se il sensore della bussola è calibrato correttamente a meno che non si usi una fonte dati secondaria come il GPS. Se è possibile utilizzare il GPS, quando l'utente è in movimento è possibile confrontare il movimento GPS con la direzione della bussola e correggere. Ricorda che i campi magnetici locali possono rovinare le letture della bussola e che i dispositivi non hanno idea se sei nel mezzo di una foresta o vicino a un trasformatore.

Con questi micro dispositivi c'è sempre un po 'di skew che dovrete affrontare. Se controlli i valori dell'accelerometro vedrai che a riposo non restituiscono sempre 9,8 m/s^2 (o almeno in modo coerente tra i dispositivi).

Nel tuo aiuto potresti dover semplicemente dire all'utente di ruotare/ruotare il telefono nella figura otto per reimpostare la bussola.

+0

grazie per la tua risposta, ma purtroppo non posso usare gps all'interno di questa app. problema è, ho avuto il mio eroe htc restituendomi totale senza senso per tutto il tempo fino a quando non ottengo che ricalibrare il suo sensore. Ho davvero bisogno di sapere come attivare questo da sdk/ndk ... – xenonite

+1

C'è un forum in cui hanno menzionato alcune istruzioni di shell per forzare i sensori a scrivere un nuovo file di impostazioni, ma richiede l'uso del comando su, il che significa che tu potrebbe non essere in grado di usarlo in una normale versione di Android ... a parte questo, è possibile aprire una shell tramite Java e digitare quei comandi, anche se è necessario un riavvio perché diventi effettivo, supponendo che funzioni comunque. È possibile controllare il collegamento qui: http://forum.xda-developers.com/showpost.php?p=4081673&postcount=4885 –

+0

Il metodo di calibrazione GPS funzionerà solo se si richiede all'utente di puntare il telefono nella direzione di movimento, giusto? O mi sta sfuggendo qualcosa? – MatrixFrog

-3

Questi sono alcuni movimentatori orientamenti u possibile utilizzare

Costanti int ORIENTATION_UNKNOWN restituito dal onOrientationChanged quando l'orientamento del dispositivo non può essere determinato (tipicamente quando il dispositivo è in una stretta posizione piatta). Costruttori pubblici OrientationEventListener (contesto contesto) Crea un nuovo OrientationEventListener. OrientationEventListener (contesto contesto, velocità int) Crea un nuovo OrientationEventListener. Metodi pubblici booleano canDetectOrientation() void disable() Disabilita OrientationEventListener. enable void() Abilita OrientationEventListener in modo da monitorare il sensore e chiamare onOrientationChanged (int) quando l'orientamento del dispositivo cambia. abstract void onOrientationChanged (int orientamento) Chiamato quando l'orientamento del dispositivo è cambiato. [Espandi] Metodi ereditati Dalla classe java.lang.Object clone oggetto() Crea e restituisce una copia di questo oggetto. uguale booleano (oggetto o) Confronta questa istanza con l'oggetto specificato e indica se sono uguali. void finalize() Viene chiamato prima che la memoria dell'oggetto venga recuperata dalla VM. final Class getClass() Restituisce l'istanza univoca di Class che rappresenta la classe di questo oggetto. int hashCode() Restituisce un codice hash intero per questo oggetto. final void notify() Fa sì che un thread che sta aspettando sul monitor di questo oggetto (chiamando uno dei metodi wait()) sia risvegliato. final void notifyAll() Fa sì che tutti i thread che stanno aspettando sul monitor di questo oggetto (chiamando uno dei metodi wait()) vengano riattivati. String toString() Restituisce una stringa contenente una descrizione concisa, leggibile dall'uomo di questo oggetto. final void wait (long millis, int nanos) Fa in modo che il thread chiamante attenda fino a quando un altro thread chiama il metodo notify() o notifyAll() di questo oggetto o fino alla scadenza del timeout specificato. final void wait (long millis) Fa in modo che il thread chiamante attenda fino a quando un altro thread chiama il metodo notify() o notifyAll() di questo oggetto o fino alla scadenza del timeout specificato. final void wait() Fa in modo che il thread chiamante attenda fino a quando un altro thread chiama il metodo notify() o notifyAll() di questo oggetto. Costanti public static int ORIENTATION_UNKNOWN finale Dal: API Livello 3

restituito dal onOrientationChanged quando l'orientamento del dispositivo non può essere determinato (tipicamente quando il dispositivo è in una stretta posizione piatta). Vedere anche

* onOrientationChanged(int) 

Costante Valore: -1 (0xffffffff) costruttori pubblici OrientationEventListener pubblico (contesto Context) dal: Livello API 3

di creare un nuovo OrientationEventListener. Parametri contesto per OrientationEventListener. public OrientationEventListener (contesto contesto, tasso int) Da: API Livello 3

Crea un nuovo OrientationEventListener. Parametri contesto per OrientationEventListener. frequenza con cui vengono elaborati gli eventi del sensore (vedere anche SensorManager). Utilizza il valore predefinito di SENSOR_DELAY_NORMAL per il rilevamento del cambio dell'orientamento dello schermo. Metodi pubblici pubblico canDetectOrientation booleana() Dal: Livello API 3

pubblico disabilita void() Dal: Livello API 3

Disabilita l'OrientationEventListener. public void abilitazione() Dal: Livello 3 API

abilita l'OrientationEventListener viene predisposto per monitorare il sensore e chiamare onOrientationChanged (int) quando cambia l'orientamento del dispositivo. vuoto astratto pubblico onOrientationChanged (orientamento int) Da: API Livello 3

Chiamato quando l'orientamento del dispositivo è cambiato. il parametro di orientamento è in gradi, compreso tra 0 e 359. l'orientamento è 0 gradi quando il dispositivo è orientato nella sua posizione naturale, 90 gradi quando il suo lato sinistro è in alto, 180 gradi quando è capovolto e 270 gradi quando è il lato destro è verso l'alto. ORIENTATION_UNKNOWN viene restituito quando il dispositivo è vicino al piano e l'orientamento non può essere determinato.

+6

http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks – MatrixFrog

+0

Non è utile copiare e incollare la documentazione non corretta dell'API. Un esempio sarebbe più apprezzabile. – Spindizzy

0

Suppongo che tu ti stia riferendo al Magnetometro all'interno dell'Eroe.

La calibrazione è dura e richiede sempre l'interazione dell'utente per una calibrazione effettiva. Ci sono strategie separate per affrontarlo. Potresti chiedere agli utenti di tenere il dispositivo lì in direzione nord e poi ricallibrare. Se gli utenti non sanno dove è il nord, puoi chiedere loro di dirigere il dispositivo verso il sole e in base alla posizione e al tempo puoi calcolare dove si trova.

Lasciando da parte il callibration, direi che il tuo problema è che le letture che ottieni dal sensore sono imprecise. Naturalmente la calibrazione è un prerequisito per letture accurate, ma ci sono anche altri fattori in gioco.

È pratica comune integrare i dati del sensore di un sensore con i dati di un sensore diverso per aumentare la precisione. È possibile utilizzare il GPS per determinare un'intestazione quando l'utente è in movimento. Tuttavia, se si muove lentamente, anche questo è inaccurato. È possibile integrare i dati riportati dall'Accelerometro per indovinare i cambiamenti di orientamento (non l'orientamento assoluto). Ma onestamente un Girometro sarebbe più ideale in questo caso.

sistemi che funzionano come questo sono talvolta chiamati Inertial Navigation Systems (INS) perché possono, dato un punto fisso nello spazio, determinare la loro successiva posizione relativa e l'orientamento con precisione senza ulteriori dati esterni. L'uso di un filtro di Kalman è una pratica comune per recallibrare il sistema di volta in volta quando è disponibile una posizione assoluta (ad esempio recuperata tramite GPS).

Anche se non è realistico implementare un INS completo, è possibile trarre alcune idee da come funzionano per rendere più accurate le letture di orientamento.

Problemi correlati