9

En essayant d'obtenir la direction du vecteur pointant vers l'extérieur de la caméra, par rapport au nord magnétique. J'ai l'impression que j'ai besoin d'utiliser les valeurs renvoyées par getOrientation(), mais je ne suis pas sûr de ce qu'elles représentent. Les valeurs que je reçois de getOrientation() ne changent pas de façon prévisible lorsque je change l'orientation du téléphone (une rotation de 90 degrés ne change pas les valeurs de 90 degrés). J'ai besoin de savoir ce que les valeurs retournées par getOrientation() signifient. Ce que j'ai jusqu'à présent est écrit ci-dessous:trouver l'orientation en utilisant getRotationMatrix() et getOrientation()

package com.example.orientation; 

import android.app.Activity; 
import android.content.Context; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.widget.Toast; 

public class Orientation extends Activity{ 

private SensorManager mSM; 
private mSensorEventListener mSEL; 

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

    final float pi = (float) Math.PI; 
    final float rad2deg = 180/pi;  

/** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mSM = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
     mSEL = new mSensorEventListener(); 

     mSM.registerListener(mSEL, 
     mSM.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
     SensorManager.SENSOR_DELAY_NORMAL); 

    mSM.registerListener(mSEL, 
     mSM.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), 
     SensorManager.SENSOR_DELAY_NORMAL); 

} 



private class mSensorEventListener implements SensorEventListener{ 

    @Override 
    public void onAccuracyChanged(Sensor arg0, int arg1) {} 

    @Override 
    public void onSensorChanged(SensorEvent event) { 

    // If the sensor data is unreliable return 
    if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) 
    return; 

    // Gets the value of the sensor that has been changed 
    switch (event.sensor.getType()){ 
    case Sensor.TYPE_ACCELEROMETER: 
    gravity = event.values.clone(); 
    break; 
    case Sensor.TYPE_MAGNETIC_FIELD: 
    geomag = event.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){ 

    // Re-map coordinates so y-axis comes out of camera 
    SensorManager.remapCoordinateSystem(inR, SensorManager.AXIS_X, 
     SensorManager.AXIS_Z, outR); 

    // Finds the Azimuth and Pitch angles of the y-axis with 
    // magnetic north and the horizon respectively 
    SensorManager.getOrientation(outR, orientVals); 
    float azimuth = orientVals[0]*rad2deg; 
    float pitch = orientVals[1]*rad2deg; 
    float roll = orientVals[2]*rad2deg; 

    // Displays a pop up message with the azimuth and inclination angles 
    String endl = System.getProperty("line.separator"); 
    Toast.makeText(getBaseContext(), 
     "Rotation:" + 
     outR[0] + " " + outR[1] + " " + outR[2] + endl + 
     outR[4] + " " + outR[5] + " " + outR[6] + endl + 
     outR[8] + " " + outR[9] + " " + outR[10] + endl +endl + 
     "Azimuth: " + azimuth + " degrees" + endl + 
     "Pitch: " + pitch + " degrees" + endl + 
     "Roll: " + roll + " degrees", 
     Toast.LENGTH_LONG).show(); 
    } /*else 
    Toast.makeText(getBaseContext(), 
     "Get Rotation Matrix Failed", Toast.LENGTH_LONG).show();*/ 
    } 
    } 

    } 

} 

J'ai regardé la documentation sur la classe sensorManager, mais il n'a pas aidé à résoudre ce problème. Si quelqu'un pouvait m'aider à comprendre cela, je l'apprécierais vraiment. Je teste sur un Nexus One fonctionnant sous Android 2.1

Répondre

4

Parce que j'étais nouveau sur Android, j'utilisais toast pour afficher les informations sur l'écran. Je l'ai changé pour juste mettre à jour le texte sur une vue et cela a semblé le réparer. J'ai aussi compris que ce que je supposais être les orientaux était correct. Pour ce dont j'ai besoin, le rouleau n'est pas utilisé. Aussi ne se rendait pas compte qu'il y avait un moyen de convertir de rad à deg construit alors je l'ai juste utilisé.

1

Je pense que vous devriez utiliser getInclination pour obtenir la direction au lieu d'obtenir l'orientation. Comme getRotationMatrix calcule en fonction de la gravité et de la fonction géomagnétique et vous obtiendrez l'inlination directement à partir du champ magnétique.

3

vous pouvez consulter le logger application qui affiche des valeurs brutes sur l'écran. Dans sa description, vous trouverez un lien vers le code source afin que vous puissiez apprendre comment il accède aux capteurs.

HTH, Daniele

3

Vous devez obtenir l'orientation de votre appareil (Paysage/Portrait) et faire une compensation.

SensorManager.getOrientation(R, values); 
mHeading = (int) Math.toDegrees(values[0]); 
Display display = 
((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
int compensation = display.getRotation() * 90;       
mHeading = mHeading+compensation; 
1

Je pense que vous devriez changer outr à Inr ligne GetOrientation

boolean success = SensorManager.getRotationMatrix(inR, I, gravity, geomag); 
if (success){ 
// Re-map coordinates so y-axis comes out of camera 
SensorManager.remapCoordinateSystem(inR, SensorManager.AXIS_X, 
    SensorManager.AXIS_Z, outR); 

// Finds the Azimuth and Pitch angles of the y-axis with 
// magnetic north and the horizon respectively 
**SensorManager.getOrientation(inR, orientVals);**