摘要
本文档讨论了从旋转矩阵中找所有可能欧拉角的简单技术。在计算机图形学、视觉,机器人和动力学中,有时候欧拉角的确定是必须的一步。然而,它的解可能不是那么的显而易见。
paper: Computing Euler angles from a rotation matrix
author:Gregory G. Slabaugh
Rotation matrices
我们从绕三个主轴旋转的标准定义开始。
绕x轴旋转ψ弧度可定义为
Rx(ψ)=⎣⎡1000cosψsinψ0−sinψcosψ⎦⎤
与此类似,绕y轴旋转θ弧度可定义为
Ry(θ)=⎣⎡cosθ0−sinθ010sinθ0cosθ⎦⎤
最后,绕z轴旋转ϕ弧度可定义为
Rz(ϕ)=⎣⎡cosϕsinϕ0−sinϕcosϕ0001⎦⎤
角ψ,θ,ϕ是欧拉角。
Generalized rotation matrices
旋转矩阵一般可以写成
R=⎣⎡R11R21R31R12R22R32R13R23R33⎦⎤
可以将此矩阵考虑为三个旋转序列,每个旋转轴绕一个主轴旋转。由于矩阵乘法不满足交换律,因此绕轴旋转的顺序会影响结果。对于此分析,我们将首先绕x轴旋转,然后绕y轴旋转,最后绕z轴旋转。 这样的旋转序列可以表示为矩阵乘积,
R=Rz(ϕ)Ry(θ)Rx(ψ)=⎣⎡cosθcosϕcosθsinϕ−sinθsinψsinθcosϕ−cosψsinϕsinψsinθsinϕ+cosψcosϕsinψcosθcosψsinθcosϕ+sinψsinϕcosψsinθsinϕ−sinψcosϕcosψcosθ⎦⎤
给定一个旋转矩阵R,我们可以通过将R每个元素与矩阵乘积Rz(ϕ)Ry(θ)Rx(ϕ)对应元素相等计算欧拉角ψ,θ,ϕ。这将得到九个方程,可用于找到欧拉角。
Finding two possible angles for θ
由R31,我们得到
R31=−sinθ
对等式求反得到
θ=−asin(R31)(1)
然而,对等式(1)解释的时候应该注意到sin(π−θ)=sinθ,因此有两个不同的θ都满足等式(1)(备注:除了θ=±π/2(即R31=±1))。因此θ有两个有效的解。
θ1θ2=−asin(R31)=π−θ1=π+asin(R31)
接下来的报告中,我们将单独处理R31=±1的情况。因此,通过利用R31元素的值,我们可以确定θ的两个不同的值。
Find the corresponding angles of ψ
为了找到ψ的值,我们观察到
R33R32=tan(ψ)
我们使用该等式解ψ,有
ψ=atan2(R32,R33)(2)
其中atan2(y,x)表示变量x,y的反正切,它类似于计算y / x的反正切,不同之处在于,两个自变量的符号都用于确定结果的象限,该象限在[-π,π]范围内。函数atan2在很多程序语言中都有实现。
在解释等式(2)时我们注意到,当cosθ>0时, ψ=atan(R32,R33),然而,当cosψ<0时, ψ=atan2(−R32,−R33),一个简单的解决方法是使用等式
ψ=atan2(cosθR32,cosθR33)(3)
计算ψ。
等式3对于所有的情况都适用,除了当cosθ=0时,随后将处理这种特殊情况。对于每一个θ值,我们利用等式(3)计算一个对应的ψ值,得到
ψ1=atan2(cosθ1R32,cosθ1R33)(4)
ψ2=atan2(cosθ2R32,cosθ2R33)(5)
Finding the corresponding angles of ϕ
类似的分析也适用于寻找ϕ,观察到
R11R21=tanϕ
解ϕ使用等式
ϕ=atan2(cosθR21,cosθR11)(6)
同样,等式6对于所有的情况都适用,除了当cosθ=0时,随后将处理这种特殊情况。对于每一个θ值,我们利用等式(6)计算一个对应的ϕ值,得到
ϕ1=atan2(cosθ1R21,cosθ1R11)(7)
ϕ2=atan2(cosθ2R21,cosθ2R11)(8)
Two solutions if cosθ=0
对于cosθ=0的情况,我们现在有两个三维(triplets)欧拉角来重现(reproduce)旋转矩阵,即
(ψ1,θ1,ϕ1)(ψ2,θ2,ϕ2)
这两个解都是有效的。
What if cosθ=0?
如果旋转矩阵的R33元素为1或-1(分别对应θ=−π/2或θ=π/2且cosθ=0),则上述技术无效。当我们试图使用上面的技术解ψ,ϕ时,将会出现问题,因为R11,R21,R32,R33都等于0,等式(3)和(6)变成
ψ=atan2(0,0)ϕ=atan2(0,0)
在这种情况下,R11,R21,R32,R33不限制ψ和ϕ的值。 因此,我们必须使用旋转矩阵的不同元素来计算ψ和ϕ的值。
-
θ=π/2情况:当θ=π/2时有
R12=sinψsinθcosϕ−cosψsinϕ=sinψcosϕ−cosψsinϕ=sin(ψ−ϕ)R13=cosψsinθcosϕ+sinψsinϕ=cosψcosϕ+sinψsinϕ=cos(ψ−ϕ)R22=sinψsinθsinϕ+cosψcosϕ=sinψsinϕ+cosψcosϕ=cos(ψ−ϕ)=R13R23=cosψsinθsinϕ−sinψcosϕ=cosψsinϕ−sinψcosϕ=−sin(ψ−ϕ)=−R12
满足这些等式的任何ϕ,ψ都是有效的解,利用等式R12,R13,我们发现
(ψ−ϕ)=atan2(R12,R13)ψ=ϕ+atan2(R12,R13)
-
θ=−π/2情况:类似的, 有
R12=sinψsinθcosϕ−cosψsinϕ=−sinψcosϕ−cosψsinϕ=−sin(ψ+ϕ)R13=cosψsinθcosϕ+sinψsinϕ=−cosψcosϕ+sinψsinϕ=−cos(ψ+ϕ)R22=sinψsinθsinϕ+cosψcosϕ=−sinψsinϕ+cosψcosϕ=cos(ψ+ϕ)=−R13R23=cosψsinθsinϕ−sinψcosϕ=−cosψsinϕ−sinψcosϕ=−−sin(ψ+ϕ)=R12
同样,有
(ψ+ϕ)=atan2(−R12,−R13)ψ=−ϕ+atan2(−R12,−R13)
- 无论哪种情况: 在θ=π/2和θ=−π/2的情况下,我们都发现ψ和ϕ是关联的。 这种现象称为万向节锁(Gimbal lock)。尽管在这种情况下,有无数个问题的解,但在实践中,人们常常有兴趣寻找一个解。 对于此任务,如上所述方便地设置ϕ=0并计算ψ。
Pseudo-code
现在,我们通过图1中的伪代码实现来总结该方法。代码非常简单。
More than one solution
有趣的是,围绕三个主轴旋转的序列始终不止一种,他们都能得到物体相同的方向。 如本报告所示,在cosθ=0的非退化(non-degenerate)的情况下,有两个解。 对于cosθ=0的退化情况,存在无限数量的解。
例如,考虑一本书放在您面前的桌子上。 将x轴定义为右侧,将y轴定义为远离您,将z轴定义为向上。 绕y轴旋转π弧度将使书本旋转,使得后盖现在朝上。 实现相同方向的另一种方法是绕x轴旋转书本π弧度,然后绕z轴旋转π弧度。 因此,存在不止一种方式来实现期望的旋转。
reference
[1]. Gregory G. Slabaugh, Computing Euler angles from a rotation matrix