2013-05-26 10 views
6

Vorrei sapere come utilizzare correttamente l'uscita dal "sensore di rotazione vettoriale". Attualmente ho trovato il seguente e volevo calcolare yaw e pitch dal result[], per sapere dove punta il dispositivo (in modalità orizzontale). Ma ho problemi con i risultati. Il calcolo di imbardata è piuttosto preciso ma l'intonazione si sta comportando in modo strano. Forse qualcuno può indicarmi la giusta direzione su come usare i dati. Un'altra cosa che vorrei anche sapere è se l'orientamento del dispositivo (orizzontale o verticale) ha una qualche influenza sull'uscita di questo sensore. Grazie in anticipo.Uso del sensore di rotazione vettoriale

private double max = Math.PI/2 - 0.01; 
private double min = -max; 

private float[] rotationVectorAction(float[] values) { 
    float[] result = new float[3]; 
    float vec[] = values; 
    float quat[] = new float[4]; 
    float[] orientation = new float[3]; 
    SensorManager.getQuaternionFromVector(quat, vec); 
    float[] rotMat = new float[9]; 
    SensorManager.getRotationMatrixFromVector(rotMat, quat); 
    SensorManager.getOrientation(rotMat, orientation); 
    result[0] = (float) orientation[0]; 
    result[1] = (float) orientation[1]; 
    result[2] = (float) orientation[2];  
    return result; 
} 

private void main() { 
    float[] result = rotationVectorAction(sensorInput); 
    yaw = result[0]; 
    pitch = result[1]; 
    pitch = (float) Math.max(min, pitch); 
    pitch = (float) Math.min(max, pitch); 
    float dx = (float) (Math.sin(yaw) * (-Math.cos(pitch))); 
    float dy = (float) Math.sin(pitch); 
    float dz = (float) (Math.cos(yaw) * Math.cos(pitch)); 
} 

E in OpenGL ES 2.0 che impostare questo per spostare la mia macchina fotografica in giro:

Matrix.setLookAtM(mVMatrix, 0, 0, 0, 0, dx, dy, dz, 0, 1, 0); 

risposta

4

Finalmente l'ho risolto io stesso. Il motivo per cui l'intonazione non funziona correttamente è stata la differenza tra l'INPUT e l'OUTPUT da SensorManager.getQuaternionFromVector(quat, vec);. Il metodo si aspetta che un vettore vec sia (x|y|z|w) e che l'output quat assomigli a questo (w|x|y|z). Nel mio caso ho dovuto spostare il primo valore dell'array quat fino alla fine e ha funzionato come un incantesimo.

+2

Potresti aggiungere del codice? Per favore. –

0

posso rispondere parte di questa domanda.

L'orientamento del dispositivo non ha alcun effetto sull'uscita del sensore, poiché i sensori sono sempre relativi all'orientamento predefinito del dispositivo. Tuttavia, per disegnare oggetti sullo schermo come una freccia della bussola che punta verso nord, è necessario tenere conto dell'orientamento del dispositivo, perché il sistema di coordinate della tela su cui si disegna è stato ruotato se il dispositivo non è nel orientamento predefinito.

+0

Grazie per l'aiuto, ora sono sicuro che mi sono preso cura di questa parte. – dima

2

L'anima sopra non mi ha aiutato. È venuto a rimuovere SensorManager.getQuaternionFromVector(quat, vec); come docs stato che SensorManager.getRotationMatrixFromVector() richiede il vettore di rotazione restituito dal sensore ROTATION_VECTOR.

private float[] rotationVectorAction(float[] values) 
{ 
    float[] result = new float[3]; 
    float vec[] = values; 
    float[] orientation = new float[3]; 
    float[] rotMat = new float[9]; 
    SensorManager.getRotationMatrixFromVector(rotMat, vec); 
    SensorManager.getOrientation(rotMat, orientation); 
    result[0] = (float) orientation[0]; //Yaw 
    result[1] = (float) orientation[1]; //Pitch 
    result[2] = (float) orientation[2]; //Roll 
    return result; 
} 
+0

Grazie! Ottimo lavoro! –