欧拉角
在表示三维空间坐标系变换或旋转操作时常用的方式包括欧拉角、旋转矩阵和四元数等,但是其中只有欧拉角是我们人类可以直观感受的,其按照不同的坐标轴依次旋转相应的角度来表示整个旋转变换。通常欧拉角表示的旋转过程可以用以下步骤描述(这里我们用常用的一个旋转顺序:Z-轴(Yaw)~Y-轴(pitch)~X-轴(Roll)来举例):
1. 绕物体的Z-轴旋转度。
2. 绕经过1旋转操作后的物体坐标的Y-轴旋转度。
3. 绕经过1,2旋转操作后的物体坐标的X-轴旋转度。
万向节锁
在大多数情况下按照上述3个步骤旋转特定的角度后就可以得到想要的旋转变换。然而,在某些时候却会出现问题,即常说的会出现万向节锁问题。首先来看万向节锁的一个解释:当俯仰角(pitch)(这里是俯仰角,当用其他旋转顺序时就是第2步旋转的角度)旋转的角度为时,会导致第一次旋转和第三次旋转使用的旋转轴是相同的,从而导致失去一个旋转的自由度,出现奇异性问题。
注意:只有像上述的表示旋转的过程,即每次旋转的旋转轴都是被前面所有旋转操作旋转后的本体坐标系下的轴,才会出现万向节锁问题,而如果每次旋转都按照另一个固定的参考系的旋转轴依次旋转则不会出现万向节锁问题。出现万向节锁问题时,所说的因为缺少了一个旋转自由度,是相对该固定参考系而言的。下面以一个具体的例子说明万向节锁问题。
如图所示坐标系--为世界坐标系,整个旋转过程中固定不变,坐标系x-y-z为物体坐标系,随着物体旋转而旋转。初始时物体坐标系和世界坐标系重合,如图(a)所示。现在,按照前面所述的欧拉角的旋转步骤旋转物体。首先,按照物体坐标系的z-轴旋转度,得到的结果如图(b)所示;然后,按照此时的物体坐标系的y-轴(即世界坐标系下的-轴)旋转,得到如图(c)所示结果;最后,再按照此时的物体坐标系的x-轴(即世界坐标系下的-轴)旋转度,得到如图(d)所示的结果,此时物体坐标系在世界坐标系下的坐标为--。
如果在世界坐标系下来看上述的欧拉角旋转过程,可以描述为:首先,绕世界坐标系下的-轴旋转角度;然后,按照世界坐标系下的-轴旋转;最后,又按照世界坐标系下的-轴旋转角度。因此,整个旋转过程在世界坐标系下只用到了两个轴来表示,失去了一个旋转的自由度。针对上述情形,只要第一次旋转的角度和第三次旋转的角度的和等于+,都可以得到同样的结果,也就是说和的值有多种取法,其值并不唯一,这种不“不唯一”性就叫做奇异性。此时,用相应的公式或函数得不到唯一的解,如果用计算机进行计算,计算机将不知道和分别该取多少值,这个问题就被称为万向节锁问题。
通常在计算欧拉角的时候,针对第二次旋转角度为度的情况,需要做特别的鉴别和处理,以免计算得到严重错误的结果。具体的解决办法,有很多论文和帖子已经讨论过了,这里不做赘述。