2017-01-03 12 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

 Смежные вопросы

  • Нет связанных вопросов^_^