0

我正在为 Android 制作一个指南针应用程序,并且我已经设法通过使用陀螺仪、加速度计和磁力计来捕获方位角(请参阅此处了解我使用的教程)。不幸的是,只有当设备与地面平行放置(即平放在桌子上/我的手掌等)时,罗盘读数才起作用。每当我将设备倾斜到完全直立的位置(屏幕面向我)时,指南针就会给出错误的读数。我假设这是因为当设备的方向本身发生变化时轴会发生变化。我该如何防止这种情况发生?我希望指南针在这两个位置都可以工作:平行于地面和完全直立的位置。我该怎么做呢?如果有人可以推动我朝着正确的方向前进,那将非常有帮助。

感谢你的帮助!:D

4

1 回答 1

0

在 SensorFusionActivity 中添加 mDisplay 变量,如下所示:

private Display mDisplay = null;

然后,在 onCreate 方法中添加以下代码:

mDisplay = ((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();

最后,以这种方式修改 calculateAccMagOrientation:

// calculates orientation angles from accelerometer and magnetometer output
public void calculateAccMagOrientation() {
    if(SensorManager.getRotationMatrix(rotationMatrix, null, accel, magnet)) {

        int rotation = mDisplay.getRotation();

        if(rotation == Surface.ROTATION_0)
            SensorManager.remapCoordinateSystem(rotationMatrix, SensorManager.AXIS_MINUS_Y, SensorManager.AXIS_X, rotationMatrix);
        else if(rotation == Surface.ROTATION_180)
            SensorManager.remapCoordinateSystem(rotationMatrix, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, rotationMatrix);
        else if(rotation == Surface.ROTATION_270)
            SensorManager.remapCoordinateSystem(rotationMatrix, SensorManager.AXIS_MINUS_X, SensorManager.AXIS_MINUS_Y, rotationMatrix);

        SensorManager.getOrientation(rotationMatrix, accMagOrientation);
    }
}
于 2013-04-13T22:07:55.353 回答