四元数可以防止万向节锁定的一个例子

时间:2017-11-19 16:52:54

标签: python math 3d

我看了这个。 https://matthew-brett.github.io/transforms3d/gimbal_lock.html

它举了一个万向节锁的例子

>>> import numpy as np
>>> np.set_printoptions(precision=3, suppress=True)  # neat printing
>>> from transforms3d.euler import euler2mat, mat2euler
>>> x_angle = -0.2
>>> y_angle = -np.pi / 2
>>> z_angle = -0.2
>>> R = euler2mat(x_angle, y_angle, z_angle, 'sxyz')
>>> R
array([[ 0.   ,  0.389, -0.921],
       [-0.   ,  0.921,  0.389],
       [ 1.   , -0.   ,  0.   ]])

然后我尝试了这个: http://kieranwynn.github.io/pyquaternion/

q1 = Quaternion(axis=[1, 0, 0], angle=-0.2)
q2 = Quaternion(axis=[0, 1, 0], angle=-numpy.pi/2)
q3 = Quaternion(axis=[0, 0, 1], angle=-0.2)
q4 = q3 * q2 * q1;
q4.rotation_matrix
array([[ 0.        ,  0.38941834, -0.92106099],
       [ 0.        ,  0.92106099,  0.38941834],
       [ 1.        ,  0.        ,  0.        ]])
它给了同样的万向节锁。

那么,为什么Quaternion会阻止万向节锁?

1 个答案:

答案 0 :(得分:2)

当您围绕不同的轴进行三次单独的旋转时会发生万向节锁定,每个旋转角都会旋转。对于围绕多个轴的每组旋转,总是围绕一个轴进行等效的单个旋转。四元数通过允许你采取这个单一的等效旋转而不是一组三个旋转来停止万向节锁定,如果以错误的顺序完成,则可以创建万向节锁定。

我希望这有帮助,如果您需要我澄清任何内容或有任何其他问题随时可以提出来!