【问题标题】:Android SensorManager.getOrientation() returns pitch between -PI/2 and PI/2Android SensorManager.getOrientation() 返回 -PI/2 和 PI/2 之间的间距
【发布时间】:2013-07-19 13:50:56
【问题描述】:

我正在设计一个需要检查设备方向(方位角、俯仰角和滚动角)的应用。我使用以下代码来实现这一点:

@Override
public void onSensorChanged(SensorEvent event) {
    if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
        gravityMatrix = event.values.clone();// Fill gravityMatrix with accelerometer values
    else if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
        geomagneticMatrix = event.values.clone();// Fill geomagneticMatrix with magnetic-field sensor values
    if(gravityMatrix != null && geomagneticMatrix != null){
        RMatrix = new float[16];
        IMatrix = new float[16];

        SensorManager.getRotationMatrix(RMatrix, IMatrix, gravityMatrix, geomagneticMatrix);// Retrieve RMatrix, necessary for the getOrientation method
        SensorManager.getOrientation(RMatrix, orientation);// Get the current orientation of the device
    }
}

现在我可以从'orientation' float[] 中获取方位角、俯仰角和横滚值。方位角和滚动值一切正常(它返回正确的角度),但是当我打印俯仰值(方向 [1])时,我总是检索 PI/2 和 -PI/2 之间的角度。我不明白为什么?我无法检索大于 PI/2 或小于 -PI/2 的角度。一旦我的角度为 +- PI/2 并且我继续旋转我的设备(Samsung Galaxy S2),角度在达到 PI/2 值后会突然减小。

谁能解释一下为什么俯仰角的行为如此罕见?

提前致谢!

【问题讨论】:

    标签: android android-sensors angle device-orientation motion-detection


    【解决方案1】:

    pitch计算为pitch = (float) Math.asin(-RMatrix[7]);arcsin函数的范围是[-PI/2, PI/2],所以asin只能在-PI/2PI/2之间取值。

    【讨论】:

    • 好的,非常感谢。确实有道理,我不知道。但是我必须知道这两个具有相同间距的方向之间的区别,所以我想我将使用方位角值。当设备在 X 轴上持续旋转时,它会从负变为正。我会告诉你这是否有效。
    • 我找到了解决方案!实际上很简单:'if(gravityMatrix[2]
    • 在我的 Sony Xperia Z5P 上,对于音高,我看到的值范围从 -0(平放在桌子上)到 -90(站立)再回到 -0(面朝下表)所以我无法知道上下是什么!有了这个修复,我终于可以让应用程序决定用户是向上还是向下看。希望这不是特定于硬件的!