从旋转矩阵计算欧拉角

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

旋转矩阵

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

绕x轴的弧度旋转ψ\psiψ被定义为:
Rx(ψ)=[1000cos⁡ψ−sin⁡ψ0sin⁡ψ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​(ψ)=⎣⎡​100​0cosψsinψ​0−sinψcosψ​⎦⎤​
类似地,绕y轴旋转的弧度定义为
Rx(ψ)=[cosθ0sinθ010−sinθ0cosθ]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θ0−sinθ​010​sinθ0cosθ​⎦⎤​
最后,定义了沿z轴旋转的弧度为
Rz(ϕ)=[cos⁡ϕ−sin⁡ϕ0sin⁡ϕcos⁡ϕ0001]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ϕ0​−sinϕcosϕ0​001​⎦⎤​
这三个角ψ,θ,ϕ\psi,\theta, \phiψ,θ,ϕ是欧拉角

广义旋转矩阵

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

Rz(ϕ)=[R11R12R13R21R22R23R31R32R33]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​(ϕ)=⎣⎡​R11​R21​R31​​R12​R22​R32​​R13​R23​R33​​⎦⎤​
这个矩阵可以被认为是一个三旋转的序列,每个主轴各一个。因为矩阵乘法不能交换,旋转的轴的顺序将影响结果。在这个分析中,我们先绕xxx轴旋转,然后绕yyy轴旋转,最后绕zzz轴旋转。这样的旋转序列可以用矩阵乘积表示。
R=Rz(ϕ)Ry(θ)Rx(ψ)=[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θ​⎦⎤​​
给定一个旋转矩阵RRR,通过将RRR中的每个元素与矩阵乘Rz(ϕ),Ryθ,Rx(ψ)R_z(\phi),R_y{\theta},R_x(\psi)Rz​(ϕ),Ry​θ,Rx​(ψ)中的相应元素等价,可以计算出欧拉角ψ,θ,ϕ\psi,\theta, \phiψ,θ,ϕ。九个方程,可以用来找到欧拉角。

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

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

找到ψ\psiψ对应的角度

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

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

方程333对除cosθ=0cos\theta = 0cosθ=0之外的所有情况都有效。
ψ=atan2(R32cosθ1,R33cosθ1)\psi=atan2(\frac{R_{32}}{cos\theta_{1}},\frac{R_{33}}{cos\theta_{1}})ψ=atan2(cosθ1​R32​​,cosθ1​R33​​)ψ=atan2(R32cosθ2,R33cosθ2)\psi=atan2(\frac{R_{32}}{cos\theta_{2}},\frac{R_{33}}{cos\theta_{2}})ψ=atan2(cosθ2​R32​​,cosθ2​R33​​)

求出ϕ\phiϕ对应的角度

类似的分析也适用于寻找。我们观察到
R21R11=tanϕ\frac{R_{21}}{R_{11}}=tan\phiR11​R21​​=tanϕ
我们用这个方程解出了ϕ\phiϕ
ψ=atan2(R21cosθ1,R11cosθ1)\psi=atan2(\frac{R_{21}}{cos\theta_{1}},\frac{R_{11}}{cos\theta_{1}})ψ=atan2(cosθ1​R21​​,cosθ1​R11​​)ψ=atan2(R21cosθ2,R11cosθ2)\psi=atan2(\frac{R_{21}}{cos\theta_{2}},\frac{R_{11}}{cos\theta_{2}})ψ=atan2(cosθ2​R21​​,cosθ2​R11​​)

cosθ≠0cos\theta\not=0cosθ​=0时的两个解

对于cosθ≠0cos\theta\not=0cosθ​=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​
这两个解都是有效的。

如果cosθ=0cos\theta=0cosθ=0呢?

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

θ=π2\theta=\frac{\pi}{2}θ=2π​:
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\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(ψ−ϕ)=R13​R23​=cosψsinϕ−sinψcosϕ=−sin(ψ−ϕ)=−R12​​
任意的ψ\psiψ和ϕ\phiϕ都满足方程。我们会发现
(ψ−ϕ)=atan2(R12,R13)(\psi-\phi)=atan2(R_{12},R_{13})(ψ−ϕ)=atan2(R12​,R13​)ψ=ϕ+atan2(R12,R13)\psi=\phi+atan2(R_{12},R_{13})ψ=ϕ+atan2(R12​,R13​)
θ=−π2\theta=-\frac{\pi}{2}θ=−2π​:
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\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(ψ+ϕ)=−R13​R23​=−cosψsinϕ−sinψcosϕ=−sin(ψ+ϕ)=R12​​
同样
(ψ+ϕ)=atan2(−R12,−R13)(\psi+\phi)=atan2(-R_{12},-R_{13})(ψ+ϕ)=atan2(−R12​,−R13​)ψ=−ϕ+atan2(−R12,−R13)\psi=-\phi+atan2(-R_{12},-R_{13})ψ=−ϕ+atan2(−R12​,−R13​)

伪代码:

if (R31≠±1)θ1=−asin⁡(R31)θ2=π−θ1ψ1=atan⁡2(R32cos⁡θ1,R33cos⁡θ1)ψ2=atan⁡2(R32cos⁡θ2,R33cos⁡θ2)ϕ1=atan⁡2(R21cos⁡θ1,R11cos⁡θ1)ϕ2=atan⁡2(R21cos⁡θ2,R11cos⁡θ2)else ϕ=anything; can set to 0if (R31=−1)θ=π/2ψ=ϕ+atan⁡2(R12,R13)else θ=−π/2ψ=−ϕ+atan⁡2(−R12,−R13)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θ1​R32​​,cosθ1​R33​​)ψ2​=atan2(cosθ2​R32​​,cosθ2​R33​​)ϕ1​=atan2(cosθ1​R21​​,cosθ1​R11​​)ϕ2​=atan2(cosθ2​R21​​,cosθ2​R11​​) 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ψ,θ,ϕ。
假设要求我们找出产生这个矩阵的欧拉角
Rz(ϕ)=[.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=−sin(−.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(.5cos⁡(π/4),.5cos⁡(π/4))=π4ψ2=atan⁡2(.5cos⁡(3π/4),.5cos⁡(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(.5cos⁡(π/4),.5cos⁡(π/4))=π4ϕ2=atan⁡2(.5cos⁡(3π/4),.5cos⁡(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π​)

从旋转矩阵计算欧拉角相关推荐

  1. 由旋转矩阵计算欧拉角的方法

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lircsszz/article/details/80118051 算法一:直接法 bool isRo ...

  2. 学习笔记17 --使用matlab自带函数,将旋转矩阵计算成欧拉角

    个人环境是使用matlab2017b 该公式计算欧拉角有个要求,必须是3x3的旋转矩阵(尝试过4x4的计算不了).matlab自带的由旋转矩阵计算欧拉角公式是,rotm2eul(),其可以指定旋转顺序 ...

  3. 从某一点出发沿任意一方向旋转矩阵计算思考与实现

    欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击. 上期讲到 绕任一向量旋转矩阵计算思考与实现 点击前往 点击前往 问题提出 之前讲到绕任一向量旋转矩阵实现,原来的向量都是从原点出 ...

  4. 图形学笔记(四)变换——三维变换(三维旋转与欧拉角)、MVP变换、视图变换、投影变换(正交投影与透视投影)

    图形学笔记(三)变换--缩放.镜像.切变 图形学笔记(五)光栅化--屏幕.像素.屏幕空间.视口变换.基础图元与三角形.采样.包围盒.锯齿或走样 文章目录 1 三维空间中的变换 1.1 三维空间中的齐次 ...

  5. Unity的旋转-四元数,欧拉角用法简介

    当初弄不明白旋转..居然找不到资料四元数应该用轴角相乘... 通过两种旋转的配合,可以告别世界空间和本地空间矩阵转换了,大大提升效率. 每个轴相乘即可,可以任意轴,无限乘.无万向节锁问题 四元数旋转: ...

  6. Unity手游之路四3d旋转-四元数,欧拉角和变幻矩阵

    http://blog.csdn.net/janeky/article/details/17272625 今天我们来谈谈关于Unity中的旋转.主要有三种方式.变换矩阵,四元数和欧拉角. 定义 变换矩 ...

  7. SO3,SE3,旋转,欧拉角与四元数笔记

    在机器人学中的定义和其它领域中的定义有时候会有不同,长时间不用也会记混淆.这里记录一下便于回头翻阅. 参考<A Mathematical Introduction to Robotic Mani ...

  8. 使3D空间中物体朝向和其速度方向一致的旋转矩阵计算方案

    在3D空间中的物体以某一速度运动,有时候需要这个物体的朝向和速度的方向一致, 为了实现这个目标我们一般借助旋转矩阵 M 来将物体旋转到对应的朝向. 例如速度方向矢量 spdV: Vector3D(1, ...

  9. 如何将四元数方向转化为旋转举证_是否有将四元数旋转转换为欧拉角旋转的算法?...

    frodo2975.. 7 我一直在寻找类似解决方案的几天,我终于遇到了这个网站,它有一个将四元数转换为任意Euler和Tait-Bryan旋转的算法! 这是代码: /// // Quaternion ...

最新文章

  1. 阿里架构师,讲述分布式架构云平台解决方案(附学习路线)...
  2. vscode如何设置自动保存时自动格式化代码
  3. VS.NET C#视频教学
  4. 线性序列机与串行接口ADC驱动设计与验证
  5. java设置属性的取值范围是多少_jvm-Java系统属性的范围
  6. String、StringBuuffer、StringBuilder三者的区别
  7. 设置公共请求参数_封装一个useFetch实现页面销毁取消请求
  8. 小木虫网站无法登陆(账号突然被封禁)的解决办法
  9. Flutter 上字体的另类玩法:FontFeature
  10. Rancher部署日志
  11. 将Eclipse设置为中文
  12. 【渝粤题库】陕西师范大学202501 法语(二)作业
  13. 【计算机网络】思科实验(8):网络地址转换之路由器动态NAT模拟
  14. typeScript 参数默认值
  15. 用shell手撸容器实现批量用openssl签证书
  16. 生成伪随机数的函数int rand(void)和void srand(unsigned seed);
  17. HTML5期末大作业:关于动漫网站设计(6页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 web学生网页设计作业源码...
  18. Python中is、not、is not的区别
  19. 02-什么是域名?什么是网址?
  20. web应用程序和web服务

热门文章

  1. Pycharm安装cv2
  2. 安卓手机充电慢_安卓设备可用苹果Magsafe无线充电,但功率鸡肋,安卓并不需要|安卓|安卓手机|充电器|电池...
  3. 5个令人惊艳的AI项目,开源了。。
  4. android Okio
  5. C++函数模板的使用详解
  6. layui树形懒加载_layui树形表格支持非异步和异步加载
  7. NNI使用python文件直接启动参数调优
  8. mac-Sublime Text 3.2.2 Build 3211
  9. LeetCode 二叉树路径问题 Path SUM(①②③)总结
  10. IT忍者神龟之理解回顾面向对象的 JavaScript