È da un po 'che cerco di capire i sensori di orientamento di Android. Pensavo di averlo capito. Poi ho capito di no. Ora penso (spero) di provare di nuovo una sensazione migliore, ma non sono ancora al 100%. Cercherò di spiegare la mia comprensione frammentaria e spero che le persone saranno in grado di correggermi se sbaglio in alcune parti o riempire gli spazi vuoti.
Immagino di trovarmi a 0 gradi di longitudine (primo meridiano) e 0 gradi di latitudine (equatore). Questa posizione è in realtà nel mare al largo della costa africana, ma abbi pazienza. Tengo il telefono davanti al viso in modo che la parte inferiore del telefono punti ai miei piedi; Sono rivolto a nord (guardando verso Greenwich) quindi il lato destro del telefono punta a est verso l'Africa. In questo orientamento (con riferimento al diagramma sottostante) ho l'asse X che punta a est, l'asse Z punta a sud e l'asse Y punta al cielo.
Ora i sensori sul telefono ti consentono di calcolare l'orientamento (non la posizione) del dispositivo in questa situazione. Questa parte mi ha sempre confuso, probabilmente perché volevo capire come funzionava qualcosa prima di accettare che funzionasse. Sembra che il telefono elabori il suo orientamento utilizzando una combinazione di due diverse tecniche.
Prima di arrivare a questo, immagina di essere di nuovo in piedi su quel pezzo di terra immaginario a 0 gradi di latitudine e longitudine nella direzione sopra menzionata. Immagina anche di essere bendato e le tue scarpe sono fissate alla rotonda di un parco giochi. Se qualcuno ti spinge nella schiena, cadrai in avanti (verso nord) e allungherai entrambe le mani per interrompere la caduta. Allo stesso modo, se qualcuno ti spinge sulla spalla sinistra, cadrai sulla mano destra. Il tuo orecchio interno ha dei "sensori gravitazionali" (clip di YouTube) che ti permettono di rilevare se stai cadendo in avanti / indietro, o cadendo a sinistra / destra o cadendo in basso (o in alto !!). Pertanto gli esseri umani possono rilevare l'allineamento e la rotazione attorno agli stessi assi X e Z del telefono.
Ora immagina che qualcuno ti ruoti di 90 gradi sulla rotatoria in modo che tu sia ora rivolto a est. Stai ruotando attorno all'asse Y. Questo asse è diverso perché non possiamo rilevarlo biologicamente. Sappiamo di essere angolati di una certa quantità, ma non conosciamo la direzione in relazione al polo nord magnetico del pianeta. Invece dobbiamo usare uno strumento esterno ... una bussola magnetica. Questo ci permette di accertarci in quale direzione siamo rivolti. Lo stesso vale con il nostro telefono.
Ora il telefono ha anche un accelerometro a 3 assi. Ho NOHo idea di come funzionano effettivamente, ma il modo in cui la visualizzo è immaginare la gravità come una "pioggia" costante e uniforme che cade dal cielo e immaginare gli assi nella figura sopra come tubi che possono rilevare la quantità di pioggia che scorre attraverso. Quando il telefono è tenuto in posizione verticale, tutta la pioggia scorrerà attraverso il "tubo" a Y. Se il telefono viene ruotato gradualmente in modo che lo schermo sia rivolto verso il cielo, la quantità di pioggia che scorre attraverso Y diminuirà fino a zero mentre il volume attraverso Z aumenterà costantemente fino a quando non scorre la quantità massima di pioggia. Allo stesso modo, se ora incliniamo il telefono su un lato, il tubo X alla fine raccoglierà la massima quantità di pioggia. Pertanto a seconda dell'orientamento del telefono misurando la quantità di pioggia che scorre attraverso i 3 tubi è possibile calcolare l'orientamento.
Il telefono ha anche una bussola elettronica che si comporta come una normale bussola: il suo "ago virtuale" punta al nord magnetico. Android unisce le informazioni di questi due sensori in modo che ogni volta che viene generato un SensorEvent
di TYPE_ORIENTATION
l' values[3]
array ha
valori [0]: Azimuth - (la bussola che si trova a est del nord magnetico)
valori [1]: Pitch, rotazione attorno all'asse x (è il telefono sporgendosi in avanti o indietro)
valori [2]: Roll, rotazione attorno all'asse y (è il telefono sporgendosi sul lato sinistro o destro)
Quindi penso (cioè non lo so) il motivo per cui Android fornisce l'azimut (rilevamento della bussola) piuttosto che la lettura del terzo accelerometro è che il rilevamento della bussola è solo più utile. Non sono sicuro del motivo per cui hanno deprecato questo tipo di sensore poiché ora sembra che sia necessario registrare un ascoltatore con il sistema per SensorEvent
s di tipo TYPE_MAGNETIC_FIELD
. L' value[]
array dell'evento deve essere passato al SensorManger.getRotationMatrix(..)
metodo per ottenere una matrice di rotazione (vedi sotto) che viene poi passata al SensorManager.getOrientation(..)
metodo. Qualcuno sa perché il team Android è stato deprecato Sensor.TYPE_ORIENTATION
? È una cosa di efficienza? Questo è ciò che è implicito in uno dei commenti a una domanda simile, ma è comunque necessario registrare un diverso tipo di ascoltatore nelsviluppo / samples / Compass / src / com / example / android / compass / CompassActivity.java example.
Vorrei ora parlare della matrice di rotazione. (Qui è dove non sono più sicuro) Quindi sopra abbiamo le tre cifre della documentazione di Android, le chiameremo A, B e C.
A = figura del metodo SensorManger.getRotationMatrix (..) e rappresenta il sistema di coordinate del mondo
B = Sistema di coordinate utilizzato dall'API SensorEvent.
C = Figura del metodo SensorManager.getOrientation (..)
Quindi la mia comprensione è che A rappresenta il "sistema di coordinate del mondo" che presumo si riferisca al modo in cui le posizioni sul pianeta sono date come una coppia (latitudine, longitudine) con un opzionale (altitudine). X è la coordinata "est" , Y è la coordinata "nord" . Z indica il cielo e rappresenta l'altitudine.
Il sistema di coordinate dei telefoni è mostrato in figura B è fisso. Il suo asse Y indica sempre la parte superiore. La matrice di rotazione viene costantemente calcolata dal telefono e consente la mappatura tra i due. Quindi ho ragione nel pensare che la matrice di rotazione trasforma il sistema di coordinate di B in C? Quindi, quando chiami il SensorManager.getOrientation(..)
metodo, usi l' values[]
array con valori che corrispondono alla figura C.Quando il telefono è puntato verso il cielo la matrice di rotazione è matrice identità (l'equivalente matematico della matrice di 1), il che significa che non è necessaria alcuna mappatura poiché il dispositivo è allineato con il sistema di coordinate del mondo.
Ok. Penso che sia meglio smetterla ora. Come ho detto prima, spero che le persone mi diranno dove ho incasinato o aiutato le persone (o confuso ulteriormente le persone!)