理解欧拉角:定义、转换与应用
1. 引言
在三维空间中描述物体的旋转时,欧拉角(Euler Angles)是最直观的方法之一。它通过三个连续的绕轴旋转来表示任意朝向,广泛应用于机器人学、航空航天、计算机图形学等领域。然而,不同的欧拉角定义(如经典欧拉角和泰特-布莱恩欧拉角)以及它们之间的转换关系常常让人困惑。本文将系统介绍欧拉角的定义、旋转矩阵和四元数表示,并详细讲解如何在不同欧拉角之间进行转换。
2. 欧拉角的定义
欧拉角根据旋转轴的选择和顺序不同,主要分为两类:
(1)经典欧拉角(Proper Euler Angles)
- 旋转顺序:绕同一个轴旋转两次(例如 Z-X-Z、X-Y-X)。
- 典型形式:Z-X-Z
- 步骤:
- 绕 Z 轴旋转 α\alphaα(Yaw,偏航)。
2.绕 X 轴旋转 β\betaβ(Pitch,俯仰)。 - 再次绕 Z 轴旋转 γ\gammaγ(Roll,滚转)。
- 绕 Z 轴旋转 α\alphaα(Yaw,偏航)。
- 步骤:
- 应用:适用于对称物体的旋转描述,如陀螺仪运动分析。
(2)泰特-布莱恩欧拉角(Tait-Bryan Angles)
- 旋转顺序:绕三个不同的轴旋转(例如 Z-Y-X、X-Y-Z)。
- 典型形式:Z-Y-X(Yaw-Pitch-Roll)
- 步骤:
- 绕 Z 轴旋转 ψ\psiψ(Yaw)。
- 绕 Y 轴旋转 θ\thetaθ(Pitch)。
- 绕 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欧拉角 → 四元数
分步旋转对应的四元数:
- 绕 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α]
- 绕 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]
- 绕 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欧拉角 → 四元数
分步旋转对应的四元数:
- 绕 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ψ]
- 绕 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]
- 绕 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
- 将 Z-X-Z 欧拉角转换为旋转矩阵 RZXZR_{ZXZ}RZXZ。
- 从 RZXZR_{ZXZ}RZXZ 提取 Z-Y-X 欧拉角:
{θ=arcsin(−r31)ϕ=arctan2(r32,r33)ψ=arctan2(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
- 将 Z-Y-X 欧拉角转换为旋转矩阵 RZYXR_{ZYX}RZYX。
- 从 RZYXR_{ZYX}RZYX 提取 Z-X-Z 欧拉角:
{β=arccos(r33)α=arctan2(r13,−r23)γ=arctan2(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. 注意事项
-
万向节锁(Gimbal Lock)
- 当俯仰角 θ=±90∘\theta = \pm 90^\circθ=±90∘(Z-Y-X)或 β=0∘\beta = 0^\circβ=0∘(Z-X-Z)时,旋转自由度减少,需特殊处理。
- 解决方案:改用四元数或旋转矩阵计算。
-
多解性
- 反三角函数可能导致多个解(如 θ\thetaθ 和 π−θ\pi - \thetaπ−θ),需根据应用场景选择合理范围。
-
数值稳定性
- 在代码实现时,建议使用数学库(如 SciPy、Eigen)避免浮点误差。
7. 结论
- 经典欧拉角(Z-X-Z) 适用于对称物体的旋转分析。
- 泰特-布莱恩欧拉角(Z-Y-X) 更符合飞行器、机器人的控制需求。
- 转换方法:必须通过旋转矩阵或四元数中转,无法直接代数转换。
- 推荐工具:使用
scipy.spatial.transform.Rotation
或 Eigen 库简化计算。