两种欧拉角与其对应的旋转矩阵求解

欧拉角定义

欧拉角(Euler Angle),由著名数学家莱昂哈德·欧拉(1707-1783)提出,故而得名。欧拉角旨在用三个角度来表示刚体在三维空间的旋转。这种表示方法经历了3个世纪,其实已经非常古老了,自身有一些局限性,塞利斯基(Richard Szeliski)所著《计算机视觉:算法与应用》一书中对欧拉角甚至只是一笔带过。但是欧拉角现在依然在广泛使用,因此仍然有深入学习的必要。

首先我们统一符号:

  • OxyzOxyz是世界坐标系,是固定不变的。
  • OXYZOXYZ是被旋转的局部坐标系。

欧拉角的定义分为静态定义和动态定义。百度上说的很复杂,两种定义方式并没有给出很明确的区分,但是对我们计算需求而言,只需要一点区分就可以了,那就是:旋转是基于全局坐标系还是局部坐标系。

基于局部坐标系的旋转

有点“我绕着自己转”的意思。

最典型的欧拉角旋转为zXZz-X-Z顺序,即刚体先后绕z,X,Zz, X, Z轴旋转角度α,β,γ\alpha, \beta, \gamma。注意字母大小写,即最开始是绕全局坐标系的zz轴旋转,之后按顺序绕自己局部坐标系的XX轴和ZZ轴旋转,考虑到最开始两个坐标系是重合的,即z=Zz=Z,这种旋转顺序也可以理解为ZXZZXZ

这种旋转的流程如图所示。每张图中的红色椭圆代表了旋转轴的法平面。
两种欧拉角与其对应的旋转矩阵求解

在*的对欧拉角的解读中,有一张将过程整合的图,百度上也有但是清晰度要差很多。
两种欧拉角与其对应的旋转矩阵求解

基于全局坐标系的旋转

这种旋转非常好理解,世界坐标系是不变的,刚体的局部坐标系先后绕三个固定的轴作旋转,就是这种欧拉角的效果了。同样的,用分布图解来看,下图显示了顺序为zxyz-x-y的欧拉角所展示的结果:
两种欧拉角与其对应的旋转矩阵求解

三维旋转矩阵

基本旋转矩阵

如果考虑一个很简单的旋转,这个旋转简单到只是绕着某个坐标轴旋转一个角度θ\theta,绕着转的坐标轴所对应的坐标就不会有任何变化,而我们已经知道,二维平面的旋转矩阵是这样的:
R(θ)=[cosθsinθsinθcosθ] R(\theta)=\left[\begin{matrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \\ \end{matrix}\right]
那第三个维度只要保持不变就好了。这就不难理解绕着三个基本坐标轴旋转特定角度所对应的旋转矩阵:
Rx(ψ)=[1000cosψsinψ0sinψcosψ]Ry(θ)=[cosθ0sinθ010sinθ0cosθ]Rz(φ)=[cosφsinφ0sinφcosφ0001] R_x(\psi)=\left[\begin{matrix} 1 & 0 & 0 \\ 0 & \cos\psi & -\sin\psi \\ 0 & \sin\psi & \cos\psi \end{matrix}\right] \\ \quad \\ R_y(\theta)=\left[\begin{matrix} \cos\theta & 0 & \sin\theta \\ 0 & 1 & 0 \\ -\sin\theta & 0 & \cos\theta \end{matrix}\right] \\ \quad \\ R_z(\varphi)=\left[\begin{matrix} \cos\varphi & -\sin\varphi & 0 \\ \sin\varphi & \cos\varphi & 0 \\ 0 & 0 & 1 \end{matrix}\right]
至此,有一个十分关键的点,就是这三个旋转矩阵的适用前提都是刚体的旋转轴是定义坐标时用的坐标系。这很好理解,毕竟这几个矩阵乘以三维向量后,都会有一个坐标值是不改变的,那么旋转就一定是绕这个轴进行的。

旋转矩阵和两种欧拉角

这里的两种欧拉角并不是指两种定义方式,而是上面说的两种参照,是绕自己的轴转,还是绕全局的轴转。

除了旋转方式的差异,我们所诉求的坐标不同也会导致结果的不同。有两种诉求:转向量和转坐标系。前者是旋转向量,同时带动向量的局部坐标系旋转;后者则是旋转局部坐标系,待求的向量在全局坐标系下是保持不变的。有趣的是,如果在转向量时,把局部坐标系作为我们的参考,那么就可以等效为响亮不动而转坐标系的情况。下面先说点固定不动,而转坐标系的情形下,怎么求局部坐标的变换矩阵

规定一些事情以便比较:

  • 最开始全局坐标系和局部坐标系是重合的;

  • 旋转的顺序都是xyz(XYZ)xyz(XYZ)

  • 旋转角保持和前面一节一致:分别是ψ,θ,φ\psi, \theta, \varphi.

绕局部坐标轴旋转

如果旋转是绕着局部坐标系进行的,所有的坐标又都是或可以看成局部坐标系,那么我们就可以当全局坐标系不存在。假设变换前后的固定点在局部坐标系下的坐标分别是P0P_0P1P_1

第一步绕x轴旋转ψ\psi角度,对应的旋转矩阵即为两者之间的坐标变换矩阵:
RxPx=P0 R_xP_x=P_0
注意变换矩阵的位置,是乘在变换后的PxP_x的左边。同理:
RyPxy=PxRzPxyz=Pxy R_yP_{xy}=P_x\\ \quad \\ R_zP_{xyz}=P_{xy}

其中Pxyz=P1P_{xyz}=P_{1}.

三个式子迭代,就得到了
RxRyRzP1=P0 R_xR_yR_zP_1=P_0
两者之间最终的坐标变换矩阵最终是这样的:
Rlocal=RxRyRz R_{local}=R_xR_yR_z
反直觉的是,如果把P1P_1P0P_0的关系换一种方法写:
P1=RzTRyTRxTP0 P_1=R_z^TR_y^TR_x^TP_0
分开的三个矩阵的作用顺序是指定的x-y-z,但他们是以转置,也就是逆矩阵的形式作用在P0P_0上的。

下面问题来了,是不是绕全局坐标系旋转,他们就会以原形式作用呢?往下看。

绕全局坐标轴旋转

对于这个问题,我们完全可以逆着思考:以局部坐标系为参考,那么全局坐标系在这个旋转过程中所做的运动就是反过来的。即按照ZYX的顺序分别转γ,β,α\gamma, \beta, \alpha. 同时,P0P_0在这里就可以当做局部坐标,而P1P_1可以当做全局坐标,于是:
P0=RxTRyTRzTP1Rglobal=RxTRyTRzT P_0=R_x^TR_y^TR_z^TP_1\\ \quad \\ R_{global}=R_x^TR_y^TR_z^T
换一种形式来写:
P1=RzRyRxP0 P_1=R_zR_yR_xP_0
诶,发现了什么:-) 确实是按照x-y-z的顺序以原本的形式作用的。

转向量的情形

和上面的思考方式类似,如果我们不动坐标系而转动向量,得到的结果事实上是和固定向量转坐标系是相反的。

如果绕局部坐标系旋转,那么将全局和局部的坐标系换位置,将局部坐标系作为参考坐标系而看成绕局部坐标系的三个轴同顺序、反方向旋转全局的坐标系,就很容易得到
Rlocal=RxRyRz R_{local}=R_xR_yR_z
也就是前一节的RglobalR_{global}去掉了每一步的转置。同理
Rglobal=RxTRyTRzT R_{global}=R_x^TR_y^TR_z^T
但是要注意的是,这里得到的是坐标变换矩阵,而且是向量全局坐标的变换矩阵。而旋转向量更多的诉求是要计算旋转后向量的结果。那么,就需要将这个矩阵整个取转置放到待转向量左边相乘。

The End

这四种情形之间关系很密切,非常的绕……由于之前在处理BVH(BioVision Motion Capture)文件时,一直对文件里的三轴旋转理解有问题,所以查了很多资料,整理了一下。

本文基于个人理解,如有雷同,是他抄我 ,怎么会雷同呢,真是的:-/

三张图片,除了第二章整合过程图是在*上下载的,其他的两张分步过程图都是原创,要使用的话请注明出处:)

Thx.