我读过这篇文章。 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. ]])
它提供了相同的万向节锁。
那么,为什么四元数可以防止万向节锁定呢?
最佳答案
当您围绕不同的轴进行三次单独的旋转时,可能会发生万向节锁定,每次欧拉角旋转都会发生这种情况。对于每组绕多个轴的旋转,总是存在等效的绕一个轴的单次旋转。四元数通过允许您进行一次等效旋转而不是一组三个旋转来阻止万向节锁定,如果以错误的顺序进行,可能会导致万向节锁定。
我希望这对您有所帮助,如果您需要我澄清任何内容或有任何其他问题,请随时提出!
关于python - 举例说明为什么四元数可以防止万向节锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47379408/