1

我们从 android 的 SensorManager.getOrientation() 得到的偏航俯仰和滚动都是针对手机的 Y 轴的。我的意思是,偏航和俯仰表示 Y 轴指向的位置,而滚动是关于 Y 轴的。(并且我的屏幕方向固定为横向,因此 Y 轴不会改变)。但我想要的是负 Z 轴(指向手机)的偏航俯仰和滚动更像是如果我的手机屏幕是飞机驾驶舱中的横向窗口,偏航俯仰和滚动会是什么?

4

2 回答 2

2

如果我明白你在说什么,你会看到当前的偏航俯仰和滚动正在返回,好像 +y 轴是默认的“前”向量,而 +z 轴是默认的“上”向量。您想进行坐标变换,以便使用 -z 轴作为默认的“前”向量和 +x 轴作为默认的“上”向量来计算偏航、俯仰和滚动。

首先,您需要根据当前配置中的偏航、俯仰和滚动计算当前的前向和向上矢量。这可以使用 3D 旋转矩阵来完成: http ://en.wikipedia.org/wiki/Rotation_matrix#Rotations_in_three_dimensions

使用偏航角绕 z 旋转,俯仰作为绕 x 的旋转,滚动作为绕 y 的旋转。将这些矩阵相乘,然后将前向量 (0, 1, 0) 和上向量 (0, 0, 1) 乘以结果,得到新的前向量和上向量。

接下来,您需要计算新的偏航角、俯仰角和滚动角。Yaw 是投影到 yz 平面的前向量(将 x 值设置为 0)和 -z 向量(0, 0, -1)之间的角度,pitch 是投影到 xz 平面上的前向量和 - z 向量,roll 是投影到 xy 平面上的向上向量与 +x 向量 (1, 0, 0) 之间的角度。如果我们让 Fx = 前向量的 x 分量,Fy 是 y 分量,依此类推,我们得到:

yaw   = acos ( -z dot (0,  Fy, Fz) ) / sqrt(Fy*Fy + Fz*Fz)
pitch = acos ( -z dot (Fx, 0,  Fz) ) / sqrt(Fx*Fx + Fz*Fz)
roll  = acos ( +x dot (Ux, Uy, 0 ) ) / sqrt(Ux*Ux + Uy*Uy)

如果我选择了错误的向量,您应该可以对其他向量执行此操作。

于 2012-01-25T03:45:29.347 回答
0

Android 中使用的身体轴约定与航空航天中使用的不同(有充分的理由)。“平面”的 x 轴相当于 Android 设备的“y”轴(同样,x 轴与 y 轴相关,正或负取决于 ENU ro NED conevntions)。可以在这里找到一篇关于 Yaw Pitch 和 Roll 约定的好文章,这可能是回答您问题的开始: http ://www.sensorplatforms.com/understanding-orientation-conventions-mobile-platforms/

于 2013-04-26T01:10:11.993 回答