附录-欧拉角与万向锁的理解
欧拉角
欧拉角用来在3D世界中表示物体的朝向,从物体的最初始状态(一般会选择和世界坐标系重合作为最初状态)绕着自身坐标系的xyz三个轴进行旋转三个角度,来表示物体的朝向。
例如下图中:

最初蓝色的坐标系xyz,绕着z轴旋转α度,得到绿色的坐标系,x轴指向N的方向;然后再绕最新的坐标系中的y轴旋转γ度,将N旋转到红色的X方向;最后绕最新的X轴旋转β度,得到最新的红色的坐标系。
有一点需要说明的是,欧拉角描述的绕着坐标轴的旋转,都是绕着物体的本地坐标系的坐标轴进行旋转。可见下面的动图:

欧拉角并不是一个静态的数字,它其实是表示从物体的初始状态到目的状态的一个转换过程——进行坐标轴的旋转。
由于使用角度进行表示,那么就会存在一个朝向有无数种角度表示,因此一般欧拉角会限制角度的范围。例如pitch限制在[-90,90]
以内,roll和yaw限制在[-180,180] 范围内。
数学表示
一个欧拉角可以拆分成分别对XYZ三个轴进行旋转得到。因此可以将欧拉角表示成三个旋转矩阵

先绕z轴进行旋转,再绕y轴进行旋转,再绕x轴进行旋转(绕轴旋转的顺序可以随意指定,定好规则就行)。其中三个旋转矩阵如下:

万向锁
假设我们按照z-y-x的顺序对物体进行旋转,先绕z轴旋转α度,再绕y轴旋转90度,再绕x轴旋转β度,这个时候就会出现万向锁。这个时候最后绕x轴旋转β角度,最终得到的效果和绕z轴旋转是一样的,这样就退化成只有两个轴的旋转有作用,另一个轴的自由度丢失了。可以在Unity或UE4中设置Rotation的值看看,当改变绕z或绕x旋转的角度时,物体是在绕同一个轴进行旋转。这就会导致在逻辑上出现问题,导致出现明明数据上是有绕z轴旋转,可是最终的姿态却没有绕z轴旋转的现象。
先从数学上去理解这个问题:
按照上面的旋转矩阵公式,得到

可见,最终的结果只与绕y轴和绕x轴旋转有关,因此无论怎么改变α和β的值,最终的旋转矩阵至于两个轴有关系,另一个轴失去了意义。
而从形象的角度来理解这个问题,可以如下所示

图A:最初物体的朝向,自身坐标系和世界坐标系重合(x,y,z轴分别是红色,绿色,蓝色的箭头)

图B:先绕x轴旋转30°

图C:再绕y轴旋转90°

图D:再绕z轴旋转10°
看图C和图D,可见,当绕Z轴旋转10°的时候,这个时候表现上是绕着红色的X轴旋转了10°,物体的最长边还是竖直的,并没有按照正常情况去绕蓝色的箭头(Z轴)去使最长边不再竖直。
并且上述情况下,和先绕X轴旋转20度,再绕y轴旋转90度得到的最终姿态是一模一样的,如图:

这个时候,在绕y轴旋转90度的情况下,绕x轴旋转20度和先绕x旋转30度再绕z轴旋转10度,最终的物体的姿态是一模一样的。这时以及丧失了在Z轴上的旋转自由度。
理解这个问题的关键在于:欧拉角是由三个角度表示,表示物体从原始姿态到目标姿态的一个变换。无论(α,β,γ)三个角度值是多少,都是得从物体的原始姿态开始进行绕轴进行旋转。所以物体的姿态都是相对于其最原始姿态的,上述图例中说到的,先绕X轴旋转30度,再绕Y轴旋转90度,再绕Z轴旋转10度得到的最终姿态和先绕X轴旋转20度,再绕Y轴旋转90度的结果一样。因此相对于最初姿态而言,当一个欧拉角包含绕Y轴旋转90度时,绕X轴和绕Z轴旋转已经是在绕同一个轴在进行旋转,这个时候只有两个轴在起作用。这个时候就是万向锁的状态。
自己拿一个手机来做一下试验,有助于理解万象锁:
可以拿出手机放在桌面上,屏幕朝上,手机的最长边垂直与桌子的边缘设置为X轴,这个时候屏幕的短边平行于桌子的边缘设置为Y轴,因此垂直与屏幕的向量为Z轴。我们先绕手机的最长边X轴顺时针旋转30度,这个时候手机离开桌面,留下一个长边与桌子接触;然后再绕Y轴,也就是手机的短边旋转90度,让屏幕面与桌子的边缘平行;再绕Z轴旋转10度,也就是绕垂直于屏幕的轴旋转10度,这个时候你会发现,绕Z轴旋转时,屏幕面还是平行桌子的边缘,而此时绕Z轴旋转的角度给手机姿态带来的影响和最开始旋转X轴给手机姿态带来的影响是一样的——都是使手机最终的姿态(已经绕Y轴旋转了90度使得手机屏幕与桌子边缘平行)为绕着垂直于屏幕的轴旋转一定的角度。你完全可以不用绕Z轴旋转,通过调节绕X轴旋转的角度数,使得最终手机的姿态和上述旋转过程达到的姿态一样。此时就是造成了万向锁。
之前看其他地方的各种说法都是说绕Y轴旋转90度后,使得哪两个轴重合了,这个一直没理解到位,其实不应该去这样解释两个轴重合了,都是绕物体的本地坐标系的坐标轴去旋转,怎么可能让物体的两个轴重合。并且还有些拿船上的陀螺仪作为例子讲解的,也不恰当,那个装置的旋转和物体自己去旋转还是不一样,那个装置有结构上的影响。今天算是搞明白了最终的万向锁所表达的意思。
备注: 转载于知乎文章:https://zhuanlan.zhihu.com/p/346718090
浙公网安备 33010602011771号