如何在没有磁力计的情况下检测磁北/方位角

时间:2016-10-11 11:07:56

标签: android android-sensors magnetometer sensormanager

我正在开发一款Android设备,它没有磁力计,但有旋转传感器(陀螺仪)和重力传感器和GPS。我想从这些传感器确定 True North / Azimuth ,但无法弄清楚如何。如果没有磁力计,我该如何确定该设备的方向?很明显,它知道North的位置,地图应用程序工作得很好。

1 个答案:

答案 0 :(得分:0)

<强>更新

你可以Rotation Vector Sensor看起来非常适合你的情况。

private SensorManager mSensorManager;
private Sensor mSensor;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);

您想要的坐标系统如下:

  • X被定义为矢量积Y x Z.它在设备的当前位置与地面相切,点在东部
  • Y在设备的当前位置与地面相切,并且指向地磁北极
  • Z指向天空,垂直于地平面。

enter image description here

Android提供了很多的传感器

如果您特别希望使用陀螺仪(Sensor.TYPE_GYROSCOPE),您可以这样做(取自Google example):

private SensorManager mSensorManager;
private Sensor mSensor;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);

public void onSensorChanged(SensorEvent event) {
      //...
}

但您可以尝试检查是否可以使用更高级别的API来利用多个传感器

你应该看看JavaCodeGeeks的这个simple example,他们利用默认的Sensor.TYPE_ORIENTATION构建一个安卓指南针

关于Sensor.TYPE_ORIENTATION的更多信息。 According to Google您仍然可以使用设备方向,但可以通过调用getOrientation()而不是直接通过传感器进行操作。

  

我们建议您不要使用方向传感器的原始数据   你使用getRotationMatrix()方法结合使用   用于计算方向值的getOrientation()方法,如下所示   下面的代码示例。作为此过程的一部分,您可以使用   将方向值转换为的remapCoordinateSystem()方法   您的申请的参考框架。

坏消息是getOrientation()和旧Sensor.TYPE_ORIENTATION至少部分依赖于磁力计

希望这有帮助!