旋转变换(二)欧拉角

来源:互联网 发布:上海软件培训机构 编辑:程序博客网 时间:2024/04/29 02:54

欧拉角(Euler Angles)是一种描述三维旋转的方式,其他的方式还包括矩阵、四元数、旋转轴和旋转角等方式。之所以可以用它来描述旋转是来自于欧拉旋转定理。该定理指出:任何一个旋转都可以用三个旋转的参数来表示。

1. 欧拉角的描述

欧拉角的描述方式有很多种,由于关于如何定义欧拉角目前并没有一个标准。因此不同人描述的欧拉角的旋转轴和旋转的顺序都可能是不一样的。这样就带来一个很大的隐患,当使用其他人提供的欧拉角的实现时,需要首先搞清楚他用的是那种约定。对于定义一个欧拉角,需要明确的内容包括:

1. 三个旋转角的组合方式(是xyz还是yzx还是zxy)2. 旋转角度的参考坐标系统(旋转是相对于固定的坐标系还是相对于自身的坐标系)3. 使用旋转角度是左手系还是右手系4. 三个旋转角的记法

下面针对这4条进行详细的阐述:

1.1 旋转角的组合方式

为了方便,我们用x指代只绕x轴的旋转,用y指代只绕y轴进行的旋转。在描述欧拉角的时候可以有以下方式:xyz, yzx,zxy 或者是反向顺序 zyx xzy yxz。由于这些角度并不是独立的,例如当下面的旋转组合:先绕x轴旋转90度,再绕y轴旋转90度,最后绕x轴旋转-90度,这一些列组合得到的效果与只绕z轴旋转-90度是一样的。也就是说我们仅仅在2个平面上进行旋转(其中一个平面上必须进行两次旋转)就可以得到任意的三维旋转。也就是说可以使用以下的方式:xyz、xzx、yxy、yzy、zxz和zyz,总共有12种组合方式。

针对这一条,具体的解释如下:
既然两个平面上的旋转就能组合出任意的三维旋转,那么我们可以不用第三个轴向就可以得出旋转角,这种方式称为Proper Euler angles。

  1. Proper Euler angle(z-x-z,x-y-x,y-z-y,z-y-z, x-z-x,y-x-y)
  2. Tait-Bryan angle (x-y-z,y-z-x,z-x-y,x-z-y,z-y-x,y-x-z)【也称作:Cardan angles; nautical angles; heading,elevation,bank; yaw,pitch,rooll】
    有时候这两种方式都被称为欧拉角,这种情况下,第一种方式被称为proper或者经典(classic)的欧拉角。

1.2 旋转的参考坐标系

在描述这3个旋转角的时候,可以是相对于某个固定的坐标系统(称为extrinsic rotations),也可以是相对于物体自身的坐标系统(称为intrinsic rotations)。因此结合上面提到旋转角的组合方式,总共的排列组合是24种。
关于这一点解释如下:
使用绕固定坐标系的旋转,看起来更加自然和易于理解,在图形学或者是游戏编程中,所有场景中的对象都有着统一的世界坐标的情况下,使用这种方式来处理场景中的旋转更加方便。后一种方式在物理学中比较常用。(关于两种方式的详细说明见参考文献5)

1.3 旋转是左手系还是右手系

并不是说坐标系统是左手系还是右手系。而是只如何确定旋转角度是正还是负,如果是右手系,那么角度是正的方式是:从旋转轴反方向观察,逆时针方向的旋转是正、顺时针方向的旋转是负。(或者这样描述:使用右手的大拇指指向旋转轴,其他4个手指在握拳过程中的指向便是正的角度)
PositiveAngle

1.4 旋转角的记法

为了便于后续的讨论,本文中使用以下的约定和记法:

顺序 飞行器 望远镜 符号 角速度 第一 heading azimuth θ yaw 第二 attitude elevation ϕ pitch 第三 bank tilt ψ roll

关于这上表的描述图如下所示:

EulerAngle

2. 连续的旋转

假设我们对物体进行一次欧拉角描述的旋转,三个欧拉角分别是(a1,a2,a3),之后我们再进行一次旋转,三个欧拉角描述是(b1,b2,b3),那么我们能否只用一次旋转(使用欧拉角描述(c1,c2,c3))来达到这两次旋转相同的效果呢?事实上这样是非常困难的,我们不能够仅仅使用(a1+b1,a2+b2,b3+b3)来得到这三个角度。一般来说我们会将欧拉角转换成旋转矩阵或者是四元数来进行连续旋转的叠加计算,之后再转换回欧拉角。但是这样做的次数多了可能会引入很大的误差导致旋转结果出错。因此比较好的方案是直接使用旋转矩阵或四元数来计算这类问题。

3. 万向节死锁(Gimbal lock)

万向节是一个悬挂起来的环,可以绕一个固定的轴进行旋转,一般万向节是多个嵌套在一起,实现绕多个轴向的旋转,如下图所示:

Glimbal

在使用欧拉角描述旋转的过程中,可能会出现一种被称为“万向节死锁”的情况。万向节死锁是指在旋转过程中丢失了旋转的一个维度,这种情况出现在旋转过程中两个轴向平行,导致旋转仅仅只能在两个维度上进行。万向节死锁的两个示例:

3.1 二维万向节死锁

假设我们使用固定的望远镜来跟踪一架飞机,望远镜可以在水平和垂直方向自由的转动,当飞机正好飞过望远镜的头顶时,突然转向90度飞行,这时候我们发现如果不调整望远镜的垂直角度,我们是没有办法再跟踪飞机了。也就是说我们必须执行一次不连续的操作,才能去继续观察飞机,不可能一直连续的跟踪飞机,这里出现的就是万向节的死锁。说“死锁”这个词其实并不准确,轴并没有被锁住,还是可以绕它进行旋转,只是绕它的旋转没有任何意义,不能改变望远镜的指向。

3.2 三维万向节死锁

如下图所示,使用欧拉角(pitch、yaw、roll)来描述飞机的状态,当飞机pitch为90度后(绿色),在进行roll和yaw实际上是相同的效果(蓝色和牡丹红色),不能在实现yaw的旋转了。也就说出现了死锁

万向节死锁

3.3 数学意义上的解释

当我们用欧拉角来描述一个旋转时,一种矩阵的描述是:
Euler
β角为π/2时,得到:
Euler2
使用矩阵乘法得到:
Euler3
使用三角函数公式,化简得到:
Euler4
这种情况下,当我们修改α或者修改γ,事实上效果是一样的(只有这时候我们不改变β),这时候实际上出现的就是我们所说的万向节死锁。

4. 解决方案

由于上文中提到的欧拉角的诸多问题,因此在使用中要格外的小心,如果一定要使用欧拉角,在使用中需要注意:
1. 选择欧拉角的约定一定要一致
2. 根据具体的应用,尽量选择能够避免产生万向节死锁的约定
更好的描述旋转的方式可以使用 四元数、旋转矩阵或者是单一的方向向量和旋转角的方式(不要把旋转分割成三个的值)

参考文献:

  1. Maths - Euler Angles
  2. Wiki-Euler angles
  3. Euler Angles
  4. Wiki-Gimbal lock
  5. 欧拉角、内部旋转、外部旋转
2 1