从旋转矩阵计算欧拉角
从旋转矩阵计算欧拉角
从旋转矩阵中找到所有可能的欧拉角的简单方法,在计算机图形学、视觉学、机器人学和运动学中,欧拉角的确定有时是必要的一步。然而,解决方案可能是明显的,也可能不是。
旋转矩阵
我们从三个主要轴的旋转的标准定义开始。
绕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(ψ)=⎣⎡1000cosψ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θ010sinθ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ϕ0001⎦⎤
这三个角ψ,θ,ϕ\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(ϕ)=⎣⎡R11R21R31R12R22R32R13R23R33⎦⎤
这个矩阵可以被认为是一个三旋转的序列,每个主轴各一个。因为矩阵乘法不能交换,旋转的轴的顺序将影响结果。在这个分析中,我们先绕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)R33R32=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θ1R32,cosθ1R33)ψ=atan2(R32cosθ2,R33cosθ2)\psi=atan2(\frac{R_{32}}{cos\theta_{2}},\frac{R_{33}}{cos\theta_{2}})ψ=atan2(cosθ2R32,cosθ2R33)
求出ϕ\phiϕ对应的角度
类似的分析也适用于寻找。我们观察到
R21R11=tanϕ\frac{R_{21}}{R_{11}}=tan\phiR11R21=tanϕ
我们用这个方程解出了ϕ\phiϕ
ψ=atan2(R21cosθ1,R11cosθ1)\psi=atan2(\frac{R_{21}}{cos\theta_{1}},\frac{R_{11}}{cos\theta_{1}})ψ=atan2(cosθ1R21,cosθ1R11)ψ=atan2(R21cosθ2,R11cosθ2)\psi=atan2(\frac{R_{21}}{cos\theta_{2}},\frac{R_{11}}{cos\theta_{2}})ψ=atan2(cosθ2R21,cosθ2R11)
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(ψ−ϕ)=R13R23=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(ψ+ϕ)=−R13R23=−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=atan2(R32cosθ1,R33cosθ1)ψ2=atan2(R32cosθ2,R33cosθ2)ϕ1=atan2(R21cosθ1,R11cosθ1)ϕ2=atan2(R21cosθ2,R11cosθ2)else ϕ=anything; can set to 0if (R31=−1)θ=π/2ψ=ϕ+atan2(R12,R13)else θ=−π/2ψ=−ϕ+atan2(−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θ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ψ,θ,ϕ。
假设要求我们找出产生这个矩阵的欧拉角
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=atan2(.5cos(π/4),.5cos(π/4))=π4ψ2=atan2(.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=atan2(.5cos(π/4),.5cos(π/4))=π4ϕ2=atan2(.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π)
从旋转矩阵计算欧拉角相关推荐
- 由旋转矩阵计算欧拉角的方法
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lircsszz/article/details/80118051 算法一:直接法 bool isRo ...
- 学习笔记17 --使用matlab自带函数,将旋转矩阵计算成欧拉角
个人环境是使用matlab2017b 该公式计算欧拉角有个要求,必须是3x3的旋转矩阵(尝试过4x4的计算不了).matlab自带的由旋转矩阵计算欧拉角公式是,rotm2eul(),其可以指定旋转顺序 ...
- 从某一点出发沿任意一方向旋转矩阵计算思考与实现
欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击. 上期讲到 绕任一向量旋转矩阵计算思考与实现 点击前往 点击前往 问题提出 之前讲到绕任一向量旋转矩阵实现,原来的向量都是从原点出 ...
- 图形学笔记(四)变换——三维变换(三维旋转与欧拉角)、MVP变换、视图变换、投影变换(正交投影与透视投影)
图形学笔记(三)变换--缩放.镜像.切变 图形学笔记(五)光栅化--屏幕.像素.屏幕空间.视口变换.基础图元与三角形.采样.包围盒.锯齿或走样 文章目录 1 三维空间中的变换 1.1 三维空间中的齐次 ...
- Unity的旋转-四元数,欧拉角用法简介
当初弄不明白旋转..居然找不到资料四元数应该用轴角相乘... 通过两种旋转的配合,可以告别世界空间和本地空间矩阵转换了,大大提升效率. 每个轴相乘即可,可以任意轴,无限乘.无万向节锁问题 四元数旋转: ...
- Unity手游之路四3d旋转-四元数,欧拉角和变幻矩阵
http://blog.csdn.net/janeky/article/details/17272625 今天我们来谈谈关于Unity中的旋转.主要有三种方式.变换矩阵,四元数和欧拉角. 定义 变换矩 ...
- SO3,SE3,旋转,欧拉角与四元数笔记
在机器人学中的定义和其它领域中的定义有时候会有不同,长时间不用也会记混淆.这里记录一下便于回头翻阅. 参考<A Mathematical Introduction to Robotic Mani ...
- 使3D空间中物体朝向和其速度方向一致的旋转矩阵计算方案
在3D空间中的物体以某一速度运动,有时候需要这个物体的朝向和速度的方向一致, 为了实现这个目标我们一般借助旋转矩阵 M 来将物体旋转到对应的朝向. 例如速度方向矢量 spdV: Vector3D(1, ...
- 如何将四元数方向转化为旋转举证_是否有将四元数旋转转换为欧拉角旋转的算法?...
frodo2975.. 7 我一直在寻找类似解决方案的几天,我终于遇到了这个网站,它有一个将四元数转换为任意Euler和Tait-Bryan旋转的算法! 这是代码: /// // Quaternion ...
最新文章
- 阿里架构师,讲述分布式架构云平台解决方案(附学习路线)...
- vscode如何设置自动保存时自动格式化代码
- VS.NET C#视频教学
- 线性序列机与串行接口ADC驱动设计与验证
- java设置属性的取值范围是多少_jvm-Java系统属性的范围
- String、StringBuuffer、StringBuilder三者的区别
- 设置公共请求参数_封装一个useFetch实现页面销毁取消请求
- 小木虫网站无法登陆(账号突然被封禁)的解决办法
- Flutter 上字体的另类玩法:FontFeature
- Rancher部署日志
- 将Eclipse设置为中文
- 【渝粤题库】陕西师范大学202501 法语(二)作业
- 【计算机网络】思科实验(8):网络地址转换之路由器动态NAT模拟
- typeScript 参数默认值
- 用shell手撸容器实现批量用openssl签证书
- 生成伪随机数的函数int rand(void)和void srand(unsigned seed);
- HTML5期末大作业:关于动漫网站设计(6页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 web学生网页设计作业源码...
- Python中is、not、is not的区别
- 02-什么是域名?什么是网址?
- web应用程序和web服务
热门文章
- Pycharm安装cv2
- 安卓手机充电慢_安卓设备可用苹果Magsafe无线充电,但功率鸡肋,安卓并不需要|安卓|安卓手机|充电器|电池...
- 5个令人惊艳的AI项目,开源了。。
- android Okio
- C++函数模板的使用详解
- layui树形懒加载_layui树形表格支持非异步和异步加载
- NNI使用python文件直接启动参数调优
- mac-Sublime Text 3.2.2 Build 3211
- LeetCode 二叉树路径问题 Path SUM(①②③)总结
- IT忍者神龟之理解回顾面向对象的 JavaScript