android - 当我的 Android 设备不平时,我应该如何计算方位角、俯仰角和方向?

标签 android orientation sensors

我使用 Android 重力和磁场传感器通过 SensorManager.getRotationMatrix 和 SensorManager.getOrientation 计算方向。这给了我方位角、俯仰角和方向数。当设备平放在 table 上时,结果看起来很合理。

但是,我在 list 中禁用了纵向和横向之间的切换,因此 getWindowManager().getDefaultDisplay().getRotation() 始终为零。当我将设备旋转 90 度使其垂直站立时,我遇到了麻烦。有时数字看起来很不对,我意识到这与 Gimbal lock 有关。 .但是,其他应用程序似乎没有这个问题。例如,我将我的应用程序与两个免费的传感器测试应用程序(Sensor Tester (Dicotomica)Sensor Monitoring (R's Software))进行了比较。当设备是平的时,我的应用程序与这些应用程序一致,但当我将设备旋转到垂直位置时,可能会有显着差异。这两个应用似乎彼此一致,那么他们如何解决这个问题呢?

最佳答案

当设备不是平面的时候,你必须在调用getOrientation之前调用remapCoordinateSystem(inR, AXIS_X, AXIS_Z, outR);

getOrientation 返回的方位角 是通过将设备单元Y 轴 正交投影到世界东西-北平面 然后计算生成的投影向量与北轴之间的角度。

现在我们通常认为方向是后置摄像头指向的方向。这是 -Z 的方向,其中 Z 是指向屏幕外的设备轴。当设备是扁平的时,我们不会考虑方向并接受任何给定的东西。但是当它不平坦时,我们期望它是 -Z 的方向。但是 getOrientation 计算的是 Y 轴 的方向,因此我们需要在调用 getOrientation 之前交换 Y 轴和 Z 轴 >。这正是 remapCoordinateSystem(inR, AXIS_X, AXIS_Z, outR) 所做的,它保持 X 轴 完整并将 Z 映射到 Y

现在你怎么知道什么时候remap 或不。您可以通过检查

float inclination = (float) Math.acos(rotationMatrix[8]);
if (result.inclination < TWENTY_FIVE_DEGREE_IN_RADIAN 
            || result.inclination > ONE_FIFTY_FIVE_DEGREE_IN_RADIAN)
{
    // device is flat just call getOrientation
}
else
{
    // call remap
}

上面的倾角是设备屏幕与世界东西北平面之间的角度。它显示了设备倾斜的程度。

关于android - 当我的 Android 设备不平时,我应该如何计算方位角、俯仰角和方向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33835346/

相关文章:

android - 任务 ':app:transformClassesWithMultidexlistForDebug' 执行失败。 > java.lang.UnsupportedOperationException(无错误信息)

Android Intent.ACTION_VIEW 基本身份验证

android - 锁定设备方向 - React Native (Android)

math - 对齐 IMU 方向,然后获得相对旋转

algorithm - 模拟退火 - 传感器网络中的传感器定位

javascript - 如何检查用户是否使用 javascript 触摸设备(智能手机)

java - 使用Android中的Stream类从SD卡读取二进制文件

android - 结合使用ProgressDialog和线程时,应用程序因方向更改而崩溃

android - 获取全局坐标中的磁场值

android,在 NanoHTTPD 项目中强制关闭