3

我正在尝试获取以欧拉角表示的 android 设备的偏航。

需要明确的是,我不想要“方位角”(即与磁北的角度),我想要安卓设备的“z”轴旋转,如图所示。

在此处输入图像描述

这个(恕我直言)应该是一些汽车游戏中用来确定转向量的轴。

据我了解,我可以只使用加速度计值(没有磁场),但我无法获得确定的值。(可能是由于对旋转矩阵的工作原理缺乏了解)。

有人可以指出我正确的方向吗?

4

1 回答 1

2

如果您想计算与设备位置无关的设备 z 轴旋转(即平坦或不平坦),那么您必须跟踪一些事情。如果应用程序同时支持纵向和横向,那么它会更复杂,当活动仅限于纵向时,我将给出答案。

这里的平坦意味着间距小于 25 度或大于 155 度,否则不平坦。
当设备从平面过渡到非平面时,反之亦然,UI 中可能存在一些不一致。

注册TYPE_GRAVITYTYPE_MAGNETIC_FIELD(公寓需要)并进行以下计算。

  • getRotationMatrix

    a[0] a[1] a[2]
    a[3] a[4] a[5]
    a[6] a[7] a[8]

  • 计算pitch = Math.asin(-R[7])

  • 用以确定设备的平整度(我觉得可以用pitch小于45和大于135来确定平整度,你只需要试验看azymuth数值是否正确)
  • 如果设备不平坦,则旋转为 Math.atan2(a[6], a[7])

  • 如果设备是平的,则首先获取初始azymuth = Math.atan2(R[1], R[4])值,然后与后续值取差值azymuths以获取旋转。

  • 如果设备从平面过渡到非平面,旋转应该没有问题,只是上面的非平面旋转。

  • 如果设备从不平坦过渡到平坦,那么您需要获取初始azymuth. 这个初始azymuth值可以设置为后置摄像头方向 Math.atan2(-a[2], -a[5]),如果设备是直立的并且只围绕 z 轴旋转,那么这个方向不应该改变。实际上,它可能会改变几度,因此您需要取平均值。

除了 Math.atan2(a[6], a[7]) 之外的所有数学都在Android 中进行了解释:SensorManager.getRotationMatrix 和 SensorManager.getOrientation() 的算法
所以让我解释一下当设备不是时找到旋转平坦的。

如上面链接中所述,您必须指定要计算它们之间角度的固定向量和变化的向量。在这种情况下,变化的矢量是位于设备 y 轴上的矢量,而固定矢量是重力矢量在设备 xy 平面中的投影。在最后一行上方的旋转矩阵中是设备坐标中的归一化重力矢量,因此到设备 xy 平面的投影为 (a[6], a[7])。现在通过简单的三角函数可以看出 Math.atan2(a[6], a[7]) 是设备 y 轴与重力投影之间的夹角。(如果看不到,请画图)。

于 2016-02-14T22:41:47.007 回答