当前位置: 首页 > news >正文

理解欧拉角:定义、转换与应用

1. 引言

在三维空间中描述物体的旋转时,欧拉角(Euler Angles)是最直观的方法之一。它通过三个连续的绕轴旋转来表示任意朝向,广泛应用于机器人学、航空航天、计算机图形学等领域。然而,不同的欧拉角定义(如经典欧拉角和泰特-布莱恩欧拉角)以及它们之间的转换关系常常让人困惑。本文将系统介绍欧拉角的定义、旋转矩阵和四元数表示,并详细讲解如何在不同欧拉角之间进行转换。


2. 欧拉角的定义

欧拉角根据旋转轴的选择和顺序不同,主要分为两类:

(1)经典欧拉角(Proper Euler Angles)

  • 旋转顺序:绕同一个轴旋转两次(例如 Z-X-Z、X-Y-X)。
  • 典型形式:Z-X-Z
    • 步骤:
      1. 绕 Z 轴旋转 α\alphaα(Yaw,偏航)。
        2.绕 X 轴旋转 β\betaβ(Pitch,俯仰)。
      2. 再次绕 Z 轴旋转 γ\gammaγ(Roll,滚转)。
  • 应用:适用于对称物体的旋转描述,如陀螺仪运动分析。

(2)泰特-布莱恩欧拉角(Tait-Bryan Angles)

  • 旋转顺序:绕三个不同的轴旋转(例如 Z-Y-X、X-Y-Z)。
  • 典型形式:Z-Y-X(Yaw-Pitch-Roll)
    • 步骤:
      1. 绕 Z 轴旋转 ψ\psiψ(Yaw)。
      2. 绕 Y 轴旋转 θ\thetaθ(Pitch)。
      3. 绕 X 轴旋转 ϕ\phiϕ(Roll)。
  • 应用:无人机、机器人、飞行器控制,更符合人类直觉。

3. 欧拉角 → 旋转矩阵

旋转矩阵可以唯一表示一个旋转,不同欧拉角对应的旋转矩阵如下:

(1)经典Z-X-Z欧拉角的旋转矩阵
RZXZ=RZ(α)⋅RX(β)⋅RZ(γ) R_{ZXZ} = R_Z(\alpha) \cdot R_X(\beta) \cdot R_Z(\gamma) RZXZ=RZ(α)RX(β)RZ(γ)
展开后:
RZXZ=[cαcγ−sαcβsγ−cαsγ−sαcβcγsαsβsαcγ+cαcβsγ−sαsγ+cαcβcγ−cαsβsβsγsβcγcβ] R_{ZXZ} = \begin{bmatrix} c_\alpha c_\gamma - s_\alpha c_\beta s_\gamma & -c_\alpha s_\gamma - s_\alpha c_\beta c_\gamma & s_\alpha s_\beta \\ s_\alpha c_\gamma + c_\alpha c_\beta s_\gamma & -s_\alpha s_\gamma + c_\alpha c_\beta c_\gamma & -c_\alpha s_\beta \\ s_\beta s_\gamma & s_\beta c_\gamma & c_\beta \end{bmatrix} RZXZ=cαcγsαcβsγsαcγ+cαcβsγsβsγcαsγsαcβcγsαsγ+cαcβcγsβcγsαsβcαsβcβ
其中 cθ=cos⁡θc_\theta = \cos\thetacθ=cosθ, sθ=sin⁡θs_\theta = \sin\thetasθ=sinθ

(2)泰特-布莱恩Z-Y-X欧拉角的旋转矩阵
RZYX=RZ(ψ)⋅RY(θ)⋅RX(ϕ) R_{ZYX} = R_Z(\psi) \cdot R_Y(\theta) \cdot R_X(\phi) RZYX=RZ(ψ)RY(θ)RX(ϕ)
展开后:
RZYX=[cψcθcψsθsϕ−sψcϕcψsθcϕ+sψsϕsψcθsψsθsϕ+cψcϕsψsθcϕ−cψsϕ−sθcθsϕcθcϕ] R_{ZYX} = \begin{bmatrix} c_\psi c_\theta & c_\psi s_\theta s_\phi - s_\psi c_\phi & c_\psi s_\theta c_\phi + s_\psi s_\phi \\ s_\psi c_\theta & s_\psi s_\theta s_\phi + c_\psi c_\phi & s_\psi s_\theta c_\phi - c_\psi s_\phi \\ -s_\theta & c_\theta s_\phi & c_\theta c_\phi \end{bmatrix} RZYX=cψcθsψcθsθcψsθsϕsψcϕsψsθsϕ+cψcϕcθsϕcψsθcϕ+sψsϕsψsθcϕcψsϕcθcϕ


4. 欧拉角 → 四元数

四元数(Quaternion)是另一种表示旋转的方式,能避免万向节锁问题。

(1)经典Z-X-Z欧拉角 → 四元数
分步旋转对应的四元数:

  1. 绕 Z 轴旋转 α\alphaαqz(α)=[cos⁡α2,0,0,sin⁡α2]q_z(\alpha) = [\cos\frac{\alpha}{2}, 0, 0, \sin\frac{\alpha}{2}]qz(α)=[cos2α,0,0,sin2α]
  2. 绕 X 轴旋转 β\betaβqx(β)=[cos⁡β2,sin⁡β2,0,0]q_x(\beta) = [\cos\frac{\beta}{2}, \sin\frac{\beta}{2}, 0, 0]qx(β)=[cos2β,sin2β,0,0]
  3. 绕 Z 轴旋转 γ\gammaγqz(γ)=[cos⁡γ2,0,0,sin⁡γ2]q_z(\gamma) = [\cos\frac{\gamma}{2}, 0, 0, \sin\frac{\gamma}{2}]qz(γ)=[cos2γ,0,0,sin2γ]

最终四元数:
qZXZ=qz(α)⋅qx(β)⋅qz(γ) q_{ZXZ} = q_z(\alpha) \cdot q_x(\beta) \cdot q_z(\gamma) qZXZ=qz(α)qx(β)qz(γ)

(2)泰特-布莱恩Z-Y-X欧拉角 → 四元数
分步旋转对应的四元数:

  1. 绕 Z 轴旋转 ψ\psiψqz(ψ)=[cos⁡ψ2,0,0,sin⁡ψ2]q_z(\psi) = [\cos\frac{\psi}{2}, 0, 0, \sin\frac{\psi}{2}]qz(ψ)=[cos2ψ,0,0,sin2ψ]
  2. 绕 Y 轴旋转 θ\thetaθqy(θ)=[cos⁡θ2,0,sin⁡θ2,0]q_y(\theta) = [\cos\frac{\theta}{2}, 0, \sin\frac{\theta}{2}, 0]qy(θ)=[cos2θ,0,sin2θ,0]
  3. 绕 X 轴旋转 ϕ\phiϕqx(ϕ)=[cos⁡ϕ2,sin⁡ϕ2,0,0]q_x(\phi) = [\cos\frac{\phi}{2}, \sin\frac{\phi}{2}, 0, 0]qx(ϕ)=[cos2ϕ,sin2ϕ,0,0]

最终四元数:
qZYX=qz(ψ)⋅qy(θ)⋅qx(ϕ) q_{ZYX} = q_z(\psi) \cdot q_y(\theta) \cdot q_x(\phi) qZYX=qz(ψ)qy(θ)qx(ϕ)


5. 欧拉角之间的转换

由于不同欧拉角的旋转顺序不同,直接转换较为复杂,通常需要借助旋转矩阵或四元数作为中介。

(1)经典Z-X-Z → 泰特-布莱恩Z-Y-X

  1. 将 Z-X-Z 欧拉角转换为旋转矩阵 RZXZR_{ZXZ}RZXZ
  2. RZXZR_{ZXZ}RZXZ 提取 Z-Y-X 欧拉角:
    {θ=arcsin⁡(−r31)ϕ=arctan⁡2(r32,r33)ψ=arctan⁡2(r21,r11) \begin{cases} \theta = \arcsin(-r_{31}) \\ \phi = \arctan2(r_{32}, r_{33}) \\ \psi = \arctan2(r_{21}, r_{11}) \end{cases} θ=arcsin(r31)ϕ=arctan2(r32,r33)ψ=arctan2(r21,r11)

(2)泰特-布莱恩Z-Y-X → 经典Z-X-Z

  1. 将 Z-Y-X 欧拉角转换为旋转矩阵 RZYXR_{ZYX}RZYX
  2. RZYXR_{ZYX}RZYX 提取 Z-X-Z 欧拉角:
    {β=arccos⁡(r33)α=arctan⁡2(r13,−r23)γ=arctan⁡2(r31,r32) \begin{cases} \beta = \arccos(r_{33}) \\ \alpha = \arctan2(r_{13}, -r_{23}) \\ \gamma = \arctan2(r_{31}, r_{32}) \end{cases} β=arccos(r33)α=arctan2(r13,r23)γ=arctan2(r31,r32)

6. 注意事项

  1. 万向节锁(Gimbal Lock)

    • 当俯仰角 θ=±90∘\theta = \pm 90^\circθ=±90(Z-Y-X)或 β=0∘\beta = 0^\circβ=0(Z-X-Z)时,旋转自由度减少,需特殊处理。
    • 解决方案:改用四元数或旋转矩阵计算。
  2. 多解性

    • 反三角函数可能导致多个解(如 θ\thetaθπ−θ\pi - \thetaπθ),需根据应用场景选择合理范围。
  3. 数值稳定性

    • 在代码实现时,建议使用数学库(如 SciPy、Eigen)避免浮点误差。

7. 结论

  • 经典欧拉角(Z-X-Z) 适用于对称物体的旋转分析。
  • 泰特-布莱恩欧拉角(Z-Y-X) 更符合飞行器、机器人的控制需求。
  • 转换方法:必须通过旋转矩阵或四元数中转,无法直接代数转换。
  • 推荐工具:使用 scipy.spatial.transform.Rotation 或 Eigen 库简化计算。
http://www.dtcms.com/a/284439.html

相关文章:

  • HTTPS的工作原理及DNS的工作过程
  • 【LeetCode 热题 100】108. 将有序数组转换为二叉搜索树
  • SpringBoot使用ThreadLocal共享数据
  • 2021-07-21 VB窗体求范围质数(Excel复制工作簿)
  • Python 基础语法与数据类型(十三) - 实例方法、类方法、静态方法
  • 【测试100问】没有接口文档的情况下,如何做接口测试?
  • MinIO:开源对象存储解决方案的领先者
  • DiffPy-CMI详细安装教程
  • 【Vue进阶学习笔记】组合式API(Composition API)
  • Go 程序无法使用 /etc/resolv.conf 的 DNS 配置排查记录
  • React hooks——memo
  • 【软件开发】主流 AI 编码插件
  • 关于el-table异步获取数据渲染动态列数据赋值列数据渲染时title高度异常闪过问题
  • 深度解析:基于EasyX的C++黑白棋AI实现 | 算法核心+图形化实战
  • 数据呈现进阶:漏斗图与雷达图的实战指南
  • 基于Echarts的气象数据可视化网站系统的设计与实现(Python版)
  • Idea使用git不提示账号密码登录,而是输入token问题解决
  • 【解决方案】yakit流量转发到mitmproxy
  • 浅谈 awk 中管道的用法
  • zynq mpsoc switch级联ssd高速存储方案
  • 贴吧项目总结二
  • mysql——搭建MGR集群
  • CommonJS 功能介绍
  • 基于dcmtk的dicom工具 第二章 图像接受StoreSCP(2)
  • Python Day16
  • Java行为型模式---备忘录模式
  • 从零开始的云计算生活——第三十三天,关山阻隔,ELK日志分析
  • rtp传输推流h265
  • Unity使用GTCRN实现流式语音增强
  • SpringBoot一Web Flux、函数式Web请求的使用、和传统注解@Controller + @RequestMapping的区别