zjištění orientace pomocí getRotationMatrix () a getOrientation ()

hlasů
9

Im snaží dostat směr vektoru s poukazem na kameru, s ohledem na severnímu magnetickému pólu. Jsem pod dojmem, že musím použít hodnoty vrácené z getOrientation (), ale nejsem si jistý, co oni reprezentují. Hodnoty I získat od getOrientation () nejsou předvídatelně měnit, když jsem se změnit orientaci telefonu (otočením o 90 stupňů nemění hodnoty o 90 stupňů). Musím vědět, co hodnoty vrácené getOrientation () znamenají. To, co jsem doposud je psáno níže:

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();*/
   }   
  }

    }

}

Díval jsem se na dokumentaci o třídě sensorManager, ale to nepomohlo vyřešit. Jestli někdo mi mohl pomoci dostat to znamená ven z tohoto bych ve skutečnosti ocenit ono. Zkouším na Nexus One systémem Android 2.1

Položena 26/10/2010 v 02:25
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
4

Protože jsem byl nový android Použil jsem přípitek pro zobrazení informací na obrazovce. Změnil jsem to jen aktualizovat text na pohled a zdálo se, že to opravit. Také jsem zjistil, že to, co jsem předpokládal, že orientVals vlastně bylo správné. Za to, co potřebuji váleček není používán. I didnt si uvědomit, existuje způsob, jak převést z rad do ° postavena v roce, takže jsem jen používal to.

Odpovězeno 03/11/2010 v 00:51
zdroj uživatelem

hlasů
1

Myslím, že byste měli mít pouze getInclination získat směr namísto získat orientaci. as getRotationMatrix počítá na základě obou gravitační a geomagnetického feild a dostanete inlination z magnetického pole přímo.

Odpovězeno 14/01/2011 v 20:43
zdroj uživatelem

hlasů
3

můžete vyzkoušet aplikaci záznamníku , která zobrazuje surové hodnoty na obrazovce. Ve svém popisu najdete odkaz ke zdrojovému kódu, takže se můžete naučit, jak se přistupuje k senzory.

HTH, Daniele

Odpovězeno 19/03/2012 v 09:04
zdroj uživatelem

hlasů
3

Musíte se dostat orientaci vašeho přístroje (na šířku / na výšku) a provést určitou kompenzaci.

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;
Odpovězeno 22/03/2012 v 04:42
zdroj uživatelem

hlasů
1

Myslím, že byste měli změnit outr INR v řadě 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);**
Odpovězeno 12/10/2013 v 12:10
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more