Android:getOrientation()是否需要连续重映射?

时间:2013-04-17 00:06:36

标签: android orientation sensor

我一直在尝试使用getOrientation()方法获取标题值。

boolean success = SensorManager.getRotationMatrix(rot, incl, accel, magnet);
if (success) {
    // Compute orientation
    float orientation[] = new float[3];
    SensorManager.getOrientation(rot, orientation);

}

这些值变化很大,即使我保持手机稳定并且在稳定的位置行走也是如此。

然后我尝试将加速度值的参考从手机更改为世界轴:

        // Compute world acceleration
        float wAccel[] = new float[4];
        float newAccel[] = new float[]{accel[0],accel[1],accel[2], 0};
        android.opengl.Matrix.multiplyMV(wAccel, 0, rot, 0, newAccel, 0);
        magnetLine += "W" + LOGSEPARATOR +
                tsString + LOGSEPARATOR +
                wAccel[0] + LOGSEPARATOR +
                wAccel[1] + LOGSEPARATOR +
                wAccel[2] + "\n";
    }

然后我在atan2函数上使用X轴和Y轴的值来确定矢量的角度。即使以不同的方式变化,这些值仍然会显示奇怪的行为(有时值是常量,有时它会显示周期性行为,就像跟随脚步一样)。

我见过一些人们调用remapCoordinate系统的情况,这种情况与此类似。这是我错过的吗?

1 个答案:

答案 0 :(得分:1)

以下是您可以执行的一些操作:

  1. 首先,除非您使用的是旧版Android API,否则请使用Sensor.TYPE_GRAVITY代替{{1} }。 Sensor.TYPE_ACCELEROMETER旨在尝试过滤掉移动,并为您提供重力矢量。
  2. 使用Sensor.TYPE_GRAVITY onAccuracyChanged(Sensor sensor, int accuracy)方法监控传感器的准确性接口。我遇到了同样的问题,在我的情况下,当SensorEventListener成为Sensor.TYPE_MAGNETIC_FIELD时发生了这种情况。
SensorManager.SENSOR_STATUS_UNRELIABLE与90度有关你的坐标系中的旋转,例如用z轴等交换x。如果你是制作一个显示真北方向的指南针,然后您需要考虑您的设备是处于纵向还是横向模式等。但是,传感器的测量值不依赖于纵向/横向,所以如果他们的变化很大,然后你的问题就在别的地方。

另请注意android compass seems unreliable,有些人发现Android设备中的指南针不是很好。然而,这个帖子大约是2年前,所以希望事情现在好一些: - )。