2014-11-02 15 views
5

Sto provando a controllare lo sterzo di un veicolo utilizzando la rotazione del dispositivo Android.Alternativa per TYPE_GAME_ROTATION_VECTOR

TYPE_GAME_ROTATION_VECTOR non è presente sul Samsung Galaxy S4 (in esecuzione 4.4.2 Android). . . Ho confermato che ricevendo l'elenco di tutti i sensori disponibili.

C'è un modo per scartare i dati del Magnetometro da TYPE_ROTATION_VECTOR?

TYPE_GAME_ROTATION_VECTOR è stessa un TYPE_ROTATION_VECTOR tranne l'ingresso magnetometro ignorata.

può che essere realizzato facendo fusione sensoriale per TYPE_GRAVITY e TYPE_GYROSCOPE?

Qualsiasi riferimento sarebbe apprezzato.

+0

questo non è esattamente una grande risposta, ma si potrebbe potenzialmente hardcode i valori del sensore TYPE_MAGNETIC e utilizzare SensorManager.getRotationMatrix() insieme a TYPE_ACCELEROMETER – Maurycy

+0

@Maurycy Questo è anche un modo per realizzare ciò che stavo cercando di fare. In qualche modo sono riuscito a lavorare usando solo il sensore ** TYPE_GRAVITY **. –

+0

Una soluzione migliore per il mio commento sarebbe in realtà solo utilizzare una matrice di identità ... fondamentalmente hardcode i 3 valori magnetici a 1 e utilizzare SensorManager.getRotationMatrix() – Maurycy

risposta

0

È possibile utilizzare una combinazione di accelerometro e giroscopio per rilevare la rotazione del dispositivo ("Gravità" è una fusione dei due in cui viene utilizzato il giroscopio per rendere i dati più uniformi e più reattivi).

Dai miei test, il sensore del vettore di rotazione del gioco è influenzato dai dati del campo magnetico (eventualmente indirettamente tramite l'eliminazione del bias del giroscopio), quindi dovresti trovare probabilmente un'altra soluzione (il mio test stava seguendo la rotazione mentre in una macchina rispetto a girando, il campo magnetico della macchina ha interferito con la rotazione: ho realizzato un video che confrontava i dati di rotazione del vettore con la semplice integrazione dell'uscita giroscopica here).

Se si va senza dati di campo magnetico, si avrà sempre deriva (accumulo lento di errore di rotazione nel piano orizzontale). La parte principale di ciò che devi fare è integrare i dati del giroscopio nel tempo (vedi il codice di Google sull'utilizzo dei dati del giroscopio per tenere traccia della rotazione here).

Per impedire la deriva verticale, è necessario utilizzare l'accelerometro per tenere traccia di dove la gravità è relativa al dispositivo e combinarla con i dati del giroscopio. Un modo comunemente suggerito per farlo è quello di usare un Kalman Filter, ma a seconda dell'applicazione, potrebbe essere inutilmente complicato, quindi suggerirei di usare il cosiddetto filtro complementare, che può essere descritto come fusione dei dati da un filtro passa basso segnale rumoroso, ma stabile (accelerometro) e un filtro passa alto su un segnale reattivo, ma alla deriva (giroscopio). Una grande risorsa su kalman e filtri complementari può essere trovata here.