楼主: 陈陈陈qwe
192 0

[作业] 旋转变换之欧拉角(Euler angles) [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

学前班

40%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
20 点
帖子
1
精华
0
在线时间
0 小时
注册时间
2018-12-19
最后登录
2018-12-19

楼主
陈陈陈qwe 发表于 2025-11-21 21:44:23 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

欧拉角的基本概念与应用

欧拉角是一种用于描述刚体在三维空间中姿态的经典方法,由18世纪瑞士数学家莱昂哈德·欧拉(Leonhard Euler, 1707–1783)提出。其基本原理是通过三个连续的旋转操作,将一个物体从初始坐标系逐步旋转至目标姿态。

这种方法被广泛应用于多个技术领域:

  • 航空航天:用于表示飞行器的姿态参数——偏航(Yaw)、俯仰(Pitch)和滚转(Roll)
  • 机器人学:控制机械臂末端执行器的空间朝向
  • 计算机图形学与动画制作:实现三维模型的旋转控制
  • SLAM系统与惯性导航(结合IMU、LiDAR或视觉传感器):进行位姿估计与跟踪
tf::Matrix3x3

优缺点分析

欧拉角的主要优势在于其直观性和简洁性:

  • 物理意义明确,便于理解旋转顺序与各角度的作用
  • 仅需三个参数即可完整描述旋转状态,相较于四元数更节省存储空间

然而也存在明显局限性:

  • 存在“万向锁”(Gimbal Lock)现象,在特定角度下会丢失一个自由度
  • 当俯仰角接近 ±90° 时,数值计算容易出现不稳定情况
  • 不适用于频繁复合旋转或需要优化求解的场景,如连续姿态插值或非线性优化

坐标系定义与旋转参数

设存在两个坐标系:

  • 固定参考坐标系 I:作为基准框架
  • 刚体局部坐标系 B:随物体一起运动

欧拉角描述的是:从初始时刻 B 与 I 完全对齐的状态出发,经过三次依次旋转后达到当前姿态的过程。

在航空领域常用的三个旋转角分别为:

  • 偏航角 Yaw (ψ):绕 z 轴旋转
  • 俯仰角 Pitch (θ):绕 y 轴旋转
  • 滚转角 Roll (φ):绕 x 轴旋转

需要注意的是,旋转顺序至关重要,不同领域采用的标准不同:

  • 航空工程通常使用 z-y-x 顺序(即先偏航,再俯仰,最后滚转)
  • 机器人学及SLAM系统则多采用 x-y-z 顺序(即Roll-Pitch-Yaw)

整体旋转矩阵可表示为:
R = Rz(ψ) Ry(θ) Rx(φ)
其中 R 表示最终的旋转变换矩阵。

tf2::Matrix3x3

旋转矩阵与欧拉角的关系推导

单个轴向的旋转可以用如下基本旋转矩阵表示:

绕 x 轴旋转 φ 角:
\[ R_x(\phi) = \begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos\phi & -\sin\phi \\ 0 & \sin\phi & \cos\phi \end{bmatrix} \]

绕 y 轴旋转 θ 角:
\[ R_y(\theta) = \begin{bmatrix} \cos\theta & 0 & \sin\theta \\ 0 & 1 & 0 \\ -\sin\theta & 0 & \cos\theta \end{bmatrix} \]

绕 z 轴旋转 ψ 角:
\[ R_z(\psi) = \begin{bmatrix} \cos\psi & -\sin\psi & 0 \\ \sin\psi & \cos\psi & 0 \\ 0 & 0 & 1 \end{bmatrix} \]

[此处为图片3]

若采用 Z-Y-X 的旋转顺序(即 Yaw → Pitch → Roll),则总旋转矩阵为三者的乘积:

\[ R = R_z(\psi) R_y(\theta) R_x(\phi) \]

展开后的结果为:

\[ R = \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} \]

其中简记符号含义如下:
c = cos(),s = sin()
例如:cψ = cos(ψ),sθ = sin(θ),以此类推。

在三维旋转表示中,常用符号 \( s_\bullet = \sin(\bullet) \) 表示正弦函数的简写形式。该表达方式可简化旋转矩阵的书写与计算。

此旋转矩阵可用于坐标系的变换操作,具体表现为对点进行旋转:

\[ \mathbf{p}_{\text{new}} = R \mathbf{p}_{\text{old}} \]

从旋转矩阵提取欧拉角(Z-Y-X 顺序)

已知一个旋转矩阵 \( R \),可以反推出对应的欧拉角(按照 Z-Y-X 顺序,即偏航-俯仰-滚转):

\[ \theta = -\arcsin(R_{31}) \]

当 \( \cos\theta \neq 0 \) 时,其余两个角度可通过以下公式求解:

\[ \phi = \arctan2(R_{32}/\cos\theta, R_{33}/\cos\theta) \]

\[ \psi = \arctan2(R_{21}/\cos\theta, R_{11}/\cos\theta) \]

其中,\( \arctan2(y, x) \) 函数能够正确判断象限,避免角度歧义。

然而,当 \( \cos\theta \approx 0 \)(即俯仰角接近 ±90°)时,系统将进入万向锁状态,此时滚转与偏航自由度退化,导致无法独立区分这两个角度,需采用特殊策略处理。

关于万向锁(Gimbal Lock)

当俯仰角 \( \theta = \pm 90^\circ \) 时,旋转过程中两个轴趋于共线,造成自由度减少,出现万向锁现象。这会严重影响姿态解算精度和控制稳定性。

工程上常见的应对方案包括:

  • 使用四元数(Quaternion)代替欧拉角进行姿态表示
  • 采用小角度增量旋转结合旋转矩阵或李群(SO(3))方式进行递推更新

欧拉角在 IMU 与 SLAM 中的应用场景

姿态初始化: 利用 IMU 的加速度计和陀螺仪数据,估算初始的 Roll 和 Pitch 角度。

里程计融合: 在视觉或 LiDAR SLAM 系统中,通过欧拉角对旋转增量进行状态更新或可视化展示。

控制系统: 无人机及机器人飞控系统通常以 Roll、Pitch、Yaw 作为反馈变量实现姿态闭环控制。

数据可视化: 将内部存储的四元数或旋转矩阵转换为欧拉角,便于工程师理解当前位姿状态。

实际工程中的实现方法

1. 使用 Eigen 库进行欧拉角计算

#include <Eigen/Dense>
#include <iostream>

int main() {
    Eigen::Matrix3d R;
    R = Eigen::AngleAxisd(0.1, Eigen::Vector3d::UnitX()) *
        Eigen::AngleAxisd(0.2, Eigen::Vector3d::UnitY()) *
        Eigen::AngleAxisd(0.3, Eigen::Vector3d::UnitZ());

    Eigen::Vector3d euler = R.eulerAngles(2, 1, 0); // ZYX 顺序
    std::cout << "Yaw-Pitch-Roll (ZYX): " << euler.transpose() << std::endl;
}

2. ROS 与 SLAM 中的姿态转换

在 ROS 系统中,常通过如下方式从旋转矩阵获取欧拉角:

double roll, pitch, yaw;
tf::Matrix3x3(R).getRPY(roll, pitch, yaw);

tf::Matrix3x3

tf2::Matrix3x3

在 SLAM 系统中,位姿一般以“四元数 + 平移向量”的形式存储;但在调试或界面显示时,通常将其转换为欧拉角以便观察。

3. 工程实践建议

  • 显示与调试: 欧拉角更符合人类直觉,适合用于用户界面和日志输出。
  • 内部计算: 推荐使用四元数或旋转矩阵进行运算,避免万向锁问题。
  • 插值与优化: 不建议直接对欧拉角进行微分或优化操作,应使用四元数或李代数(如 SO(3)/SE(3))进行数值优化。

由旋转矩阵求解欧拉角的方法详解

假设已知旋转矩阵 \( R \),且欧拉角顺序为 ZYX(Yaw → Pitch → Roll),即依次绕 z 轴、y 轴、x 轴旋转。则总旋转矩阵可分解为:

\[ R = R_z(\psi) R_y(\theta) R_x(\phi) \]

其展开形式为:

\[ R = \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} \]

其中 \( c \) 和 \( s \) 分别代表余弦与正弦函数。根据该结构,可通过矩阵元素逆向求解出三个欧拉角参数。

在姿态表示与转换中,欧拉角、旋转矩阵和四元数之间存在明确的数学关系。以下为从不同表示形式求解欧拉角的方法整理。

1、从旋转矩阵求欧拉角(ZYX顺序)

设旋转矩阵 R 由绕 Z 轴偏航(ψ)、Y 轴俯仰(θ)、X 轴滚转()依次旋转构成:

R = R_z(ψ) R_y(θ) R_x()

展开后形式如下:

\[ R = \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} \]

其中,c_θ 表示 cosθ,s_θ 表示 sinθ,其余类推。

根据该矩阵,可反求欧拉角:

  • 俯仰角(Pitch): θ = arcsin(-R31)
  • 滚转角(Roll): = arctan2(R32, R33)
  • 偏航角(Yaw): ψ = arctan2(R21, R11)

需要注意的是,当 |θ| = 90° 时,系统进入万向锁(Gimbal Lock)状态,此时滚转与偏航自由度耦合,导致 和 ψ 无法被唯一确定。

tf::Matrix3x3

2、从四元数转换为欧拉角

若姿态以四元数 q = (w, x, y, z) 表示,其对应 ZYX 顺序的欧拉角计算公式如下:

  • Roll(滚转角 ): = arctan2(2(wx + yz), 1 - 2(x + y))
  • Pitch(俯仰角 θ): θ = arcsin(2(wy - zx))
  • Yaw(偏航角 ψ): ψ = arctan2(2(wz + xy), 1 - 2(y + z))

四元数因无奇异性且适合插值,在工程中常用于姿态的累积更新,最终再转换为欧拉角用于可视化或控制逻辑处理。

tf2::Matrix3x3

3、基于IMU角速度积分估算欧拉角

惯性测量单元(IMU)输出机体坐标系下的角速度向量 ω = (ω, ω, ω_z)。在小时间步长 Δt 内,可采用小角度近似计算角增量:

Δ ≈ ω Δt,Δθ ≈ ω Δt,Δψ ≈ ω_z Δt

更精确地,欧拉角变化率与角速度的关系可通过下式描述:

\[ \begin{bmatrix} \dot{\phi} \\ \dot{\theta} \\ \dot{\psi} \end{bmatrix} = \begin{bmatrix} 1 & \sin\phi \tan\theta & \cos\phi \tan\theta \\ 0 & \cos\phi & -\sin\phi \\ 0 & \sin\phi / \cos\theta & \cos\phi / \cos\theta \end{bmatrix} \boldsymbol{\omega} \]

该微分方程可用于数值积分实现姿态递推更新。但需注意在俯仰角接近 ±90° 时,由于 tanθ 发散,会导致数值不稳定,这同样是万向锁现象的表现之一。

综上所述,三种方法各有适用场景:旋转矩阵适合理论推导,四元数适用于实时姿态融合,而角速度积分则为动态姿态估计的基础手段。

通过积分运算可得欧拉角的更新公式:

φk+1 = φk + φΔt, θk+1 = θk + θΔt, ψk+1 = ψk + ψΔt

在实际工程应用中需注意:当俯仰角 θ 接近 ±90° 时,系统将遭遇万向锁问题,导致姿态表示失效。此外,单纯依赖积分计算会导致误差累积产生漂移现象,因此通常需要引入滤波算法或结合外部传感器(如 GPS、视觉系统或激光雷达)进行校正。

tf::Matrix3x3

工程实现示例(基于 C++ 与 ROS)

#include <tf2/LinearMath/Quaternion.h>
#include <tf2/LinearMath/Matrix3x3.h>

tf2::Quaternion q(w, x, y, z);
double roll, pitch, yaw;

// 按照 ZYX 旋转顺序从四元数提取欧拉角
tf2::Matrix3x3(q).getRPY(roll, pitch, yaw);

在系统内部建议采用四元数来累积旋转状态,以避免万向锁问题;而在向控制器输出或用于 RViz 可视化时,则可转换为欧拉角以便于理解和调试。

常用方法对比总结

方法 优点 缺点 / 注意事项
旋转矩阵 → 欧拉角 计算精确、过程直接 存在万向锁风险,旋转顺序必须严格一致
四元数 → 欧拉角 无万向锁,适合长期旋转累积 转换公式相对复杂
IMU 积分 支持实时姿态更新 存在积分漂移,需融合 GPS、视觉或 LiDAR 数据进行修正

对于小角度变化的情况,可直接使用欧拉角进行更新;但在涉及大角度运动或长时间连续旋转的应用中,推荐使用四元数或旋转矩阵进行内部计算。欧拉角适用于可视化展示或控制接口输出,而高频率的状态估计、连续优化以及快速动态响应场景则更宜采用四元数或旋转矩阵表达。

综合特性分析

特性 描述
参数数量 三个独立角度:滚转(Roll)、俯仰(Pitch)、偏航(Yaw)
优势 直观易懂,物理意义明确
局限性 存在万向锁问题,数值不连续,不适合用于连续旋转优化
旋转顺序 不同应用场景采用不同顺序(如 Z-Y-X、X-Y-Z 或其他)
替代方案 四元数、旋转向量、Rodrigues 向量、李群 SO(3) 或 SE(3)

总体而言,欧拉角更适合用于**直观理解、人机交互界面及小角度旋转场景**;而在需要处理**高频状态更新、连续旋转优化或高速运动建模**的任务中,应优先选用四元数或旋转矩阵作为姿态表示方式。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Euler Angle les include matrix

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-6 05:07