我正在尝试获取以欧拉角表示的 android 设备的偏航。
需要明确的是,我不想要“方位角”(即与磁北的角度),我想要安卓设备的“z”轴旋转,如图所示。
这个(恕我直言)应该是一些汽车游戏中用来确定转向量的轴。
据我了解,我可以只使用加速度计值(没有磁场),但我无法获得确定的值。(可能是由于对旋转矩阵的工作原理缺乏了解)。
有人可以指出我正确的方向吗?
我正在尝试获取以欧拉角表示的 android 设备的偏航。
需要明确的是,我不想要“方位角”(即与磁北的角度),我想要安卓设备的“z”轴旋转,如图所示。
这个(恕我直言)应该是一些汽车游戏中用来确定转向量的轴。
据我了解,我可以只使用加速度计值(没有磁场),但我无法获得确定的值。(可能是由于对旋转矩阵的工作原理缺乏了解)。
有人可以指出我正确的方向吗?
如果您想计算与设备位置无关的设备 z 轴旋转(即平坦或不平坦),那么您必须跟踪一些事情。如果应用程序同时支持纵向和横向,那么它会更复杂,当活动仅限于纵向时,我将给出答案。
这里的平坦意味着间距小于 25 度或大于 155 度,否则不平坦。
当设备从平面过渡到非平面时,反之亦然,UI 中可能存在一些不一致。
注册TYPE_GRAVITY
和TYPE_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 轴与重力投影之间的夹角。(如果看不到,请画图)。