首页 > 其他分享 >旋转矩阵与欧拉角

旋转矩阵与欧拉角

时间:2023-08-19 20:45:50浏览次数:29  
标签:phi psi 欧拉角 矩阵 cos 旋转 theta sin

旋转矩阵与欧拉角

参考文献:
[Computing Euler angles from a rotation matrix ——Gregory G. Slabaugh]

三个主轴的旋转矩阵

右手坐标系,逆时针转动角度为正(右手螺旋定则确定)。

关于绕 \(x\) 轴旋转 \(\psi\) 弧度 的主动旋转定义为

\[ R_x(\psi) = \begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos\psi & -\sin\psi \\ 0 & \sin\psi & \cos\psi \end{bmatrix} \]

关于绕 \(y\) 轴旋转 \(\theta\) 弧度 的主动旋转定义为

\[ R_y(\theta) = \begin{bmatrix} \cos\theta & 0 & \sin\theta \\ 0 & 1 & 0 \\ -\sin\theta & 0 & \cos\theta \end{bmatrix} \]

关于绕 \(z\) 轴旋转 \(\psi\) 弧度 的主动旋转定义为

\[ R_z(\phi) = \begin{bmatrix} \cos\phi & -\sin\phi & 0 \\ \sin\phi & \cos\phi & 0 \\ 0 & 0 & 1 \end{bmatrix} \]

广义旋转矩阵

一般旋转矩阵具有如下形式,

\[ R = \begin{bmatrix} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33} \end{bmatrix} \]

旋转矩阵与转角

旋转矩阵可以认为是每个主轴都有一次旋转的共有三个旋转的序列,这也能与空间中的旋转是三个自由度对应。

将旋转矩阵拆解成 3 次旋转角度来做 3 次旋转连乘,有以下注意事项:

  • 由于矩阵乘法是不可交换的,因此轴旋转先后的顺序将影响结果
  • 旋转转轴也需要明确定义,是对“固定不动”的转轴旋转?还是对“转动的坐标系当下所在”的转轴旋转?

两种旋转转轴:

  • 对方向“固定不动”的转轴旋转:Fixed angles
  • 对“转动的坐标系当下所在”的转轴反向旋转:Euler angles

Fixed angles

Fixed angles 是以某个固定转轴来旋转坐标系的。

以绕固定轴X、Y、Z的顺序旋转为例,将其表示为旋转矩阵,

\[\begin{aligned} 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{aligned} \]

Euler angles

Fixed angles 是以自身坐标轴为转轴来旋转坐标系的。

求解角度

给定旋转矩阵 \(R\),我们可以通过将 \(R\) 中的每个元素与矩阵乘积 \(R_z(\phi)R_y(\theta)R_x(\psi)\) 中的相应元素相等来计算欧拉角 \(\psi\)、\(\theta\) 和 \(\phi\),这产生了九个可用于求欧拉角的方程。

求解 \(\theta\) 可能的两个角度

通过旋转矩阵的元素 \(r_{31}\) ,可以得到:

\[ r_{31} = −\sin\theta \]

再通过反三角函数就可以得出:

\[ \theta = −\arcsin{r_{31}} \tag{1} \]

若 \(r_{31} \not= {\pm1}\),由于 \(\sin(\pi−\theta) = \sin\theta\),实际上有两个不同的 \(\theta\) 值满足方程 \((1)\);因此,这两个值都是能作为有效解的:

\[\begin{aligned} \theta_1 & = −\arcsin{r_{31}} \\ \theta_2 & = \pi − \theta_1 = \pi + \arcsin{r_{31}} \end{aligned} \]

若 \(r_{31} = {\pm1}\),将有特殊处理的地方,这个在稍后处理。

因此,使用旋转矩阵的元素 \(r_{31}\),我们能够确定 \(\theta\) 的两个可能值。

求解 \(\psi\) 的角度

为了找到 \(\psi\) 的值,观察旋转矩阵可以得到:

\[ \frac{r_{32}}{r_{33}} = \frac{\sin\psi\cos\theta}{\cos\psi\cos\theta} = \tan\psi \tag{2} \]

使用这个方程可以求解出 \(\psi\):

\[ \psi = atan2(r_{32}, r_{33}) \]

其中 \(atan2(y, x)\) 是两个变量 \(x\) 和 \(y\) 的反正切。它类似于计算 \(y/x\) 的反正切,只是两个参数的正负符号用于确定结果的象限,该象限位于 \([-\pi,\pi]\) 范围内。函数 \(atan2(y, x)\) 在许多编程语言中都可用。

在解方程 \((2)\) 时必须小心:如果 \(\cos\theta > 0\),则 \(\psi = atan2(r_{32}, r_{33})\);然而,当 \(\cos\theta < 0\) 时,\(\psi = atan2(-r_{32}, -r_{33})\)。处理此问题的简单方法是使用以下式子求解出 \(\psi\):

\[ \psi = atan2(\frac{r_{32}}{\cos\theta}, \frac{r_{33}}{\cos\theta}) \tag{3} \]

除 \(\cos\theta = 0\) 之外,方程 \((3)\) 适用于所有情况,这也在稍后处理这个特殊情况。对于每个 \(\theta\) 值,我们使用方程 \((3)\) 计算相应的 \(\psi\) 值,得出:

\[\begin{align} \psi_1 & = atan2(\frac{r_{32}}{\cos\theta_1}, \frac{r_{33}}{\cos\theta_1}) \tag{4} \\ \psi_2 & = atan2(\frac{r_{32}}{\cos\theta_2}, \frac{r_{33}}{\cos\theta_2}) \tag{5} \end{align} \]

求解 \(\phi\) 的角度

类似求解 \(\psi\) 的分析也适用于求解 \(\phi\),观察旋转矩阵可以得到:

\[ \frac{r_{21}}{r_{11}} = \frac{\cos\theta\sin\phi}{\cos\theta\cos\phi } = \tan\phi \]

使用这个方程可以求解出 \(\phi\):

\[ \phi = atan2(\frac{r_{21}}{\cos\theta}, \frac{r_{11}}{\cos\theta}) \tag{6} \]

同样,除了 \(\cos\theta = 0\) 之外,方程 \((6)\) 对所有情况都有效。这也在稍后处理这个特殊情况。对于每个 \(\theta\) 值,我们使用方程 \((3)\) 计算相应的 \(\psi\) 值,得出:

\[\begin{align} \phi_1 = atan2(\frac{r_{21}}{\cos\theta_1}, \frac{r_{11}}{\cos\theta_1}) \tag{7} \\ \phi_2 = atan2(\frac{r_{21}}{\cos\theta_2}, \frac{r_{11}}{\cos\theta_2}) \tag{8} \end{align} \]

当 \(\cos\theta \not= 0\) 的两组解

对于\(\cos\theta \not= 0\)的情况,通过上述我们可以得出两组欧拉角的解,它们再现了旋转矩阵,即:

\[ (\psi_1, \theta_1, \phi_1) \\ (\psi_2, \theta_2, \phi_2) \]

这两个解都是有效的。

处理特殊情况 \(\cos\theta = 0\)

如果旋转矩阵的元素 \(r_{31} = {\pm1}\),也就是分别对应于 \(\theta = \pm \pi/2\),也就是 \(\cos\theta = 0\),上述方法将不起作用。

当我们尝试使用上述方法求解 \(\psi\) 和 \(\phi\) 的可能值时,会出现问题,因为旋转矩阵的元素 \(r_{11}\)、\(r_{21}\)、\(r_{32}\) 和 \(r_{33}\) 的值都将等于 \(0\),也就是方程 \((3)\) 和 \((6)\) 将变为:

\[\begin{aligned} \psi & = atan2(\frac{0}{0}, \frac{0}{0}) \\ \phi & = atan2(\frac{0}{0}, \frac{0}{0}) \end{aligned} \]

在这种情况下,\(r_{11}\)、\(r_{21}\)、\(r_{32}\) 和 \(r_{33}\) 不限制 \(\psi\) 和 \(\phi\) 的值。因此,我们必须使用其它旋转矩阵的元素来计算 \(\psi\) 和 \(\phi\) 的值。

\(\theta = \pi/2\) 的情况:考虑 \(\theta = \pi/2\),那么,

\[\begin{aligned} 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{aligned} \]

使用 \(r_{12}\) 和 \(r_{13}\) 的方程,我们发现:

\[\begin{aligned} (\psi − \phi) & = atan2(r_{12}, r_{13}) \\ \psi & = \phi + atan2(r_{12}, r_{13}) \end{aligned} \]

\(\theta = -\pi/2\) 的情况:毫不奇怪,当 \(\theta = -\pi/2\),类似的结果也成立,

\[\begin{aligned} 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{aligned} \]

同样,使用 \(r_{12}\) 和 \(r_{13}\) 的方程,我们发现:

\[\begin{aligned} (\psi + \phi) & = atan2(-r_{12}, -r_{13}) \\ \psi & = -\phi + atan2(-r_{12}, -r_{13}) \end{aligned} \]

至此,就解决了从旋转矩阵求解所有情况欧拉角。

在 \(\theta = \pm \pi/2\) 的情况下,可以发现 \(\psi\) 和 \(\phi\) 是相连的,也就是 \(\psi\) 和 \(\phi\) 本应该有 2 个自由度,却降为了 1 个自由度,这种现象被称为万向锁

尽管在这种情况下,\(\psi\) 和 \(\phi\) 有无限多组的解,但在实践中,人们往往对找到一个解的方案感兴趣。对此,可以设置 \(\phi = 0\) 并方便地如上所述计算 \(\psi\)。

这里只是对于矩阵乘积 \(R_z(\phi)R_y(\theta)R_x(\psi)\) 做出的例子,其它旋转顺序和旋转方式会有与其对应的矩阵乘积的表达式,要按照实际情况,类似地依上所述去求解欧拉角。

标签:phi,psi,欧拉角,矩阵,cos,旋转,theta,sin
From: https://www.cnblogs.com/champrin/p/17643082.html

相关文章

  • 旋转矩阵
    目录旋转的表示旋转向量与旋转矩阵之间的变换旋转向量变成旋转矩阵旋转矩阵变为旋转向量左右手坐标系确定及其旋转正向旋转的表示在三维坐标系中,有三种表达形式旋转矩阵\[R=\begin{bmatrix}r_{11}&r_{12}&r_{13}\\r_{21}&r_{22}&r_{......
  • 平面或空间中任意点的旋转
    平面或空间中任意点的旋转自己琢磨出来的。若有错误请指出。谢谢!1.旋转2D假设平面上有一个点\(P(x,y)\),旋转任意角度\(\beta\),求旋转后的点\(P'(x',y')\)。设平面坐标系上有一个半径为\(r\)的圆,圆心位于原点\(O\)。圆与\(x\)轴正坐标的交点为\(P_0(x_0,y_0)\)。\[P_0=......
  • 骚操作:使用RxJava实现ImageView的拖动、旋转和缩放
    本文介绍一种使用Rxjava实现图片交互操作的方法。支持单指拖动,双指旋转缩放,效果如下:自定义View首先自定义TrsImageView继承ImageView,设置ScaleType为Matrix,我们使用矩阵计算最终的translate,rotate和scale。publicclassTrsImageViewextendsImageView{publicTrsImageVi......
  • 矩阵
    一、矩阵的定义对于\(m×n\)个数的矩阵\(a_{i,j},i=[1,m],j=[1,n]\),有\(m\)行\(n\)列,称为\(m×n\)矩阵,这个矩阵排列如下:\[\left[\begin{matrix}a_{1,1}&a_{1,2}&⋯&a_{1,n}\\a_{2,1}&a_{2,2}&⋯&a_{2,n}\\⋮&⋮&⋱&⋮......
  • 小程序中实现图片旋转后保存
    嫌麻烦的可以直接点击小程序代码片段体验,下面是代码:<imagesrc="https://qcloudimg.tencent-cloud.cn/raw/7ff4215737d7877346c0ec6ea1514d94.jpg"mode="widthFix"style="width:100vw;"/><pickermode="selector"range=&qu......
  • 73.矩阵置零
    73.矩阵置零思路:思路一:用O(m+n)O(m+n)O(m+n)额外空间两遍扫matrix,第一遍用集合记录哪些行,哪些列有0;第二遍置0思路二:用O(1)O(1)O(1)空间关键思想:用matrix第一行和第一列记录该行该列是否有0,作为标志位但是对于第一行,和第一列要设置一个标志位,为了防止自己这一......
  • 【8月摸鱼计划】cw32f0有浮点计算单元吗?怎么使用矩阵求逆?
    cw32f0是一款基于中国开源项目的芯片,它并不具备浮点计算单元。因此,无法直接进行浮点数运算。然而,您仍然可以通过一些方法来近似实现浮点数的计算。一种常见的方法是使用定点数表示浮点数,并通过手动实现相应的运算算法来达到类似的效果。这需要根据具体的应用场景设计相应的固定点......
  • 图论之存图-----邻接矩阵
    跟着思路敲了一遍,感觉清晰多了,但是还得多复习。就是利用了深度搜索,很奇妙。点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=2e5+10;intw[N][N];intvis[N];intn,m;inta,b,c;voiddfs(intu){ vis[u]=true; if(vis[u]){ for(inti=1;i<=......
  • 矩阵最值
    题目描述我们有一个N  行  M列的矩阵,现在小Q有K 个问题,每次询问一个以(X1,Y1)为左上角, (X2,Y2)为右下角的子矩阵的最大值。输入格式第一行三个整数N,M,K。接下来N行,每行有 M个整数,设Ai,j 为矩阵i行j 列的数字。接下来k行,每行4个整数  ......
  • hdu 4291(矩阵快速幂+循环节)
    AShortproblemTimeLimit:2000/1000MS(Java/Others)    MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):2487    AcceptedSubmission(s):876ProblemDescriptionAccordingtoaresearch,VIMuserstendtohaveshorterfing......