旋转矩阵与欧拉角

旋转矩阵与欧拉角

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

三个主轴的旋转矩阵

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

关于绕 x 轴旋转 ψ 弧度 的主动旋转定义为

Rx(ψ)=[1000cosψsinψ0sinψcosψ]

关于绕 y 轴旋转 θ 弧度 的主动旋转定义为

Ry(θ)=[cosθ0sinθ010sinθ0cosθ]

关于绕 z 轴旋转 ψ 弧度 的主动旋转定义为

Rz(ϕ)=[cosϕsinϕ0sinϕcosϕ0001]

广义旋转矩阵

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

R=[r11r12r13r21r22r23r31r32r33]

旋转矩阵与转角

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

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

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

两种旋转转轴:

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

Fixed angles

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

以绕固定轴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θ]

Euler angles

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

求解角度

给定旋转矩阵 R,我们可以通过将 R 中的每个元素与矩阵乘积 Rz(ϕ)Ry(θ)Rx(ψ) 中的相应元素相等来计算欧拉角 ψθϕ,这产生了九个可用于求欧拉角的方程。

求解 θ 可能的两个角度

通过旋转矩阵的元素 r31 ,可以得到:

r31=sinθ

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

(1)θ=arcsinr31

r31±1,由于 sin(πθ)=sinθ,实际上有两个不同的 θ 值满足方程 (1);因此,这两个值都是能作为有效解的:

θ1=arcsinr31θ2=πθ1=π+arcsinr31

r31=±1,将有特殊处理的地方,这个在稍后处理。

因此,使用旋转矩阵的元素 r31,我们能够确定 θ 的两个可能值。

求解 ψ 的角度

为了找到 ψ 的值,观察旋转矩阵可以得到:

(2)r32r33=sinψcosθcosψcosθ=tanψ

使用这个方程可以求解出 ψ

ψ=atan2(r32,r33)

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

在解方程 (2) 时必须小心:如果 cosθ>0,则 ψ=atan2(r32,r33);然而,当 cosθ<0 时,ψ=atan2(r32,r33)。处理此问题的简单方法是使用以下式子求解出 ψ

(3)ψ=atan2(r32cosθ,r33cosθ)

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

(4)ψ1=atan2(r32cosθ1,r33cosθ1)(5)ψ2=atan2(r32cosθ2,r33cosθ2)

求解 ϕ 的角度

类似求解 ψ 的分析也适用于求解 ϕ,观察旋转矩阵可以得到:

r21r11=cosθsinϕcosθcosϕ=tanϕ

使用这个方程可以求解出 ϕ

(6)ϕ=atan2(r21cosθ,r11cosθ)

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

(7)ϕ1=atan2(r21cosθ1,r11cosθ1)(8)ϕ2=atan2(r21cosθ2,r11cosθ2)

cosθ0 的两组解

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

(ψ1,θ1,ϕ1)(ψ2,θ2,ϕ2)

这两个解都是有效的。

处理特殊情况 cosθ=0

如果旋转矩阵的元素 r31=±1,也就是分别对应于 θ=±π/2,也就是 cosθ=0,上述方法将不起作用。

当我们尝试使用上述方法求解 ψϕ 的可能值时,会出现问题,因为旋转矩阵的元素 r11r21r32r33 的值都将等于 0,也就是方程 (3)(6) 将变为:

ψ=atan2(00,00)ϕ=atan2(00,00)

在这种情况下,r11r21r32r33 不限制 ψϕ 的值。因此,我们必须使用其它旋转矩阵的元素来计算 ψϕ 的值。

θ=π/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

使用 r12r13 的方程,我们发现:

(ψϕ)=atan2(r12,r13)ψ=ϕ+atan2(r12,r13)

θ=π/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

同样,使用 r12r13 的方程,我们发现:

(ψ+ϕ)=atan2(r12,r13)ψ=ϕ+atan2(r12,r13)

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

θ=±π/2 的情况下,可以发现 ψϕ 是相连的,也就是 ψϕ 本应该有 2 个自由度,却降为了 1 个自由度,这种现象被称为万向锁

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

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

posted @   Champrin  阅读(463)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示