从旋转矩阵计算欧拉角

从旋转矩阵中找到所有可能的欧拉角的简单方法,在计算机图形学、视觉学、机器人学和运动学中,欧拉角的确定有时是必要的一步。然而,解决方案可能是明显的,也可能不是。

旋转矩阵

我们从三个主要轴的旋转的标准定义开始。

绕x轴的弧度旋转 ψ \psi ψ被定义为:
R x ( ψ ) = [ 1 0 0 0 cos ⁡ ψ − sin ⁡ ψ 0 sin ⁡ ψ cos ⁡ ψ ] R_{x}(\psi)=\left[\begin{array}{ccc} 1 & 0 & 0 \\ 0 & \cos \psi & -\sin \psi \\ 0 & \sin \psi & \cos \psi \end{array}\right] Rx(ψ)=1000cosψsinψ0sinψcosψ
类似地,绕y轴旋转的弧度定义为
R x ( ψ ) = [ c o s θ 0 s i n θ 0 1 0 − s i n θ 0 c o s θ ] R_{x}(\psi)=\left[\begin{array}{ccc} cos\theta & 0 & sin\theta \\ 0 & 1 & 0 \\ -sin\theta & 0 & cos\theta \end{array}\right] Rx(ψ)=cosθ0sinθ010sinθ0cosθ
最后,定义了沿z轴旋转的弧度为
R z ( ϕ ) = [ cos ⁡ ϕ − sin ⁡ ϕ 0 sin ⁡ ϕ cos ⁡ ϕ 0 0 0 1 ] R_{z}(\phi)=\left[\begin{array}{ccc} \cos \phi & -\sin \phi & 0 \\ \sin \phi & \cos \phi & 0 \\ 0 & 0 & 1 \end{array}\right] Rz(ϕ)=cosϕsinϕ0sinϕcosϕ0001
这三个角 ψ , θ , ϕ \psi,\theta, \phi ψ,θ,ϕ是欧拉角

广义旋转矩阵

一般的旋转矩阵可以有这样的形式

R z ( ϕ ) = [ R 11 R 12 R 13 R 21 R 22 R 23 R 31 R 32 R 33 ] R_{z}(\phi)=\left[\begin{array}{ccc} R_{11}&R_{12}&R_{13} \\ R_{21}&R_{22}&R_{23} \\ R_{31}&R_{32} &R_{33} \end{array}\right] Rz(ϕ)=R11R21R31R12R22R32R13R23R33
这个矩阵可以被认为是一个三旋转的序列,每个主轴各一个。因为矩阵乘法不能交换,旋转的轴的顺序将影响结果。在这个分析中,我们先绕 x x x轴旋转,然后绕 y y y轴旋转,最后绕 z z z轴旋转。这样的旋转序列可以用矩阵乘积表示。
R = R z ( ϕ ) R y ( θ ) R x ( ψ ) = [ cos ⁡ θ cos ⁡ ϕ sin ⁡ ψ sin ⁡ θ cos ⁡ ϕ − cos ⁡ ψ sin ⁡ ϕ cos ⁡ ψ sin ⁡ θ cos ⁡ ϕ + sin ⁡ ψ sin ⁡ ϕ cos ⁡ θ sin ⁡ ϕ sin ⁡ ψ sin ⁡ θ sin ⁡ ϕ + cos ⁡ ψ cos ⁡ ϕ cos ⁡ ψ sin ⁡ θ sin ⁡ ϕ − sin ⁡ ψ cos ⁡ ϕ − sin ⁡ θ sin ⁡ ψ cos ⁡ θ cos ⁡ ψ cos ⁡ θ ] \begin{aligned} R &=R_{z}(\phi) R_{y}(\theta) R_{x}(\psi) \\ &=\left[\begin{array}{ccc} \cos \theta \cos \phi & \sin \psi \sin \theta \cos \phi-\cos \psi \sin \phi & \cos \psi \sin \theta \cos \phi+\sin \psi \sin \phi \\ \cos \theta \sin \phi & \sin \psi \sin \theta \sin \phi+\cos \psi \cos \phi & \cos \psi \sin \theta \sin \phi-\sin \psi \cos \phi \\ -\sin \theta & \sin \psi \cos \theta & \cos \psi \cos \theta \end{array}\right] \end{aligned} 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 R,通过将 R R R中的每个元素与矩阵乘 R z ( ϕ ) , R y θ , R x ( ψ ) R_z(\phi),R_y{\theta},R_x(\psi) Rz(ϕ),Ryθ,Rx(ψ)中的相应元素等价,可以计算出欧拉角 ψ , θ , ϕ \psi,\theta, \phi ψ,θ,ϕ。九个方程,可以用来找到欧拉角。

求出两个可能的角度 θ \theta θ

R 31 R_{31} R31开始,我们发现
R 31 = − s i n θ R_{31}=-sin\theta R31=sinθ
这个方程可以倒过来表示
θ = − s i n − 1 ( R 31 ) \theta=-sin^{-1}(R_{31}) θ=sin1(R31)
然而,在解释这个等式时必须谨慎。由于$sin(\pi-\theta)=sin(\theta),实际上有两个不同的值(对于 R 31 ≠ ± 1 R_{31} \not=\pm1 R31=±1)满足方程,因此,这两个值
θ 1 = − s i n − 1 ( R 31 ) \theta{1}=-sin^{-1}(R_{31}) θ1=sin1(R31) θ 2 = π − θ 1 = π + s i n − 1 ( R 31 ) \theta_{2}=\pi-\theta_1=\pi+sin^{-1}(R_{31}) θ2=πθ1=π+sin1(R31)
都是有效的解。我们将在后面处理 R 31 = ± 1 R_{31} =\pm1 R31=±1的特殊情况,因此使用旋转矩阵的R_{31}元素,我们能够确定两个可能的值。

找到 ψ \psi ψ对应的角度

想要找到 ψ \psi ψ的值,我们观察这一点
R 32 R 33 = t a n ( ψ ) \frac{R_{32}}{R_{33}}=tan(\psi) R33R32=tan(ψ)
我们用这个方程来解出
ψ = a t a n 2 ( R 32 , R 33 ) \psi=atan2(R_{32},R_{33}) ψ=atan2(R32,R33)
其中 a t a n 2 ( y , x ) atan2(y, x) atan2(y,x)是两个变量 x x x y y y a r c t a n arctan arctan,类似于计算 y x \frac{y}{x} xy a r c t a n arctan arctan,只是用两个参数的符号来确定结果的象限,其范围为 [ − π , π ] [-\pi,\pi] [π,π],函数 a t a n 2 atan2 atan2在许多编程语言中都可用。

在解释方程 2 2 2时必须小心,如果 c o s ( θ ) > 0 cos(\theta)>0 cos(θ)>0,那么 ψ = a t a n 2 ( R 32 , R 33 ) \psi=atan2(R_{32},R_{33}) ψ=atan2(R32,R33)。然而,当 c o s ( θ ) < 0 cos(\theta)<0 cos(θ)<0 ψ = a t a n 2 ( − R 32 , − R 33 ) \psi=atan2(-R_{32},-R_{33}) ψ=atan2(R32,R33)。处理这个问题的一个简单方法是使用这个方程
ψ = a t a n 2 ( R 32 c o s θ , R 33 c o s θ ) \psi=atan2(\frac{R_{32}}{cos\theta},\frac{R_{33}}{cos\theta}) ψ=atan2(cosθR32,cosθR33)
去计算 ψ \psi ψ

方程 3 3 3对除 c o s θ = 0 cos\theta = 0 cosθ=0之外的所有情况都有效。
ψ = a t a n 2 ( R 32 c o s θ 1 , R 33 c o s θ 1 ) \psi=atan2(\frac{R_{32}}{cos\theta_{1}},\frac{R_{33}}{cos\theta_{1}}) ψ=atan2(cosθ1R32,cosθ1R33) ψ = a t a n 2 ( R 32 c o s θ 2 , R 33 c o s θ 2 ) \psi=atan2(\frac{R_{32}}{cos\theta_{2}},\frac{R_{33}}{cos\theta_{2}}) ψ=atan2(cosθ2R32,cosθ2R33)

求出 ϕ \phi ϕ对应的角度

类似的分析也适用于寻找。我们观察到
R 21 R 11 = t a n ϕ \frac{R_{21}}{R_{11}}=tan\phi R11R21=tanϕ
我们用这个方程解出了 ϕ \phi ϕ
ψ = a t a n 2 ( R 21 c o s θ 1 , R 11 c o s θ 1 ) \psi=atan2(\frac{R_{21}}{cos\theta_{1}},\frac{R_{11}}{cos\theta_{1}}) ψ=atan2(cosθ1R21,cosθ1R11) ψ = a t a n 2 ( R 21 c o s θ 2 , R 11 c o s θ 2 ) \psi=atan2(\frac{R_{21}}{cos\theta_{2}},\frac{R_{11}}{cos\theta_{2}}) ψ=atan2(cosθ2R21,cosθ2R11)

c o s θ ≠ 0 cos\theta\not=0 cosθ=0时的两个解

对于 c o s θ ≠ 0 cos\theta\not=0 cosθ=0的情况,我们现在有两个三个一组的欧拉角再现了旋转矩阵,为
ψ 1 , θ 1 , ϕ 1 \psi_1,\theta_1,\phi_1 ψ1,θ1,ϕ1 ψ 2 , θ 2 , ϕ 2 \psi_2,\theta_2,\phi_2 ψ2,θ2,ϕ2
这两个解都是有效的。

如果 c o s θ = 0 cos\theta=0 cosθ=0呢?

如果旋转矩阵的 R 31 R_{31} R31元素为 1 1 1 − 1 −1 1,对应的 θ = − π 2 \theta=-\frac{\pi}{2} θ=2πor θ = π 2 \theta=\frac{\pi}{2} θ=2π c o s θ = 0 cos\theta=0 cosθ=0上述就不起作用。当我们尝试使用上述技术来解决可能的值 ψ , ϕ \psi,\phi ψ,ϕ问题发生了,因为 R 11 , R 21 , R 32 和 R 33 R_{11},R_{21},R_{32}和R_{33} R11,R21,R32R33可能值为 0 0 0,因此 ψ , ϕ \psi,\phi ψ,ϕ变为
ψ = a t a n 2 ( 0 0 , 0 0 ) \psi=atan2(\frac{0}{0},\frac{0}{0}) ψ=atan2(00,00) ϕ = a t a n 2 ( 0 0 , 0 0 ) \phi=atan2(\frac{0}{0},\frac{0}{0}) ϕ=atan2(00,00)
这种情况下, R 11 、 R 21 、 R 32 R11、R21、R32 R11R21R32 R 33 R33 R33没有约束 ψ , ϕ \psi,\phi ψ,ϕ这些值。因此,我们必须利用旋转矩阵的不同元素来计算 ψ , ϕ \psi,\phi ψ,ϕ

θ = π 2 \theta=\frac{\pi}{2} θ=2π
R 12 = sin ⁡ ψ cos ⁡ ϕ − cos ⁡ ψ sin ⁡ ϕ = sin ⁡ ( ψ − ϕ ) R 13 = cos ⁡ ψ cos ⁡ ϕ + sin ⁡ ψ sin ⁡ ϕ = cos ⁡ ( ψ − ϕ ) R 22 = sin ⁡ ψ sin ⁡ ϕ + cos ⁡ ψ cos ⁡ ϕ = cos ⁡ ( ψ − ϕ ) = R 13 R 23 = cos ⁡ ψ sin ⁡ ϕ − sin ⁡ ψ cos ⁡ ϕ = − sin ⁡ ( ψ − ϕ ) = − R 12 \begin{array}{l} R_{12}=\sin \psi \cos \phi-\cos \psi \sin \phi=\sin (\psi-\phi) \\ R_{13}=\cos \psi \cos \phi+\sin \psi \sin \phi=\cos (\psi-\phi) \\ R_{22}=\sin \psi \sin \phi+\cos \psi \cos \phi=\cos (\psi-\phi)=R_{13} \\ R_{23}=\cos \psi \sin \phi-\sin \psi \cos \phi=-\sin (\psi-\phi)=-R_{12} \end{array} R12=sinψcosϕcosψsinϕ=sin(ψϕ)R13=cosψcosϕ+sinψsinϕ=cos(ψϕ)R22=sinψsinϕ+cosψcosϕ=cos(ψϕ)=R13R23=cosψsinϕsinψcosϕ=sin(ψϕ)=R12
任意的 ψ \psi ψ ϕ \phi ϕ都满足方程。我们会发现
( ψ − ϕ ) = a t a n 2 ( R 12 , R 13 ) (\psi-\phi)=atan2(R_{12},R_{13}) (ψϕ)=atan2(R12,R13) ψ = ϕ + a t a n 2 ( R 12 , R 13 ) \psi=\phi+atan2(R_{12},R_{13}) ψ=ϕ+atan2(R12,R13)
θ = − π 2 \theta=-\frac{\pi}{2} θ=2π
R 12 = − sin ⁡ ψ cos ⁡ ϕ − cos ⁡ ψ sin ⁡ ϕ = − sin ⁡ ( ψ + ϕ ) R 13 = − cos ⁡ ψ cos ⁡ ϕ + sin ⁡ ψ sin ⁡ ϕ = − cos ⁡ ( ψ + ϕ ) R 22 = − sin ⁡ ψ sin ⁡ ϕ + cos ⁡ ψ cos ⁡ ϕ = cos ⁡ ( ψ + ϕ ) = − R 13 R 23 = − cos ⁡ ψ sin ⁡ ϕ − sin ⁡ ψ cos ⁡ ϕ = − sin ⁡ ( ψ + ϕ ) = R 12 \begin{array}{l} R_{12}=-\sin \psi \cos \phi-\cos \psi \sin \phi=-\sin (\psi+\phi) \\ R_{13}=-\cos \psi \cos \phi+\sin \psi \sin \phi=-\cos (\psi+\phi) \\ R_{22}=-\sin \psi \sin \phi+\cos \psi \cos \phi=\cos (\psi+\phi)=-R_{13} \\ R_{23}=-\cos \psi \sin \phi-\sin \psi \cos \phi=-\sin (\psi+\phi)=R_{12} \end{array} R12=sinψcosϕcosψsinϕ=sin(ψ+ϕ)R13=cosψcosϕ+sinψsinϕ=cos(ψ+ϕ)R22=sinψsinϕ+cosψcosϕ=cos(ψ+ϕ)=R13R23=cosψsinϕsinψcosϕ=sin(ψ+ϕ)=R12
同样
( ψ + ϕ ) = a t a n 2 ( − R 12 , − R 13 ) (\psi+\phi)=atan2(-R_{12},-R_{13}) (ψ+ϕ)=atan2(R12,R13) ψ = − ϕ + a t a n 2 ( − R 12 , − R 13 ) \psi=-\phi+atan2(-R_{12},-R_{13}) ψ=ϕ+atan2(R12,R13)

伪代码:

 if  ( R 31 ≠ ± 1 ) θ 1 = − asin ⁡ ( R 31 ) θ 2 = π − θ 1 ψ 1 = atan ⁡ 2 ( R 32 cos ⁡ θ 1 , R 33 cos ⁡ θ 1 ) ψ 2 = atan ⁡ 2 ( R 32 cos ⁡ θ 2 , R 33 cos ⁡ θ 2 ) ϕ 1 = atan ⁡ 2 ( R 21 cos ⁡ θ 1 , R 11 cos ⁡ θ 1 ) ϕ 2 = atan ⁡ 2 ( R 21 cos ⁡ θ 2 , R 11 cos ⁡ θ 2 )  else  ϕ =  anything; can set to  0  if  ( R 31 = − 1 ) θ = π / 2 ψ = ϕ + atan ⁡ 2 ( R 12 , R 13 )  else  θ = − π / 2 ψ = − ϕ + atan ⁡ 2 ( − R 12 , − R 13 )  end if   end if  \begin{array}{l} \text { if }\left(R_{31} \neq\pm 1\right) \\ \theta_{1}=-\operatorname{asin}\left(R_{31}\right) \\ \theta_{2}=\pi-\theta_{1} \\ \psi_{1}=\operatorname{atan} 2\left(\frac{R_{32}}{\cos \theta_{1}}, \frac{R_{33}}{\cos \theta_{1}}\right) \\ \psi_{2}=\operatorname{atan} 2\left(\frac{R_{32}}{\cos \theta_{2}}, \frac{R_{33}}{\cos \theta_{2}}\right) \\ \phi_{1}=\operatorname{atan} 2\left(\frac{R_{21}}{\cos \theta_{1}}, \frac{R_{11}}{\cos \theta_{1}}\right) \\ \phi_{2}=\operatorname{atan} 2\left(\frac{R_{21}}{\cos \theta_{2}}, \frac{R_{11}}{\cos \theta_{2}}\right) \\ \text { else } \\ \begin{array}{c} \phi=\text { anything; can set to } 0 \\ \text { if }\left(R_{31}=-1\right) \\ \theta=\pi / 2 \\ \psi=\phi+\operatorname{atan} 2\left(R_{12}, R_{13}\right) \\ \text { else } \\ \quad \quad \theta=-\pi / 2 \\ \quad \psi=-\phi+\operatorname{atan} 2\left(-R_{12},-R_{13}\right) \\ \text { end if } \end{array} \\ \text { end if } \end{array}  if (R31=±1)θ1=asin(R31)θ2=πθ1ψ1=atan2(cosθ1R32,cosθ1R33)ψ2=atan2(cosθ2R32,cosθ2R33)ϕ1=atan2(cosθ1R21,cosθ1R11)ϕ2=atan2(cosθ2R21,cosθ2R11) else ϕ= anything; can set to 0 if (R31=1)θ=π/2ψ=ϕ+atan2(R12,R13) else θ=π/2ψ=ϕ+atan2(R12,R13) end if  end if 

实际例子

下面提供了一个例子,演示了从一个旋转矩阵中计算出 ψ , θ , ϕ \psi,\theta, \phi ψ,θ,ϕ
假设要求我们找出产生这个矩阵的欧拉角
R z ( ϕ ) = [ . 5 − . 1464 . 8536 . 5 . 8536 − . 1464 − . 7071 . 5 . 5 ] R_{z}(\phi)=\left[\begin{array}{ccc} .5&-.1464&.8536 \\ .5&.8536&-.1464\\ -.7071&.5&.5 \end{array}\right] Rz(ϕ)=.5.5.7071.1464.8536.5.8536.1464.5
首先,求出可能 θ \theta θ的取值
θ 1 = − s i n ( − . 7071 ) = π 4 \theta_1=-sin(-.7071)=\frac{\pi}{4} θ1=sin(.7071)=4π
θ 2 = π − θ 1 = 3 π 4 \theta_2=\pi-\theta_1=\frac{3\pi}{4} θ2=πθ1=43π
然后,我们找到相应的数值
ψ 1 = atan ⁡ 2 ( . 5 cos ⁡ ( π / 4 ) , . 5 cos ⁡ ( π / 4 ) ) = π 4 ψ 2 = atan ⁡ 2 ( . 5 cos ⁡ ( 3 π / 4 ) , . 5 cos ⁡ ( 3 π / 4 ) ) = − 3 π 4 \begin{array}{l} \psi_{1}=\operatorname{atan} 2\left(\frac{.5}{\cos (\pi / 4)}, \frac{.5}{\cos (\pi / 4)}\right)=\frac{\pi}{4} \\ \psi_{2}=\operatorname{atan} 2\left(\frac{.5}{\cos (3 \pi / 4)}, \frac{.5}{\cos (3 \pi / 4)}\right)=-\frac{3 \pi}{4} \end{array} ψ1=atan2(cos(π/4).5,cos(π/4).5)=4πψ2=atan2(cos(3π/4).5,cos(3π/4).5)=43π

ϕ 1 = atan ⁡ 2 ( . 5 cos ⁡ ( π / 4 ) , . 5 cos ⁡ ( π / 4 ) ) = π 4 ϕ 2 = atan ⁡ 2 ( . 5 cos ⁡ ( 3 π / 4 ) , . 5 cos ⁡ ( 3 π / 4 ) ) = − 3 π 4 \begin{array}{l} \phi_{1}=\operatorname{atan} 2\left(\frac{.5}{\cos (\pi / 4)}, \frac{.5}{\cos (\pi / 4)}\right)=\frac{\pi}{4} \\ \phi_{2}=\operatorname{atan} 2\left(\frac{.5}{\cos (3 \pi / 4)}, \frac{.5}{\cos (3 \pi / 4)}\right)=-\frac{3 \pi}{4} \end{array} ϕ1=atan2(cos(π/4).5,cos(π/4).5)=4πϕ2=atan2(cos(3π/4).5,cos(3π/4).5)=43π
因此,解为
( π 4 , π 4 , π 4 ) , ( − 3 π 4 , 3 π 4 , − 3 π 4 ) (\frac{\pi}{4},\frac{\pi}{4},\frac{\pi}{4}),(-\frac{3\pi}{4},\frac{3\pi}{4},-\frac{3\pi}{4}) (4π,4π,4π),(43π,43π,43π)

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐