旋转,旋转矩阵和欧拉角(内旋、外旋)

最近学习过程中看到欧拉角的外旋等价于内旋的相反顺序,对此自己有些困惑,无法理解,所以查阅了一些资料,并添加自己的一些理解,整理为如下内容。大家阅读过程中如果发现了错误,欢迎指正。

1. 旋转坐标变换

在进行叙述之前,首先梳理一遍旋转坐标变换。 对于旋转,可以分为两类,对向量的旋转和对坐标系的旋转(坐标系由三个轴的向量组成,本质也是对向量的旋转)。(对于旋转,向量和坐标相似,以下不做区分)

1.1. 对向量的旋转

这是最常见的和容易理解的,我们一般都会认为坐标系是固定不动的,而旋转作用于物体上。即在旋转之后,坐标系的位置是固定不变的,而向量的方向发生改变,即向量坐标改变。
t 1 = f ( t ) \mathbf t_1 = f(\mathbf t) t1=f(t)
这里我们使用抽象的函数表达式 f ( x ) f(x) f(x)表示旋转操作, f ( x ) f(x) f(x)可以是旋转矩阵、四元数等。对于向量 t \mathbf t t,如果是3维空间(默认为3维),则为 ( a , b , c ) T (a, b, c)^T (a,b,c)T,这里 a , b , c a, b, c a,b,c分别是向量在三个坐标轴 ( u , v , w ) (\mathbf u, \mathbf v, \mathbf w) (u,v,w)的分量。

1.2. 对坐标系的旋转

除了对向量的旋转,另一种是对坐标系的旋转。这一种在机器人学中是很常见的。由于机器人中存在非常多的坐标系,需要描述不同坐标系之间的旋转关系。
坐标系旋转
下面我们以上图的两个坐标系进行说明(这里忽略坐标系之间的位置平移,仅考虑旋转)。上图中,map1坐标系由map坐标系旋转得到,计算由map到map1的旋转变换。由于坐标系是有三个向量表示,也就是三个坐标轴方向的向量由map变换到map1坐标系的方向。假设map坐标系中x, y, z三个坐标轴的向量为 ( u , v , w ) (\mathbf u, \mathbf v, \mathbf w) (u,v,w),旋转后 ( u 1 , v 1 , w 1 ) (\mathbf u_1, \mathbf v_1, \mathbf w_1) (u1,v1,w1),则
u 1 , v 1 , w 1 = f ( u , v , w ) \mathbf u_1, \mathbf v_1, \mathbf w_1 = f(\mathbf u, \mathbf v, \mathbf w) u1,v1,w1=f(u,v,w)
A = ( u , v , w ) \mathbf A=(\mathbf u, \mathbf v, \mathbf w) A=(u,v,w) A 1 = ( u 1 , v 1 , w 1 ) \mathbf A_1 = (\mathbf u_1, \mathbf v_1, \mathbf w_1) A1=(u1,v1,w1),则上式变为:
A 1 = f ( A ) \mathbf A_1 = f(\mathbf A) A1=f(A)

1.3. 两种旋转方式的等价性

上述两种旋转方式,本质上是等价的。对于向量的旋转,假设坐标系是固定不动的。由于运动是相对的,这种旋转也可以等价为向量不动,而坐标系发生了反方向的旋转。其旋转的结果都是向量相对于坐标系的方向产生变化,且变化结果相同,即在旋转之后,这两种方式的向量在坐标系的表示是相等的。

初始图
旋转向量
旋转坐标系

如果是对向量进行旋转,向量旋转之前的坐标为 t \mathbf t t,旋转之后的坐标为 t 1 = f ( t ) \mathbf t_1 = f(\mathbf t) t1=f(t)
如果是对坐标系进行旋转,坐标系旋转之前,向量的坐标为 t \mathbf t t。坐标系旋转之后,虽然从全局的位置看,向量的方向没有改变,但是坐标系 A \mathbf A A方向发生了改变,变为了 A 1 \mathbf A_1 A1,此时向量在新的坐标系中的表达式将改变。所以 A 1 t 1 = A t \mathbf A_1\mathbf t_1 = \mathbf A\mathbf t A1t1=At,即 t 1 = A 1 − 1 A t \mathbf t_1 =\mathbf A_1^{-1}\mathbf A\mathbf t t1=A11At
下面将通过旋转矩阵说明两种方式得到的 t 1 \mathbf t_1 t1是相等的。

2. 旋转矩阵

下面使用旋转矩阵和具体的解析表达式对上述进行解释和说明。
在这里插入图片描述
首先是使用旋转矩阵对向量的旋转。对于向量 b \mathbf b b,开始位置在 b 1 \mathbf b_1 b1,围绕Z轴逆时针旋转 θ \theta θ度得到 b 2 \mathbf b_2 b2,则这个旋转矩阵可以表示为:
R = [ c o s ( θ ) − s i n ( θ ) 0 s i n ( θ ) c o s ( θ ) 0 0 0 1 ] \mathbf R = \begin{bmatrix} cos(\theta) & -sin(\theta) & 0 \\ sin(\theta) & cos(\theta) & 0 \\ 0 & 0 & 1 \end{bmatrix} R= cos(θ)sin(θ)0sin(θ)cos(θ)0001

下面是使用旋转矩阵对坐标系的旋转。首先,假设空间中存在一个全局坐标系 T \mathbf T T,存在一个向量 b \mathbf b b。另外,存在两个坐标系 T 1 = ( u 1 , v 1 , w 1 ) \mathbf T_1 = (\mathbf u_1, \mathbf v_1, \mathbf w_1) T1=(u1,v1,w1) T 2 = ( u 2 , v 2 , w 2 ) \mathbf T_2 = (\mathbf u_2, \mathbf v_2, \mathbf w_2) T2=(u2,v2,w2),向量在两个坐标系的表达式分别为 b 1 \mathbf b_1 b1 b 2 \mathbf b_2 b2。其中 T 1 \mathbf T_1 T1 T 2 \mathbf T_2 T2的坐标轴向量的具体表达式都是在全局坐标系 T \mathbf T T下表示的。
对于同一个向量 b \mathbf b b,在不同的坐标系下的完整表达式都应该是相等的,且都等于在全局坐标系 T \mathbf T T下的表达式,即 T 1 b 1 = T 2 b 2 = b \mathbf T_1\mathbf b_1 = \mathbf T_2 \mathbf b_2 = \mathbf b T1b1=T2b2=b。所以 b 1 = T 1 − 1 T 2 b 2 \mathbf b_1 = \mathbf T_1^{-1}\mathbf T_2 \mathbf b_2 b1=T11T2b2。令 R = T 1 − 1 T 2 \mathbf R = \mathbf T_1^{-1}\mathbf T_2 R=T11T2,即旋转矩阵。则上式变为 b 1 = R b 2 \mathbf b_1 = \mathbf R\mathbf b_2 b1=Rb2,等价于将坐标系从 T 2 \mathbf T_2 T2旋转到 T 1 \mathbf T_1 T1后,向量的坐标变化。
这里使用了三个坐标系,全局坐标系 T \mathbf T T,两个局部坐标系 T 1 \mathbf T_1 T1 T 2 \mathbf T_2 T2。对于全局坐标系 T = ( u , v , w ) \mathbf T = (\mathbf u, \mathbf v, \mathbf w) T=(u,v,w),其基底一般为单位矩阵。对于坐标系 T 1 \mathbf T_1 T1 T 2 \mathbf T_2 T2,其基底是坐标系向量轴在全局坐标系下的表示,是标准正交基,但一般不是单位矩阵。
根据上面对坐标系关系的表述,全局坐标系不一定需要显式指定,可以假定坐标系 T 1 \mathbf T_1 T1与全局坐标系 T \mathbf T T重合。此时,坐标系 T 1 \mathbf T_1 T1的基底是单位矩阵,而 T 2 \mathbf T_2 T2的基底是坐标轴向量在坐标系 T 1 \mathbf T_1 T1下的表示。回到旋转矩阵 R = T 1 − 1 T 2 \mathbf R = \mathbf T_1^{-1}\mathbf T_2 R=T11T2,此时 T 1 \mathbf T_1 T1是单位矩阵,即 R = T 2 \mathbf R = \mathbf T_2 R=T2,这里 T 2 \mathbf T_2 T2就是前面说的, T 2 \mathbf T_2 T2的基底是坐标轴向量在坐标系 T 1 \mathbf T_1 T1下的表示。
下面我们通过绕Z轴的旋转举例说明。假定坐标系 T 2 \mathbf T_2 T2绕Z轴顺时针旋转 θ \theta θ度得到坐标系 T 1 \mathbf T_1 T1,则 T 2 \mathbf T_2 T2 T 1 \mathbf T_1 T1下的表达式为:
T 2 = [ c o s ( θ ) − s i n ( θ ) 0 s i n ( θ ) c o s ( θ ) 0 0 0 1 ] \mathbf T_2 = \begin{bmatrix} cos(\theta) & -sin(\theta) & 0 \\ sin(\theta) & cos(\theta) & 0 \\ 0 & 0 & 1 \end{bmatrix} T2= cos(θ)sin(θ)0sin(θ)cos(θ)0001
由于 R = T 2 \mathbf R = \mathbf T_2 R=T2,即上述的旋转矩阵 R \mathbf R R表示将坐标系 T 2 \mathbf T_2 T2旋转到 T 1 \mathbf T_1 T1
在这里插入图片描述
从上面的推导可以看到, R = [ c o s ( θ ) − s i n ( θ ) 0 s i n ( θ ) c o s ( θ ) 0 0 0 1 ] \mathbf R = \begin{bmatrix} cos(\theta) & -sin(\theta) & 0 \\ sin(\theta) & cos(\theta) & 0 \\ 0 & 0 & 1 \end{bmatrix} R= cos(θ)sin(θ)0sin(θ)cos(θ)0001 ,既可以表示一个向量围绕Z轴逆时针旋转了 θ \theta θ度,也可以表示坐标系围绕Z轴顺时针旋转了 θ \theta θ度。下面通过图示的方式展示了两种旋转之间的等价性。

3. 欧拉角

在有了上面的基础上,接下来就可以了解欧拉角中让人困惑的内旋和外旋。
欧拉角是用来描述刚体或坐标系在一个固定坐标系中的姿态,通过使用三个坐标轴的旋转分量,来描述旋转。欧拉角根据旋转轴的不同,以及旋转顺序的不同,分为不同的类别。这里我们主要介绍内旋和外旋的区别。
介绍内旋和外旋之前,首先要说明两个坐标系,一个是全局坐标系,在旋转过程中是固定不变的,另一个是局部坐标系,是固定在刚体身上的。对刚体的旋转可以等价是对局部坐标系的旋转。总体来说,内旋和外旋是根据围绕坐标系的不同进行判断,内旋是围绕局部坐标系进行的,而外旋是围绕全局坐标系进行的。

3.1. 内旋

内旋就是围绕着局部坐标系进行的。这里以z-y-x的顺序,先后绕这三个轴的旋转角度为 α , β , γ \alpha, \beta, \gamma α,β,γ。下图中,红色坐标轴为x方向,绿色为y方向,蓝色为z方向。
在这里插入图片描述
欧拉角的三次旋转,前后对应四个刚体的局部坐标系,我们分别假设坐标系为 T 0 , T 1 , T 2 , T 3 \mathbf T_0, \mathbf T_1, \mathbf T_2, \mathbf T_3 T0,T1,T2,T3。下面使用旋转矩阵描述这些旋转过程。

  1. T 0 → T 1 \mathbf T_0 \to \mathbf T_1 T0T1 ,围绕 T 0 \mathbf T_0 T0的Z轴旋转 α \alpha α
    注意目标是计算旋转之后刚体在全局坐标系的位姿,而刚体在局部坐标系的位姿是保持不变的,只是不同时刻局部坐标系位姿不同。假设刚体上的一个点在局部坐标系的坐标为 p p p。刚体开始的初始局部坐标系 T 0 \mathbf T_0 T0,我们假定与固定的全局世界坐标系 T \mathbf T T重合。
    当旋转到 T 1 \mathbf T_1 T1时,刚体上的点在 T 0 \mathbf T_0 T0坐标系的坐标为 p 0 1 = R 01 p 1 1 p_0^1 = \mathbf R_{01}p_1^1 p01=R01p11,这里 p 0 1 p_0^1 p01中的1表示刚体位于 T 1 \mathbf T_1 T1位置,0表示点在 T 0 \mathbf T_0 T0的坐标, p 1 1 p_1^1 p11的值等于 p p p。根据旋转矩阵中介绍的坐标系的旋转, R 01 \mathbf R_{01} R01等于 T 1 \mathbf T_1 T1坐标轴向量在 T 0 \mathbf T_0 T0坐标系下的表示,所以 R 01 \mathbf R_{01} R01的表达式如下:
    R 01 = [ c o s ( α ) − s i n ( α ) 0 s i n ( α ) c o s ( α ) 0 0 0 1 ] \mathbf R_{01} =\begin{bmatrix} cos(\alpha) & -sin(\alpha) & 0 \\ sin(\alpha) & cos(\alpha) & 0 \\ 0 & 0 & 1 \end{bmatrix} R01= cos(α)sin(α)0sin(α)cos(α)0001

  2. T 1 → T 2 \mathbf T_1 \to \mathbf T_2 T1T2 ,围绕 T 1 \mathbf T_1 T1的Y轴旋转 β \beta β
    和上面 T 0 → T 1 \mathbf T_0 \to \mathbf T_1 T0T1的过程类似。当刚体旋转到 T 2 \mathbf T_2 T2时,刚体上的点在 T 1 \mathbf T_1 T1坐标系的坐标为 p 1 2 = R 12 p 2 2 p_1^2 = \mathbf R_{12}p_2^2 p12=R12p22,这里 p 1 2 p_1^2 p12中的2表示刚体位于 T 2 \mathbf T_2 T2位置,1表示点在 T 1 \mathbf T_1 T1的坐标, p 2 2 p_2^2 p22的值等于 p p p R 12 \mathbf R_{12} R12等于 T 2 \mathbf T_2 T2坐标轴向量在 T 1 \mathbf T_1 T1坐标系下的表示。所以 R 12 \mathbf R_{12} R12的表达式如下:
    R 12 = [ c o s ( β ) 0 s i n ( β ) 0 1 0 − s i n ( β ) 0 c o s ( β ) ] \mathbf R_{12} =\begin{bmatrix} cos(\beta) & 0 & sin(\beta) \\ 0 & 1 & 0 \\ -sin(\beta) & 0 & cos(\beta) \end{bmatrix} R12= cos(β)0sin(β)010sin(β)0cos(β)

  3. T 2 → T 3 \mathbf T_2 \to \mathbf T_3 T2T3 ,围绕 T 2 \mathbf T_2 T2的X轴旋转 γ \gamma γ
    同理和上面过程类似。当刚体旋转到 T 3 \mathbf T_3 T3时,刚体上的点在 T 2 \mathbf T_2 T2坐标系的坐标为 p 2 3 = R 23 p 3 3 p_2^3 = \mathbf R_{23}p_3^3 p23=R23p33,这里 p 2 3 p_2^3 p23中的3表示刚体位于 T 3 \mathbf T_3 T3位置,2表示点在 T 2 \mathbf T_2 T2的坐标, p 3 3 p_3^3 p33的值等于 p p p R 23 \mathbf R_{23} R23等于 T 3 \mathbf T_3 T3坐标轴向量在 T 2 \mathbf T_2 T2坐标系下的表示。所以 R 23 \mathbf R_{23} R23的表达式如下:
    R 23 = [ 1 0 0 0 c o s ( γ ) − s i n ( γ ) 0 s i n ( γ ) c o s ( γ ) ] \mathbf R_{23} =\begin{bmatrix} 1 & 0 & 0 \\ 0 & cos(\gamma) & -sin(\gamma) \\ 0 & sin(\gamma) & cos(\gamma) \end{bmatrix} R23= 1000cos(γ)sin(γ)0sin(γ)cos(γ)

在有了上面每一步旋转前后的坐标变换,则最终可以得到 T 0 \mathbf T_0 T0旋转到 T 3 \mathbf T_3 T3时,刚体上的点在 T 0 \mathbf T_0 T0坐标系下的表示:
p 0 3 = R 03 p 3 3 = R 01 p 1 3 = R 01 R 12 p 2 3 = R 01 R 12 R 23 p 3 3 p_0^3 = \mathbf R_{03}p_3^3 = \mathbf R_{01} p_1^3 = \mathbf R_{01} \mathbf R_{12} p_2^3 = \mathbf R_{01} \mathbf R_{12} \mathbf R_{23} p_3^3 p03=R03p33=R01p13=R01R12p23=R01R12R23p33
即:
R 03 = R 01 R 12 R 23 \mathbf R_{03} = \mathbf R_{01} \mathbf R_{12} \mathbf R_{23} R03=R01R12R23
在一般的文章介绍中,绕Z轴的旋转矩阵 R 01 \mathbf R_{01} R01 R z ( α ) \mathbf R_z(\alpha) Rz(α)表示,绕Y轴的旋转矩阵 R 12 \mathbf R_{12} R12 R y ( β ) \mathbf R_y(\beta) Ry(β)表示,绕X轴的旋转矩阵 R 23 \mathbf R_{23} R23 R x ( γ ) \mathbf R_x(\gamma) Rx(γ)表示,所以 R 03 = R z ( α ) R y ( β ) R x ( γ ) \mathbf R_{03} = \mathbf R_z(\alpha) \mathbf R_y(\beta) \mathbf R_x(\gamma) R03=Rz(α)Ry(β)Rx(γ)

3.2. 外旋

外旋与内旋相对,是围绕着固定的全局坐标系进行的,与局部坐标系无关,因此可以看做是对向量的旋转。这里同样以z-y-x的顺序,先后绕这三个轴的旋转角度为 α , β , γ \alpha, \beta, \gamma α,β,γ,不过这里是全局坐标系。 同样假设开始时,刚体上的一个点在全局坐标系(与局部坐标系重合)的坐标为 p p p

  1. 绕z轴旋转 α \alpha α
    根据之前讲解的,刚体中一点从 p 0 p_0 p0绕z轴旋转 α \alpha α度到 p 1 p_1 p1位置, p 1 = R z ( α ) p 0 p_1 = \mathbf R_z(\alpha)p_0 p1=Rz(α)p0,其中 R z ( α ) \mathbf R_z(\alpha) Rz(α)为:
    R z ( α ) = [ c o s ( α ) − s i n ( α ) 0 s i n ( α ) c o s ( α ) 0 0 0 1 ] R_z(\alpha) =\begin{bmatrix} cos(\alpha) & -sin(\alpha) & 0 \\ sin(\alpha) & cos(\alpha) & 0 \\ 0 & 0 & 1 \end{bmatrix} Rz(α)= cos(α)sin(α)0sin(α)cos(α)0001

  2. 绕y轴旋转 β \beta β
    上面得到的 p 1 p_1 p1位置还是在全局坐标系下,所以绕y轴旋转 β \beta β度得到 p 2 p_2 p2位置, p 2 = R y ( β ) p 1 p_2 = \mathbf R_y(\beta)p_1 p2=Ry(β)p1,其中 R y ( β ) \mathbf R_y(\beta) Ry(β)为:
    R y ( β ) = [ c o s ( β ) 0 s i n ( β ) 0 1 0 − s i n ( β ) 0 c o s ( β ) ] \mathbf R_{y}(\beta) =\begin{bmatrix} cos(\beta) & 0 & sin(\beta) \\ 0 & 1 & 0 \\ -sin(\beta) & 0 & cos(\beta) \end{bmatrix} Ry(β)= cos(β)0sin(β)010sin(β)0cos(β)

  3. 绕x轴旋转 γ \gamma γ
    p 2 p_2 p2的位置还是在全局坐标系下,所以绕z轴旋转 γ \gamma γ度得到 p 3 p_3 p3位置, p 3 = R x ( γ ) p 2 p_3 = \mathbf R_x(\gamma)p_2 p3=Rx(γ)p2,其中 R x ( γ ) \mathbf R_x(\gamma) Rx(γ)为:
    R x ( γ ) = [ 1 0 0 0 c o s ( γ ) − s i n ( γ ) 0 s i n ( γ ) c o s ( γ ) ] \mathbf R_{x}(\gamma) =\begin{bmatrix} 1 & 0 & 0 \\ 0 & cos(\gamma) & -sin(\gamma) \\ 0 & sin(\gamma) & cos(\gamma) \end{bmatrix} Rx(γ)= 1000cos(γ)sin(γ)0sin(γ)cos(γ)

所以刚体中一点 p 0 p_0 p0经过z-y-x顺序的外旋,得到的位置为: p 3 = R x ( γ ) p 2 = R x ( γ ) R y ( β ) p 1 = R x ( γ ) R y ( β ) R z ( α ) p 0 p_3 = \mathbf R_x(\gamma)p_2 = \mathbf R_x(\gamma)\mathbf R_y(\beta)p_1 = \mathbf R_x(\gamma)\mathbf R_y(\beta)\mathbf R_z(\alpha)p_0 p3=Rx(γ)p2=Rx(γ)Ry(β)p1=Rx(γ)Ry(β)Rz(α)p0,即 R = R x ( γ ) R y ( α ) R z ( α ) \mathbf R = \mathbf R_x(\gamma)\mathbf R_y(\alpha)\mathbf R_z(\alpha) R=Rx(γ)Ry(α)Rz(α)

根据上面的推导,围绕z-y-x顺序的内旋,得到的旋转矩阵为: R z ( α ) R y ( β ) R x ( γ ) \mathbf R_z(\alpha) \mathbf R_y(\beta) \mathbf R_x(\gamma) Rz(α)Ry(β)Rx(γ),而围绕z-y-x顺序的外旋,得到的旋转矩阵为: R x ( γ ) R y ( β ) R z ( α ) \mathbf R_x(\gamma)\mathbf R_y(\beta)\mathbf R_z(\alpha) Rx(γ)Ry(β)Rz(α)。所以相同的旋转顺序和角度的欧拉角,内旋和外旋的旋转矩阵顺序相反。

3.3. 其它

  1. 对于内旋,可以从旋转向量的角度去解释吗?

理论上可以的。围绕z-y-x顺序的旋转,旋转矩阵的顺序也是 R x ( γ ) R y ( β ) R z ( α ) \mathbf R_x(\gamma)\mathbf R_y(\beta)\mathbf R_z(\alpha) Rx(γ)Ry(β)Rz(α)。由于绕z轴旋转时,局部坐标系和全局坐标系是重合的, R z ( α ) = = [ c o s ( α ) − s i n ( α ) 0 s i n ( α ) c o s ( α ) 0 0 0 1 ] R_z(\alpha)==\begin{bmatrix} cos(\alpha) & -sin(\alpha) & 0 \\ sin(\alpha) & cos(\alpha) & 0 \\ 0 & 0 & 1 \end{bmatrix} Rz(α)== cos(α)sin(α)0sin(α)cos(α)0001 。旋转之后,局部坐标系和全局坐标系不重合, R x ( γ ) \mathbf R_x(\gamma) Rx(γ) R y ( β ) \mathbf R_y(\beta) Ry(β)的具体表达式需要根据旋转方向在全局坐标系的具体位置进行计算,表达式将比较复杂。

  1. 同理,对于外旋,可以通过旋转坐标系进行解释吗?

一样可以的,同样除了开始时,局部坐标系和全局坐标系重合, R z ( α ) = = [ c o s ( α ) − s i n ( α ) 0 s i n ( α ) c o s ( α ) 0 0 0 1 ] R_z(\alpha)==\begin{bmatrix} cos(\alpha) & -sin(\alpha) & 0 \\ sin(\alpha) & cos(\alpha) & 0 \\ 0 & 0 & 1 \end{bmatrix} Rz(α)== cos(α)sin(α)0sin(α)cos(α)0001 ,之后的 R y ( β ) \mathbf R_y(\beta) Ry(β) R x ( γ ) \mathbf R_x(\gamma) Rx(γ)的表达式将比较复杂。

参考

  1. 欧拉角细节/旋转顺序/内旋外旋
  2. 欧拉角内旋和外旋的等价性
  3. 两种欧拉角及其到旋转矩阵的转化
  4. 欧拉角和旋转矩阵之间的转换
  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值