android:方位角问题取决于初始设备倾斜

mo49yndu  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(423)

我目前正在编写一个android ar应用程序,我有一个问题,我的方位角计算取决于初始设备倾斜。
我用旋转矢量传感器得到方位角,高度和倾斜。
当我启动我的应用程序,手机是垂直于地面,我有良好的方位从北方。当我启动应用程序,手机与地面平行时,我的价值观不好。我也有奇怪的价值观,当我改变设备倾斜。
这是我的密码:

  1. public void onSensorChanged(SensorEvent event)
  2. {
  3. if (event.sensor.getType() == sensor.TYPE_ROTATION_VECTOR)
  4. {
  5. SensorManager.getRotationMatrixFromVector(rotationVectorMatrix, event.values);
  6. SensorManager.remapCoordinateSystem(rotationVectorMatrix, SensorManager.AXIS_X, SensorManager.AXIS_Z, rotationMatrix);
  7. SensorManager.getOrientation(rotationMatrix, orientation);
  8. ...
  9. }
  10. }
laik7k3q

laik7k3q1#

要获得方位角,可以使用加速度计和磁场传感器。您可以使用以下代码来记录方位角值。

  1. public class MainActivity extends AppCompatActivity {
  2. private int mAzimuth = 0; // degree
  3. private SensorManager mSensorManager = null;
  4. private Sensor mAccelerometer;
  5. private Sensor mMagnetometer;
  6. boolean haveAccelerometer = false;
  7. boolean haveMagnetometer = false;
  8. @Override
  9. protected void onCreate( Bundle savedInstanceState ) {
  10. super.onCreate(savedInstanceState);
  11. mSensorManager = (SensorManager) getSystemService(Service.SENSOR_SERVICE);
  12. this.mAccelerometer = this.mSensorManager.getDefaultSensor( Sensor.TYPE_ACCELEROMETER );
  13. this.haveAccelerometer = this.mSensorManager.registerListener( mSensorEventListener, this.mAccelerometer, SensorManager.SENSOR_DELAY_GAME );
  14. this.mMagnetometer = this.mSensorManager.getDefaultSensor( Sensor.TYPE_MAGNETIC_FIELD );
  15. this.haveMagnetometer = this.mSensorManager.registerListener( mSensorEventListener, this.mMagnetometer, SensorManager.SENSOR_DELAY_GAME );
  16. if ( haveAccelerometer && haveMagnetometer ) {
  17. // ready to go
  18. } else {
  19. // unregister and stop
  20. }
  21. }
  22. private SensorEventListener mSensorEventListener = new SensorEventListener() {
  23. float[] gData = new float[3]; // accelerometer
  24. float[] mData = new float[3]; // magnetometer
  25. float[] rMat = new float[9];
  26. float[] iMat = new float[9];
  27. float[] orientation = new float[3];
  28. public void onAccuracyChanged(Sensor sensor, int accuracy ) {}
  29. @Override
  30. public void onSensorChanged( SensorEvent event ) {
  31. float[] data;
  32. switch ( event.sensor.getType() ) {
  33. case Sensor.TYPE_ACCELEROMETER:
  34. gData = event.values.clone();
  35. break;
  36. case Sensor.TYPE_MAGNETIC_FIELD:
  37. mData = event.values.clone();
  38. break;
  39. default: return;
  40. }
  41. if ( SensorManager.getRotationMatrix( rMat, iMat, gData, mData ) ) {
  42. mAzimuth= (int) ( Math.toDegrees( SensorManager.getOrientation( rMat, orientation )[0] ) + 360 ) % 360;
  43. Log.d("AzimuthTag", "Azimuth:"+mAzimuth);
  44. }
  45. }
  46. };
  47. }

来源

展开查看全部

相关问题