python - 举例说明为什么四元数可以防止万向节锁定

标签 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.        ]])

它提供了相同的万向节锁。

那么,为什么四元数可以防止万向节锁定呢?

最佳答案

当您围绕不同的轴进行三次单独的旋转时,可能会发生万向节锁定,每次欧拉角旋转都会发生这种情况。对于每组绕多个轴的旋转,总是存在等效的绕一个轴的单次旋转。四元数通过允许您进行一次等效旋转而不是一组三个旋转来阻止万向节锁定,如果以错误的顺序进行,可能会导致万向节锁定。

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

关于python - 举例说明为什么四元数可以防止万向节锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47379408/

相关文章:

python - 椭圆和圆之间的碰撞检测

math - 查找 3 个球体之间的交点

c++ - 将 2D 位图转换为 3D 立方体模型的有效方法?

python - 如何从字典中删除某些项目?

python - 如何在 Linux 机器上使用 Python 获取文件夹的所有者和组?

python - seaborn 使用 matplotlib scatter 循环颜色

algorithm - 找到分数在费里序列中的位置

python - 在 VisPy 中显示旋转立方体表面的图像

c++ - 制作 3d 视频游戏需要哪些关键工具和步骤?

python - 使用nodejs接收python代码