Domanda

Ho cercato di ottenere la mia testa intorno ai sensori di orientamento Android per un po '. Ho pensato ho capito. Poi mi sono reso conto che non ho. Ora penso (spero) ho la sensazione migliore per questo nuovo, ma io sono ancora al 100%. Cercherò e spiegare il mio chiazze comprensione di esso e spero che la gente sarà in grado di correggermi se sbaglio in alcune parti o riempire eventuali spazi vuoti.

immagino io sto a 0 gradi di longitudine (Meridiano Zero) e 0 gradi di latitudine (all'equatore). Questa posizione è in realtà nel mare al largo della costa africana, ma portare con me. Trattengo il telefono davanti alla mia faccia in modo che la parte inferiore dei punti di telefonate ai miei piedi; Sono di fronte Nord (guardando verso Greenwich) in modo da quindi il lato destro del telefono punti Oriente verso l'Africa. In questo orientamento (con riferimento allo schema seguente) Ho l'asse X indica Oriente, l'asse Z punta sud e punto Y al cielo.

Ora i sensori del telefono consentono di lavorare fuori l'orientamento (non luogo) del dispositivo in questa situazione. Questa parte mi ha sempre confuso, probabilmente perché volevo capire come qualcosa lavorato prima ho accettato che lo ha fatto solo lavoro. Sembra che il telefono funziona il suo orientamento utilizzando una combinazione di due tecniche diverse.

Prima di arrivare a questo, immaginare di essere di nuovo in piedi su quel pezzo di terra immaginaria a 0 gradi di latitudine e longitudine in piedi nella direzione di cui sopra. Immaginate anche che si sta bendato e le scarpe sono fissate a un parco giochi rotonda. Se qualcuno ti infila nella parte posteriore si cadrà in avanti (verso Nord) e mettere entrambe le mani per rompere la tua caduta. Allo stesso modo se qualcuno si infila spalla sinistra si cadere sulla vostra destra. Il tuo orecchio interno ha "sensori gravitazionali" (youtube clip) che consentono di rilevare se state cadendo in avanti / indietro, o cadere a sinistra / destra o cadere (o su !!). Pertanto gli esseri umani possono rilevare l'allineamento e la rotazione intorno al medesimo X e Z come il telefono cellulare.

Ora immaginate che qualcuno ora si ruota di 90 gradi sulla rotonda in modo che è di fronte orientale. Stai per essere ruotati intorno all'asse Y. Questo asse è diverso perché non possiamo rilevarla biologicamente. Sappiamo che sono angolati da una certa quantità, ma non conosciamo la direzione in relazione al Polo Nord magnetico del pianeta. Invece abbiamo bisogno di usare uno strumento esterno ... una bussola magnetica. Ciò consente di accertare quale direzione ci troviamo di fronte. Lo stesso vale con il nostro telefono.

Ora il telefono ha anche un accelerometro a 3 assi. Ho NO idea di come effettivamente lavoro ma il modo visualizzo è immaginare gravità come costante e 'pioggia' uniforme cadono dal cielo e immaginare gli assi della figura sopra i tubi che possono rilevare la quantità di pioggia che scorre attraverso. Quando il telefono montante tenuto tutta la pioggia fluirà attraverso la Y 'tubo'. Se il telefono viene ruotato in modo graduale suo schermo di fronte al cielo la quantità di pioggia che scorre attraverso Y diminuisce a zero mentre il volume attraverso Z aumenterà costantemente fino alla massima quantità di pioggia fluisce attraverso. Allo stesso modo se ora suggerimento il telefono su un lato del tubo X finirà per raccogliere la quantità massima di pioggia. Pertanto a seconda dell'orientamento del telefono misurando la quantità di pioggia che scorre attraverso i tubi 3 è possibile calcolare l'orientamento.

Il telefono ha anche una bussola elettronica che si comporta come una bussola normale - i suoi punti di "ago virtuale" per il nord magnetico. fusioni Android le informazioni da questi due sensori in modo che ogni volta che viene generato un SensorEvent di TYPE_ORIENTATION matrice values[3] ha
valori [0]: Azimuth - (la bussola cuscinetto est di non magneticoRTH)
valori [1]: Pitch, rotazione attorno all'asse x (è il telefono appoggiati in avanti o indietro)
valori [2]: rullo, rotazione attorno all'asse y (è il telefono appoggiato sopra alla sua sinistra o destra)

Quindi penso (vale a dire non so) il motivo per Android fornisce l'azimut (rilevamento della bussola), piuttosto che la lettura del terzo accelerometro è che il rilevamento della bussola è solo più utile. Io non sono sicuro perché deprecati questo tipo di sensore, come ora sembra è necessario registrare un ascoltatore con il sistema per SensorEvents di tipo TYPE_MAGNETIC_FIELD. esigenze matrice value[] dell'evento per bepassed nel metodo SensorManger.getRotationMatrix(..) per ottenere una matrice di rotazione (vedi sotto) che viene poi passato al metodo SensorManager.getOrientation(..). Qualcuno sa il motivo per cui il team di Android deprecato Sensor.TYPE_ORIENTATION? E 'una cosa di efficienza? Questo è ciò che è implicato in uno dei commenti a una simile domanda , ma è ancora necessario per registrare un diverso tipo di ascoltatore nel sviluppo / campioni / bussola / src / com / example / android / bussola / CompassActivity.java esempio.

Mi piacerebbe ora piace parlare la matrice di rotazione. (Questo è dove mi è più sicuro) Così sopra abbiamo i tre figure dalla documentazione di Android, Li chiameremo A, B e C.

A = SensorManger.getRotationMatrix (..) metodo di figura e rappresenta il sistema di coordinate del mondo

B = sistema utilizzato dall'API SensorEvent coordinate.

C = SensorManager.getOrientation (..) Metodo figura

Quindi la mia comprensione è che A rappresenta "il sistema di coordinate mondo" che presumo si riferisce alle posizioni modo del pianeta sono dati come un (latitudine, longitudine) coppia con un optional (altitudine). X è il "easting" coordinare, Y è la "northing" coordinare. Z indica il cielo e rappresenta altitudine.

Il sistema cellulari coordinata è mostrato in figura B è fisso. Il suo asse Y sempre sottolinea all'inizio. La matrice di rotazione viene costantemente calcolato dal telefono e consente la mappatura tra i due. Così ho ragione nel pensare che la matrice di rotazione trasforma il sistema di coordinate B a C? Così, quando si chiama il metodo SensorManager.getOrientation(..) si utilizza la matrice values[] con valori che corrispondono a figura C. Quando il telefono è puntato al cielo la matrice di rotazione è matrice di identità (la matrice equivalente matematico di 1) che significa nessuna mappatura è necessaria in quanto il dispositivo è allineato con il sistema di coordinate del mondo.

Ok. Credo di meglio fermarsi ora. Come ho detto prima spero che la gente mi dirà dove ho incasinato o aiutato le persone (o confuso la gente ancora di più!)

È stato utile?

Soluzione

Si potrebbe voler controllare la One Accendere schermo merita un altro articolo . Spiega perché è necessario la matrice di rotazione.

In poche parole, i sensori del telefono usare sempre lo stesso sistema di coordinate, anche quando il dispositivo viene ruotato.

In applicazioni che non sono bloccati per un singolo orientamento, la coordinata schermo sistema cambia quando si ruota il dispositivo. Così, quando il dispositivo viene ruotato dalla sua modalità di visualizzazione predefinita, la coordinata sensore sistema non è più lo stesso schermo del sistema di coordinate. La matrice di rotazione in questo caso viene utilizzato per trasformare da A a C (B rimane sempre fisso).

Ecco un frammento di codice per mostrare come può essere usato.

SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);

// Register this class as a listener for the accelerometer sensor
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                    SensorManager.SENSOR_DELAY_NORMAL);
// ...and the orientation sensor
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
                    SensorManager.SENSOR_DELAY_NORMAL);

//...
// The following code inside a class implementing a SensorEventListener
// ...

float[] inR = new float[16];
float[] I = new float[16];
float[] gravity = new float[3];
float[] geomag = new float[3];
float[] orientVals = new float[3];

double azimuth = 0;
double pitch = 0;
double roll = 0;

public void onSensorChanged(SensorEvent sensorEvent) {
    // If the sensor data is unreliable return
    if (sensorEvent.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
        return;

    // Gets the value of the sensor that has been changed
    switch (sensorEvent.sensor.getType()) {  
        case Sensor.TYPE_ACCELEROMETER:
            gravity = sensorEvent.values.clone();
            break;
        case Sensor.TYPE_MAGNETIC_FIELD:
            geomag = sensorEvent.values.clone();
            break;
    }

    // If gravity and geomag have values then find rotation matrix
    if (gravity != null && geomag != null) {

        // checks that the rotation matrix is found
        boolean success = SensorManager.getRotationMatrix(inR, I,
                                                          gravity, geomag);
        if (success) {
            SensorManager.getOrientation(inR, orientVals);
            azimuth = Math.toDegrees(orientVals[0]);
            pitch = Math.toDegrees(orientVals[1]);
            roll = Math.toDegrees(orientVals[2]);
        }
    }
}

Altri suggerimenti

Roll è una funzione della gravità, a 90 gradi rotolo mette tutti gravità nel registro x.

Il passo è la stessa, un passo di 90 gradi su mette tutta componente di gravità nel registro y.

Yaw / Rubrica / azimuth non ha alcun effetto sulla gravità, è sempre ad angolo retto rispetto gravità, quindi non importa in che modo si trovano ad affrontare la gravità sarà imeasurable.

Questo è il motivo per cui hai bisogno di una bussola per valutare, forse questo ha un senso?

Date un'occhiata a questo: Stackoverflow.com: Q.5202147

sembra essere lo più a destra fino a che i 3 schemi A, B, C. Dopo che avete voi stessi confuso.

I stava avendo questo problema così ho mappato cosa succede in direzioni diverse. Se il dispositivo è montato in modo paesaggio, ad esempio, in una macchina montare i 'gradi' dalla bussola sembrano funzionare 0-275 (in senso orario in corso) di cui sopra 269 (tra ovest e nord) conta all'indietro da -90 a 0, poi avanti da 0 a 269. 270 diventa -90

Ancora In paesaggio, ma con il dispositivo sdraiato sul dorso mio sensore dà 0-360. e in modalità verticale che gira 0-360 sia disteso sul dorso e in piedi in verticale.

La speranza che aiuta qualcuno

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top