欧拉角与四元数
欧拉角
简介
简单来说,欧拉角就是物体绕坐标系的三个坐标轴()的旋转角度,可以用于表示刚体当前的姿态。如下图所示:
图片中即为上述的三次旋转(其实可以绕某一轴,一次旋转即可达到最终位置)。
在这里,坐标系可以是 世界坐标系(),也可以是 刚体坐标系 (),它的旋转顺序也是任意的。
欧拉角可以分成两种情况:
- 静态:绕 世界坐标系 ()三个轴的旋转,由于 物体旋转过程中坐标轴保持静止,所以称为静态;
- 动态:绕 刚体坐标系 ()三个轴的旋转,由于 物体旋转过程中坐标轴随着物体做相同的转动,所以称为动态。
上图具体的旋转步骤为:
- 绕 世界坐标系 的 轴,旋转 度;
- 绕 刚体坐标系 的 轴,旋转 度;
- 绕 刚体坐标系 的 轴,旋转 度。
欧拉角遵循的是 右手坐标系,即大拇指指向坐标轴正方向,四指旋转的方向即为转动的正方向,欧拉角包含三个自由量:Yaw(偏航角)、 Pitch (俯仰角)、Roll(翻滚角),相当于有三个独立变量(自由度)控制一架飞机进行如下旋转操作:
如何区分 Roll、Pitch、Yaw?
首先应先给定物体一个姿态,就是确定其前后、左右、上下,这样就能对应 Roll、Pitch、Yaw。结合建立在物体上的坐标系,就可以搞定了。
绕着 前后 轴(Front-to-Back Axis)旋转角度为 Roll;
绕着 左右 轴(Side-to-Side Axis)旋转角度为 Pitch;
绕着 竖直 轴(Vertical Axis)旋转角度为 Yaw。
Tips:
- 在物体上可以随意建立坐标系,这就意味着坐标轴的方向也是可以随意设定,因此仅仅说绕着某个坐标轴旋转就是 Pitch 在另一个坐标系中可能就不适用。
- 先确定坐标系,然后绕固定坐标轴的旋转确定 Roll、Pitch、Yaw 的方式在特定的场合或领域是非常方便的,比如在航空、航海等,尤其是对于刚刚接触新手来说,死记硬背就好了,在这个圈里混,规矩就是这。
- 对于有些场合,比如医疗器械、游戏开发等,绕某个轴旋转方式确定 Roll、Pitch、Yaw 就会带来一些理解上的问题。
上面动图旋转步骤为 ,按照顺序标记为 ,加上角度即为一个完整欧拉角:
右手坐标系
如上所述,欧拉角遵循的是 右手坐标系,那么与之相对的肯定有左手坐标系,左手坐标系与右手坐标系最大的区别就是,如果将这两个坐标系的两个轴方向对齐,那么另一个轴的方向必定相反,因为左手坐标系目前我还没有用过,所以这里只列出右手坐标系的判断规则。如下图所示:
万向节死锁
万向节死锁发生在欧拉角形式下,是由欧拉旋转定义本身造成的。
当任何一个坐标轴旋转角度为 90 度时,就会有两个轴的旋转动作起到对总体旋转结果相同的效果,这就被称为“死锁”,动图如下所示:
1. 翻滚
2. 俯仰
3. 偏航
4. 死锁
现在看起来,这个陀螺仪一切正常,在船体发生任意方向摇晃都可以通过自身调节来应对。然而,真的是这样吗?
假如,船体发生了剧烈的变化,此时船首仰起了 90 度,此时的陀螺仪调节状态如下图:
现在,转子不平衡了,陀螺仪的三板斧不起作用了。它失去了自身的调节能力。那么这是为什么呢?
之前陀螺仪之所以能通过自身调节,保持平衡,是因为存在可以相对旋转的连接头。在这种情况下,已经不存在可以相对旋转的连接头了。
那么连接头呢?去了哪里?显然,它还是在那里,只不过是,连接头可以旋转的相对方向不是现在需要的按着 轴方向。从上图中,我们清楚地看到:
- 红色连接头:可以给予一个相对俯仰的自由度。
- 绿色连接头:可以给予一个相对偏航的自由度。
- 蓝色连接头:可以给予一个相对偏航的自由度。
没错,三个连接头,提供的自由度只对应了 俯仰 和 偏航 两个自由度,翻滚 自由度丢失了。这就是陀螺仪上的“万向节死锁”问题。
总结来说,欧拉角的“万向节死锁”问题,是由于欧拉旋转定义本身造成的。这种围绕选旋转前固定轴的先 、再 、再 的旋转操作,与其最终所预期的三个轴向可以旋转的结果并非一定是一对一的映射。某些情况下是多对一的映射,造成一些旋转自由度的缺失,也就是“死锁”。
在编程中很难规避死锁,所以现在更多使用四元数形式进行姿态表示与旋转。
四元数
quaternion.pdf (krasjet.github.io)
Visualizing quaternions | 3blue1brown + Ben Eater
四元数转欧拉角