Sto avendo un problema davvero fastidioso con una visualizzazione AR che agisce come una bussola. Quindi quando tengo il telefono in verticale (in modo che lo schermo sia puntato al mio viso), chiamo il remapCoordinateSystem
che il pitch è 0 quando lo reggi ritratto. Quindi l'azimut (funzionalità bussola) è perfetto, ma non appena inclino il telefono l'azimut viene rovinato, se mi piego in avanti l'azimut aumenta e se mi piego all'indietro diminuisce.Android getOrientation Azimuth viene inquinato quando il telefono è inclinato
Io uso 2 sensori per ottenere le letture, Sensor.TYPE_MAGNETIC_FIELD
e Sensor.TYPE_GRAVITY
.
Io uso un filtro passa basso che è piuttosto semplice, è implementato con una costante alpha e viene utilizzato direttamente sui valori letti dai sensori.
Ecco il mio codice:
float[] rotationMatrix = new float[9];
SensorManager.getRotationMatrix(rotationMatrix, null, gravitymeterValues,
magnetometerValues);
float[] remappedRotationMatrix = new float[9];
SensorManager.remapCoordinateSystem(rotationMatrix, SensorManager.AXIS_X,
SensorManager.AXIS_Z, remappedRotationMatrix);
float results[] = new float[3];
SensorManager.getOrientation(remappedRotationMatrix, results);
float azimuth = (float) (results[0] * 180/Math.PI);
if (azimuth < 0) {
azimuth += 360;
}
float pitch = (float) (results[1] * 180/Math.PI);
float roll = (float) (results[2] * 180/Math.PI);
Come si vede non c'è nessuna magia qui. Chiamo questo pezzo di codice quando GravitymeterValues e il magnetometroValues sono pronti per essere usati.
La mia domanda è: come posso impedire all'azimut di impazzire quando inclino il telefono?
Ho controllato un'applicazione gratuita su Google Play Store, Compass e non ha risolto questo problema, ma spero che ci sia una soluzione.
ho 2 soluzioni in mente:
rendere la visualizzazione AR funzionano solo in angoli di beccheggio molto constrainted, in questo momento ho qualcosa di simile
pitch >= -5 && pitch <= 30
. Se questo non viene completato, all'utente viene visualizzata una schermata che gli chiede di ruotare il telefono in verticale.In qualche modo utilizzare il pitch per sopprimere l'azimuth, questa però sembra una soluzione piuttosto specifica per il dispositivo, ma ovviamente sono aperto a suggerimenti.
Posso anche aggiungere che ho cercato per un paio d'ore per una soluzione decente e non ho trovato alcun che mi ha dato tutte le soluzioni migliori rispetto a 2) qui.
Grazie in anticipo!
ciò che si fa filtro passa-basso? Non è necessario filtrare quando si utilizza TYPE_GRAVITY. –
@HoanNguyen Devo passare in basso il 'Sensor.TYPE_MAGNETIC_FIELD'? Ora ho passato sia "Sensor.TYPE_MAGNETIC_FIELD' che" Sensor.TYPE_GRAVITY ". –
No, l'uso del filtro passa-basso serve a rimuovere l'accelerazione nella direzione x an. GetRotationMatrix richiedeva che il terzo parametro fosse approssimativamente l'accelerazione nella sola direzione z.Se utilizzi TYPE_GRAVItY non è necessario il filtro passa-basso, ma molti dispositivi non hanno TYPE_GRAVITY, quindi è necessario utilizzare TYPE_ACCELEROMETER e il filtro passa-basso per i dispositivi che non dispongono di TYPE_GRAVITY. –