2010-06-03 7 views
8

Ho avuto problemi con questo per troppo tempo. Questo codice dovrebbe emettere dx, dy, dz per l'accelerometro e un totale parziale del dx. Dovrebbe anche produrre azimuth, pitch e roll.Utilizzo di getRotationMatrix e getOrientation in Android 2.1

I've used the information given here, ma senza alcun risultato.

Questo codice non emette correttamente intonazione, azimut o rotolo. Emette 0.0, -0.0, -0.0 rispettivamente per le ultime tre visualizzazioni di testo.

switch (event.sensor.getType()) { 
    case Sensor.TYPE_ACCELEROMETER: 
     accelerometerValues = event.values.clone(); 
    case Sensor.TYPE_MAGNETIC_FIELD: 
     geomagneticMatrix = event.values.clone(); 
     sensorReady = true; 
     break; 
    default: 
     break; 
} 

if (geomagneticMatrix != null && accelerometerValues != null && sensorReady) { 
    sensorReady = false; 

    float[] R = new float[16]; 
    float[] I = new float[16]; 

    SensorManager.getRotationMatrix(R, I, accelerometerValues, geomagneticMatrix); 

    float[] actual_orientation = new float[3]; 
    SensorManager.getOrientation(R, actual_orientation); 

    tvXCoordinate.setText(accelerometerValues[0] + ""); 
    tvYCoordinate.setText(accelerometerValues[1] + ""); 
    tvZCoordinate.setText(accelerometerValues[2] + ""); 

    floatXTotal += accelerometerValues[0]; 
    tvXTotal.setText(floatXTotal + ""); 

    tvAzimuth.setText(actual_orientation[0] + ""); 
    tvPitch.setText(actual_orientation[1] + ""); 
    tvRoll.setText(actual_orientation[2] + ""); 
} 

risposta

6

potrei mancare qualcosa (e potrebbe essere risolto questo già), ma a me sembra che la vostra istruzione switch non è corretta:

switch (event.sensor.getType()) { 
     case Sensor.TYPE_ACCELEROMETER: 
      accelerometerValues = event.values.clone(); 
     case Sensor.TYPE_MAGNETIC_FIELD: 
      geomagneticMatrix = event.values.clone(); 
      sensorReady = true; 
      break; 
     default: 
      break; 
    } 

Se l'evento sensore è TYPE_ACCELEROMETER i valori da l'evento verrà clonato sia a accelerometerValues sia a geomagneticMatrix e sensorReady verrà impostato su true. Penso che potrebbe essere necessario modificare l'ordine di questo blocco, o eventualmente aggiungere un break; dopo il primo caso.

2

Il motivo per cui ottieni 0.0, -0.0, -0.0 da getOrientation() è che getRotationMatrix() non ottiene sempre un risultato valido. Devi verificare il valore di ritorno di getRotationMatrix(), che sarà falso se il risultato non è valido, o vero se ha avuto successo.

Aggiunto: In realtà, non è venuto fuori giusto. Stai ottenendo un risultato non valido per la ragione indicata da Aganders. Il controllo del valore restituito sarebbe semplicemente un'indicazione del fatto che stavi effettivamente ottenendo un risultato non valido.

Problemi correlati