万向节锁定,不能通过四元数来解决

时间:2013-03-11 18:33:24

标签: android sensor quaternions pitch

当设备旋转一定量时,一个简单的立方体必须以相同的量旋转,但方向相反。例如,如果设备向右旋转45度,则立方体必须向左旋转45度。或者当俯仰为30度时,立方体必须围绕X轴旋转-30度。当偏航为10度时,立方体必须围绕Z轴旋转-10度。我使用了.getRotationMatrixFromVector,然后是getOrientation,如下所示:

if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {

     SensorManager.getRotationMatrixFromVector(
             mRotationMatrix , event.values);
     SensorManager.getOrientation(mRotationMatrix, orientationVals);
     azimuthVal =  (Math.round((Math.toDegrees(orientationVals[0]))*100.0)/100.0);
     pitchVal= (Math.round((Math.toDegrees(orientationVals[1]))*100.0)/100.0);
     rollVal = (Math.round((Math.toDegrees(orientationVals[2]))*100.0)/100.0);}

但是它的间距改变的问题影响滚动,反之亦然,因此当设备围绕X轴旋转时,收缩值改变 - >滚动改变 - >当我不需要时,立方体不仅在X周围旋转,而且在Y周围旋转。

我环顾互联网并且许多人将Quaternions作为解决方案,但我如何将四元数应用于我的特定应用程序,因为我需要知道设备沿轴旋转的度数。

1 个答案:

答案 0 :(得分:0)

当您想要从旋转矩阵中提取(欧拉)旋转角度时会发生万向节锁定,基本上在某些特定旋转时,我们会在旋转矩阵分量和旋转角度之间的方程中失去自由度,并且实际旋转角度不可恢复,

因此在您的代码中可能会发生在: SensorManager.getOrientation(mRotationMatrix,orientationVals);

在提取旋转角度之前,你应该以某种方式解决问题, 这可以通过修改四元数组件来完成,如下所述:

http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/