2017-01-03 9 views
0

私は現在Android ARアプリケーションをプログラミングしていますが、初期のデバイス傾きに応じて私の方位計算に問題があります。Android:初期デバイス傾きに応じた方位角の問題

ROTATION_VECTORセンサーを使用して、方位角、高度、傾斜を取得します。

私のアプリケーションを起動し、電話機が地面と垂直になっているとき、私は北からの良好な方位角を持っています。私がアプリケーションを起動し、電話機が地面と平行になると、私は悪い値を持っています。私はデバイスの傾きを変えると奇妙な値も持っています。

これは私のコードです:

public void onSensorChanged(SensorEvent event) 
{ 
    if (event.sensor.getType() == sensor.TYPE_ROTATION_VECTOR) 
    { 
     SensorManager.getRotationMatrixFromVector(rotationVectorMatrix, event.values); 
     SensorManager.remapCoordinateSystem(rotationVectorMatrix, SensorManager.AXIS_X, SensorManager.AXIS_Z, rotationMatrix); 
     SensorManager.getOrientation(rotationMatrix, orientation); 
     ... 
    } 
} 

答えて

1

方位を取得するには、加速度計と磁界センサを使用することができます。次のコードを使用して方位角の値を記録できます。

public class MainActivity extends AppCompatActivity { 

    private int mAzimuth = 0; // degree 

    private SensorManager mSensorManager = null; 

    private Sensor mAccelerometer; 
    private Sensor mMagnetometer; 

    boolean haveAccelerometer = false; 
    boolean haveMagnetometer = false; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mSensorManager = (SensorManager) getSystemService(Service.SENSOR_SERVICE); 

     this.mAccelerometer = this.mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
     this.haveAccelerometer = this.mSensorManager.registerListener(mSensorEventListener, this.mAccelerometer, SensorManager.SENSOR_DELAY_GAME); 

     this.mMagnetometer = this.mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 
     this.haveMagnetometer = this.mSensorManager.registerListener(mSensorEventListener, this.mMagnetometer, SensorManager.SENSOR_DELAY_GAME); 

     if (haveAccelerometer && haveMagnetometer) { 
      // ready to go 
     } else { 
      // unregister and stop 
     } 

    } 

    private SensorEventListener mSensorEventListener = new SensorEventListener() { 

     float[] gData = new float[3]; // accelerometer 
     float[] mData = new float[3]; // magnetometer 
     float[] rMat = new float[9]; 
     float[] iMat = new float[9]; 
     float[] orientation = new float[3]; 

     public void onAccuracyChanged(Sensor sensor, int accuracy) {} 

     @Override 
     public void onSensorChanged(SensorEvent event) { 
      float[] data; 
      switch (event.sensor.getType()) { 
       case Sensor.TYPE_ACCELEROMETER: 
        gData = event.values.clone(); 
        break; 
       case Sensor.TYPE_MAGNETIC_FIELD: 
        mData = event.values.clone(); 
        break; 
       default: return; 
      } 

      if (SensorManager.getRotationMatrix(rMat, iMat, gData, mData)) { 
       mAzimuth= (int) (Math.toDegrees(SensorManager.getOrientation(rMat, orientation)[0]) + 360) % 360; 
       Log.d("AzimuthTag", "Azimuth:"+mAzimuth); 
      } 
     } 
    }; 

} 

Source

+0

あなたの答えをありがとう、私はまだ問題を抱えています。電話機が同じ方向の地面に対して平行または垂直の場合、方位角の値が変化します。 – solenzo

関連する問題