获取Android设备的Euler Yaw角度

时间:2016-02-09 22:04:05

标签: android android-sensors android-orientation sensor-fusion

我试图让以欧拉角度表达的Android设备偏航。

要明确我不想要' Azimuth' (这是与磁北的角度)我想要旋转'' z' Android设备的轴如图所示。

enter image description here

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

注册time_lengthfloor(平面所需)并进行以下计算。

  • TYPE_GRAVITY

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

  • 计算TYPE_MAGNETIC_FIELD

  • 使用getRotationMatrix确定设备的平整度(我认为您可以使用少于45且超过135来确定平坦度,您只需要尝试查看pitch = Math.asin(-R[7])值是否正确)
  • 如果设备不平坦,则旋转为Math.atan2(a [6],a [7])

  • 如果设备一开始是平的,请获取初始pitch,然后与后续的azymuth取得差异以获得轮换。

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

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

除了Math.atan2(a [6],a [7])之外的所有数学运算都在Android: Algorithms for SensorManager.getRotationMatrix and SensorManager.getOrientation()解释了 因此,让我给出解释,以便在设备不平坦时找到旋转。

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