旋转(Rotation)矩阵转欧拉角(euler)
文章目录
- 摘要
- Rotation matrices
- Generalized rotation matrices
- Finding two possible angles for θ\thetaθ
- Find the corresponding angles of ψ\psiψ
- Finding the corresponding angles of ϕ\phiϕ
- Two solutions if cosθ≠0\cos \theta \ne 0cosθ=0
- What if cosθ=0\cos \theta=0cosθ=0?
- Pseudo-code
- More than one solution
- reference
摘要
本文档讨论了从旋转矩阵中找所有可能欧拉角的简单技术。在计算机图形学、视觉,机器人和动力学中,有时候欧拉角的确定是必须的一步。然而,它的解可能不是那么的显而易见。
paper: Computing Euler angles from a rotation matrix
author:Gregory G. Slabaugh
Rotation matrices
我们从绕三个主轴旋转的标准定义开始。
绕x轴旋转ψ\psiψ弧度可定义为
Rx(ψ)=[1000cosψ−sinψ0sinψcosψ]R_x(\psi) = \begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos \psi & -sin \psi \\ 0 & \sin \psi & \cos \psi \end{bmatrix} Rx(ψ)=⎣⎡1000cosψsinψ0−sinψcosψ⎦⎤
与此类似,绕y轴旋转θ\thetaθ弧度可定义为
Ry(θ)=[cosθ0sinθ010−sinθ0cosθ]R_y(\theta) = \begin{bmatrix} \cos \theta & 0 & sin \theta \\ 0 & 1 & 0 \\ -\sin \theta & 0 & \cos \theta \end{bmatrix} Ry(θ)=⎣⎡cosθ0−sinθ010sinθ0cosθ⎦⎤
最后,绕z轴旋转ϕ\phiϕ弧度可定义为
Rz(ϕ)=[cosϕ−sinϕ0sinϕcosϕ0001]R_z(\phi) = \begin{bmatrix} \cos \phi & -\sin \phi & 0 \\ \sin \phi & \cos \phi & 0 \\ 0 & 0 & 1 \end{bmatrix} Rz(ϕ)=⎣⎡cosϕsinϕ0−sinϕcosϕ0001⎦⎤
角ψ,θ,ϕ\psi, \theta, \phiψ,θ,ϕ是欧拉角。
Generalized rotation matrices
旋转矩阵一般可以写成
R=[R11R12R13R21R22R23R31R32R33]R = \begin{bmatrix} R_{11} & R_{12} & R_{13} \\ R_{21} & R_{22} & R_{23} \\ R_{31} & R_{32} & R_{33} \end{bmatrix} R=⎣⎡R11R21R31R12R22R32R13R23R33⎦⎤
可以将此矩阵考虑为三个旋转序列,每个旋转轴绕一个主轴旋转。由于矩阵乘法不满足交换律,因此绕轴旋转的顺序会影响结果。对于此分析,我们将首先绕x轴旋转,然后绕y轴旋转,最后绕z轴旋转。 这样的旋转序列可以表示为矩阵乘积,
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{alignedat}{2} R = R_z(\phi)R_y(\theta)R_x(\psi) \\ &=\begin{bmatrix} \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{bmatrix} \end{alignedat} 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(\phi)Rz(ϕ)Ry(θ)Rx(ϕ)对应元素相等计算欧拉角ψ,θ,ϕ\psi, \theta, \phiψ,θ,ϕ。这将得到九个方程,可用于找到欧拉角。
Finding two possible angles for θ\thetaθ
由R31R_{31}R31,我们得到
R31=−sinθR_{31} = - \sin \theta R31=−sinθ
对等式求反得到
θ=−asin(R31)(1)\theta = - \mathrm{asin}(R_{31}) \tag{1} θ=−asin(R31)(1)
然而,对等式(1)解释的时候应该注意到sin(π−θ)=sinθ\sin (\pi - \theta)=\sin \thetasin(π−θ)=sinθ,因此有两个不同的θ\thetaθ都满足等式(1)(备注:除了θ=±π/2\theta= \pm \pi /2θ=±π/2(即R31=±1R_{31}=\pm1R31=±1))。因此θ\thetaθ有两个有效的解。
θ1=−asin(R31)θ2=π−θ1=π+asin(R31)\begin{aligned} \theta_1 &= - \mathrm{asin}(R_{31}) \\ \theta_2 &= \pi - \theta_1 = \pi + \mathrm{asin}(R_{31}) \end{aligned} θ1θ2=−asin(R31)=π−θ1=π+asin(R31)
接下来的报告中,我们将单独处理R31=±1R_{31}= \pm 1R31=±1的情况。因此,通过利用R31R_{31}R31元素的值,我们可以确定θ\thetaθ的两个不同的值。
Find the corresponding angles of ψ\psiψ
为了找到ψ\psiψ的值,我们观察到
R32R33=tan(ψ)\frac{R_{32}}{R_{33}} = \tan(\psi) R33R32=tan(ψ)
我们使用该等式解ψ\psiψ,有
ψ=atan2(R32,R33)(2)\psi = \mathrm{atan2}(R_{32}, R_{33}) \tag{2} ψ=atan2(R32,R33)(2)
其中atan2(y,x)\mathrm{atan2}(y, x)atan2(y,x)表示变量x,yx, yx,y的反正切,它类似于计算y / x的反正切,不同之处在于,两个自变量的符号都用于确定结果的象限,该象限在[-π,π]范围内。函数atan2\mathrm{atan2}atan2在很多程序语言中都有实现。
在解释等式(2)时我们注意到,当cosθ>0\cos \theta \gt 0cosθ>0时, ψ=atan(R32,R33)\psi = \mathrm{atan(R_{32}, R_{33})}ψ=atan(R32,R33),然而,当cosψ<0\cos \psi \lt 0cosψ<0时, ψ=atan2(−R32,−R33)\psi = \mathrm{atan2}(-R_{32}, -R_{33})ψ=atan2(−R32,−R33),一个简单的解决方法是使用等式
ψ=atan2(R32cosθ,R33cosθ)(3)\psi = \mathrm{atan2}\left(\frac{R_{32}}{\cos \theta}, \frac{R_{33}}{\cos \theta} \right) \tag{3} ψ=atan2(cosθR32,cosθR33)(3)
计算ψ\psiψ。
等式3对于所有的情况都适用,除了当cosθ=0\cos \theta = 0cosθ=0时,随后将处理这种特殊情况。对于每一个θ\thetaθ值,我们利用等式(3)计算一个对应的ψ\psiψ值,得到
ψ1=atan2(R32cosθ1,R33cosθ1)(4)\psi_1 = \mathrm{atan2} \left( \frac{R_{32}}{\cos \theta_1}, \frac{R_{33}}{\cos \theta_1} \right) \tag{4} ψ1=atan2(cosθ1R32,cosθ1R33)(4)
ψ2=atan2(R32cosθ2,R33cosθ2)(5)\psi_2 = \mathrm{atan2} \left( \frac{R_{32}}{\cos \theta_2}, \frac{R_{33}}{\cos \theta_2} \right) \tag{5} ψ2=atan2(cosθ2R32,cosθ2R33)(5)
Finding the corresponding angles of ϕ\phiϕ
类似的分析也适用于寻找ϕ\phiϕ,观察到
R21R11=tanϕ\frac{R_{21}}{R_{11}} = \tan \phi R11R21=tanϕ
解ϕ\phiϕ使用等式
ϕ=atan2(R21cosθ,R11cosθ)(6)\phi = \mathrm{atan2}\left( \frac{R_{21}}{\cos \theta}, \frac{R_{11}}{\cos \theta}\right) \tag{6} ϕ=atan2(cosθR21,cosθR11)(6)
同样,等式6对于所有的情况都适用,除了当cosθ=0\cos \theta = 0cosθ=0时,随后将处理这种特殊情况。对于每一个θ\thetaθ值,我们利用等式(6)计算一个对应的ϕ\phiϕ值,得到
ϕ1=atan2(R21cosθ1,R11cosθ1)(7)\phi_1 = \mathrm{atan2} \left( \frac{R_{21}}{\cos \theta_1}, \frac{R_{11}}{\cos \theta_1} \right) \tag{7} ϕ1=atan2(cosθ1R21,cosθ1R11)(7)
ϕ2=atan2(R21cosθ2,R11cosθ2)(8)\phi_2 = \mathrm{atan2} \left( \frac{R_{21}}{\cos \theta_2}, \frac{R_{11}}{\cos \theta_2} \right) \tag{8} ϕ2=atan2(cosθ2R21,cosθ2R11)(8)
Two solutions if cosθ≠0\cos \theta \ne 0cosθ=0
对于cosθ≠0\cos \theta \ne 0cosθ=0的情况,我们现在有两个三维(triplets)欧拉角来重现(reproduce)旋转矩阵,即
(ψ1,θ1,ϕ1)(ψ2,θ2,ϕ2)(\psi_1, \theta_1, \phi_1) \\ (\psi_2, \theta_2, \phi_2) (ψ1,θ1,ϕ1)(ψ2,θ2,ϕ2)
这两个解都是有效的。
What if cosθ=0\cos \theta=0cosθ=0?
如果旋转矩阵的R33R_{33}R33元素为1或-1(分别对应θ=−π/2\theta = - \pi/2θ=−π/2或θ=π/2\theta = \pi/2θ=π/2且cosθ=0\cos \theta = 0cosθ=0),则上述技术无效。当我们试图使用上面的技术解ψ,ϕ\psi, \phiψ,ϕ时,将会出现问题,因为R11,R21,R32,R33R_{11}, R_{21}, R_{32}, R_{33}R11,R21,R32,R33都等于0,等式(3)和(6)变成
ψ=atan2(0,0)ϕ=atan2(0,0)\psi = \mathrm{atan2} \left(0, 0 \right) \\ \phi = \mathrm{atan2} \left(0, 0 \right) ψ=atan2(0,0)ϕ=atan2(0,0)
在这种情况下,R11,R21,R32,R33R_{11}, R_{21}, R_{32}, R_{33}R11,R21,R32,R33不限制ψ\psiψ和ϕ\phiϕ的值。 因此,我们必须使用旋转矩阵的不同元素来计算ψ\psiψ和ϕ\phiϕ的值。
- θ=π/2\theta = \pi/2θ=π/2情况:当θ=π/2\theta = \pi/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(ψ−ϕ)=−R12R_{12} = \sin \psi \sin \theta \cos \phi-\cos \psi \sin \phi = \sin \psi \cos \phi-\cos \psi \sin \phi =\sin(\psi - \phi) \\ R_{13}=\cos \psi \sin \theta \cos \phi+\sin \psi \sin \phi = \cos \psi \cos \phi+\sin \psi \sin \phi=\cos (\psi - \phi) \\ R_{22} = \sin \psi \sin \theta \sin \phi+\cos \psi \cos \phi= \sin \psi \sin \phi+\cos \psi \cos \phi = \cos(\psi - \phi) = R_{13} \\ R_{23} = \cos \psi \sin \theta \sin \phi-\sin \psi \cos \phi = \cos \psi \sin \phi-\sin \psi \cos \phi = - \sin (\psi - \phi) = -R_{12} 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
满足这些等式的任何ϕ,ψ\phi, \psiϕ,ψ都是有效的解,利用等式R12,R13R_{12}, R_{13}R12,R13,我们发现
(ψ−ϕ)=atan2(R12,R13)ψ=ϕ+atan2(R12,R13)(\psi - \phi) = \mathrm{atan2}(R_{12}, R_{13}) \\ \psi = \phi + \mathrm{atan2}(R_{12}, R_{13}) (ψ−ϕ)=atan2(R12,R13)ψ=ϕ+atan2(R12,R13) - θ=−π/2\theta =- \pi/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(ψ+ϕ)=R12R_{12} = \sin \psi \sin \theta \cos \phi-\cos \psi \sin \phi = -\sin \psi \cos \phi-\cos \psi \sin \phi =-\sin(\psi + \phi) \\ R_{13}=\cos \psi \sin \theta \cos \phi+\sin \psi \sin \phi = -\cos \psi \cos \phi+\sin \psi \sin \phi=-\cos (\psi +\phi) \\ R_{22} = \sin \psi \sin \theta \sin \phi+\cos \psi \cos \phi= -\sin \psi \sin \phi+\cos \psi \cos \phi = \cos(\psi + \phi) = -R_{13} \\ R_{23} = \cos \psi \sin \theta \sin \phi-\sin \psi \cos \phi = - \cos \psi \sin \phi-\sin \psi \cos \phi = - -\sin (\psi + \phi) = R_{12} 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)(\psi + \phi) = \mathrm{atan2}(-R_{12}, -R_{13}) \\ \psi = -\phi + \mathrm{atan2}(-R_{12}, -R_{13}) (ψ+ϕ)=atan2(−R12,−R13)ψ=−ϕ+atan2(−R12,−R13)
- 无论哪种情况: 在θ=π/2\theta = \pi/2θ=π/2和θ=−π/2\theta = -\pi/2θ=−π/2的情况下,我们都发现ψ\psiψ和ϕ\phiϕ是关联的。 这种现象称为万向节锁(Gimbal lock)。尽管在这种情况下,有无数个问题的解,但在实践中,人们常常有兴趣寻找一个解。 对于此任务,如上所述方便地设置ϕ=0\phi=0ϕ=0并计算ψ\psiψ。
Pseudo-code
现在,我们通过图1中的伪代码实现来总结该方法。代码非常简单。
More than one solution
有趣的是,围绕三个主轴旋转的序列始终不止一种,他们都能得到物体相同的方向。 如本报告所示,在cosθ≠0\cos \theta \ne 0cosθ=0的非退化(non-degenerate)的情况下,有两个解。 对于cosθ=0\cos \theta = 0cosθ=0的退化情况,存在无限数量的解。
例如,考虑一本书放在您面前的桌子上。 将x轴定义为右侧,将y轴定义为远离您,将z轴定义为向上。 绕y轴旋转π\piπ弧度将使书本旋转,使得后盖现在朝上。 实现相同方向的另一种方法是绕xxx轴旋转书本π\piπ弧度,然后绕z轴旋转π\piπ弧度。 因此,存在不止一种方式来实现期望的旋转。
reference
[1]. Gregory G. Slabaugh, Computing Euler angles from a rotation matrix
旋转(Rotation)矩阵转欧拉角(euler)相关推荐
- 欧拉角(Euler angles)
前言:本人也就英语4级水平,由于本篇中存在大量学术词汇,翻译时必然会有不当之处,原文可以在下面的链接中找到,具体意义各位可以自行斟酌 标红的部分是已发现存疑的翻译,也请各位指正. 维基百科-欧拉角 欧 ...
- 3D数学基础——矩阵、欧拉角和四元数的相互转换与比较
矩阵.欧拉角和四元数的相互转换与比较 相互转换 这里只展示最终的转换结果,推导过程请参考<3D数学基础:图形与游戏开发> 欧拉角转换到矩阵 欧拉角描述了一个旋转序列,分别计算出给每个旋转的 ...
- OpenGL相机自由移动旋转缩放,四元数,欧拉角,LookAt
OpenGL相机自由移动旋转缩放,四元数,欧拉角,LookAt 定义相机 摄像机位置 右轴 上轴 Look At 自由移动相机 左右移动 移动速度 视角移动 欧拉角 通过欧拉角计算实际的方向向量 缩放 ...
- C语言实现方向余弦矩阵转欧拉角和姿态四元数
方向余弦矩阵转欧拉角和姿态四元数 方向余弦矩阵 欧拉角 姿态四元数 源码 方向余弦矩阵 方向余弦矩阵(Direction Cosine Matrix,DCM)又被称为"坐标转换矩阵" ...
- PCL点云的旋转平移矩阵
目录 (一)左乘右乘 1.左乘 2.右乘 (二)旋转平移矩阵公式 1.绕X轴逆时针旋转角度θ 2.绕Y轴逆时针旋转角度θ 3.绕Z轴逆时针旋转角度θ 4.平移 (三)旋转平移矩阵的逆 (四)PCL实现 ...
- 《PCL点云库学习VS2010(X64)》Part 34 旋转平移矩阵用法
<PCL点云库学习&VS2010(X64)>Part 34 旋转平移矩阵用法 1.变换与投影矩阵讲解: https://en.wikipedia.org/wiki/Transfor ...
- 【Unity学习笔记】为什么欧拉角(Euler)会符合万向节(Gimbal)规则?
声明:此篇文章是个人学习笔记,并非教程,所以内容可能不够严谨.可作参考,但不保证绝对正确.如果你发现我的文章有什么错误,非常欢迎指正,谢谢哦. 0 引言 在我的上一篇笔记中,我主要关注点在" ...
- 无人机运动学控制中的坐标系,及惯性坐标系与机体坐标系之间的矩阵转换 欧拉角
一.无人机控制中的坐标系 无人机运动学中,有三种需要了解的坐标系 1.1.地球中心坐标系(ECEF) 地球中心坐标系,即坐标系原点位于地心.X轴通过格林尼治线和赤道线的交点,正方向为原点指向交点方向. ...
- NYOJ 598 旋转圆柱矩阵
旋转圆柱矩阵 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 将圆柱体的侧面展开能得到一个m*n的矩形.这是姑且看成一个01矩阵, 我们需要通过特定的移动得到另一个矩阵( ...
- 算法练习day8——190326(猫狗队列、转圈打印矩阵、旋转正方形矩阵、反转单向双向链表、数N的加法组合)
1.猫狗队列 [题目] 宠物. 狗和猫的类如下: public class Pet {private String type;public Pet(String type) {this.type = ...
最新文章
- Scratch等级考试(一级)模拟题
- 灵玖Nlpir Parser语义智能系统精准汉语分词
- Xcode 8 控制台输出大量不用的log的问题解决NSLog失效的解决
- 文章如何做伪原创 SEO大神教你几招做原创网站文章的心得
- 用python写一个简单的推荐系统 1
- 【攻防世界007】simple-check-100
- 2.6宽带接入技术ADSL
- Microsoft.NET框架程序设计--18 异常
- 商汤科技大涨逾15% 市值突破2000亿港元
- lua与python结合_从Python到Lua
- 人工智能领域有哪些曾被拒稿的优秀工作?
- 2023年厦门大学全日制会计专硕(MPAcc)考研上岸前辈备考经验
- HTML5期末大作业:大学生个人网站设计——我们的班级(7页) HTML+CSS+JavaScript 学生DW网页设计作业成品 html网页制作代码大全 html5网页设计作业代码
- ADS入门,使用ADS创建和仿真一个简单的线路
- h5py ImportError: DLL load failed while importing defs: 找不到指定的程序。
- JEECG集成ACTIVITI
- 普渡大学计算机硕士申请条件,普渡大学计算机科学硕士录取条件有哪些?需要这些申请材料...
- webgis、gis学习技巧总结
- ie窗口如何最大化设置
- Ubuntu 18.04.1 LTS 安装网易云音乐,告别图标无法点击
热门文章
- The vertically scrolling ScrollView should not contain another vertically scrolling widget (ListView
- 驯服烂代码_驯服业力,SauceLabs和Internet Explorer:揭秘之旅
- 阿里云大数据ACP认证学习笔记
- docker学习--数据卷
- Java学习笔记(9)-StringBuilder类二
- ubuntu开机密码破解
- GRUB legacy和GRUB 2介绍 与 命令【包含kernel 与 initrd的详解】使用
- 阿里乾坤qiankun
- 拿下沙巴克出色的指挥官不可少
- 业务流程管理模型优化设计