gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:39:41 28 4
gpt4 key购买 nike

我使用 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/15649684/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com