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

Eigen中四元数、欧拉角、旋转矩阵、旋转向量之间的转换

文章目录

  • Eigen 几何模块简介
  • 一、旋转向量(AngleAxis)
    • 常用转换
  • 二、旋转矩阵(Matrix3d)
    • 常用转换
  • 三、欧拉角(EulerAngles)
    • 构造旋转矩阵 / 四元数
  • 四、四元数(Quaterniond)
    • 初始化方式
    • 常用操作
  • 五、转换关系总览图
  • 六、实战示例:三种方式构建位姿变换
  • 注意事项与建议
  • 总结
  • 参考



在三维空间中,姿态(方向)的表示方式多种多样:旋转向量(AngleAxis)旋转矩阵(Matrix3d)欧拉角(Euler Angles)四元数(Quaternion) 都可以实现旋转描述,但它们的应用场景、数值稳定性和效率略有不同。

本篇整理了 Eigen 库 中常见的旋转表示之间的 初始化方法与相互转换方式,适用于 SLAM/VIO/机器人/图形学等应用。


Eigen 几何模块简介

#include <Eigen/Geometry>  // 包含 Quaterniond, AngleAxisd, eulerAngles 等

这个头文件提供了所有所需的姿态类与函数。无论你使用的是 Eigen::Matrix3dEigen::Quaterniond 还是 AngleAxisd,都能从中调用相应的函数。


一、旋转向量(AngleAxis)

定义:一个旋转轴 axis = (x,y,z)(单位向量)+ 一个旋转角度 α(单位为弧度)

Eigen::AngleAxisd rotation_vector(alpha, Eigen::Vector3d(x, y, z));

常用转换

// 转换为旋转矩阵
Eigen::Matrix3d rotation_matrix = rotation_vector.toRotationMatrix();// 转换为欧拉角 (Z-Y-X, 即Yaw-Pitch-Roll)
Eigen::Vector3d eulerAngle = rotation_vector.toRotationMatrix().eulerAngles(2, 1, 0);// 转换为四元数
Eigen::Quaterniond quaternion(rotation_vector);

二、旋转矩阵(Matrix3d)

定义:一个 3×3 的正交矩阵 R,满足 R * Rᵀ = I, det(R) = 1

Eigen::Matrix3d R;
R << r00, r01, r02,r10, r11, r12,r20, r21, r22;

常用转换

// 转换为旋转向量
Eigen::AngleAxisd rotation_vector(R);// 转换为欧拉角
Eigen::Vector3d eulerAngle = R.eulerAngles(2, 1, 0);// 转换为四元数
Eigen::Quaterniond quaternion(R);

三、欧拉角(EulerAngles)

定义:三维角度顺序旋转,例如 Z-Y-X(Yaw-Pitch-Roll)

Eigen::Vector3d eulerAngle(yaw, pitch, roll); // 弧度制

构造旋转矩阵 / 四元数

Eigen::AngleAxisd Rx(eulerAngle(2), Eigen::Vector3d::UnitX());
Eigen::AngleAxisd Ry(eulerAngle(1), Eigen::Vector3d::UnitY());
Eigen::AngleAxisd Rz(eulerAngle(0), Eigen::Vector3d::UnitZ());Eigen::Matrix3d R = Rz * Ry * Rx;                   // 欧拉角转矩阵
Eigen::Quaterniond q(R);                            // 欧拉角转四元数

💡 顺序为先绕 X,再绕 Y,再绕 Z(右乘顺序)


四、四元数(Quaterniond)

定义:旋转角度用 (w, x, y, z) 表示(单位四元数)

初始化方式

// 使用 (w, x, y, z) 初始化
Eigen::Quaterniond q(w, x, y, z);// 从旋转矩阵初始化
Eigen::Quaterniond q(R);// 从旋转向量初始化
Eigen::Quaterniond q(rotation_vector);// 从向量数据映射(共享内存)
Eigen::Map<Eigen::Quaterniond> q(q_vec.data()); // q_vec 是 [x, y, z, w]

常用操作

q.toRotationMatrix();   // 转为旋转矩阵
q.inverse();            // 求逆(共轭)
q.normalize();          // 单位化
q * v;                  // 对向量 v 进行旋转

五、转换关系总览图

欧拉角 ↔ 旋转向量 ↔ 旋转矩阵 ↔ 四元数↘           ↙AngleAxisd
from / to旋转向量旋转矩阵欧拉角四元数
旋转向量.toRotationMatrix().eulerAngles(2,1,0)构造
旋转矩阵构造.eulerAngles(...)构造
欧拉角RxRyRz 构造构造构造
四元数构造.toRotationMatrix().toRotationMatrix().eulerAngles(...)

六、实战示例:三种方式构建位姿变换

// 方法 1:旋转矩阵 + 平移向量
Eigen::Isometry3d T1 = Eigen::Isometry3d::Identity();
T1.linear() = R;
T1.translation() = t;// 方法 2:四元数 + 平移
Eigen::Isometry3d T2 = Eigen::Isometry3d::Identity();
T2.rotate(q);
T2.pretranslate(t);// 方法 3:AngleAxis + 平移
Eigen::Isometry3d T3 = Eigen::Isometry3d::Identity();
T3.rotate(rotation_vector);
T3.pretranslate(t);

注意事项与建议

  1. 角度单位:Eigen 所有旋转相关函数默认使用 弧度,不要混用角度。
  2. 顺序问题:欧拉角转换时注意顺序一致(常用 ZYX),对应 .eulerAngles(2,1,0)
  3. 四元数数据顺序:构造时为 (w,x,y,z),Map 共享内存时为 [x,y,z,w]
  4. 数值稳定性:使用四元数或旋转向量通常比欧拉角更稳定,尤其是在优化和插值场景。

总结

方式优点缺点应用场景
旋转矩阵直观、组合方便9维度、多余冗余点云旋转、渲染矩阵
欧拉角可读性强、符合人类习惯万向节锁、易出 bugUI 显示、可视化参数
四元数数值稳定、适合优化和插值抽象、难以理解SLAM、IMU 融合
旋转向量直观,方便插值缺少专属 API位姿初始化、视觉结构恢复

参考

  • Eigen 官方文档:Geometry Module
  • 博客:Eigen中四元数、欧拉角、旋转矩阵、旋转向量之间的转换
  • Eigen位姿表示
  • 【Eigen】从入门到放弃(二):矩阵&向量的运算
  • 【Eigen】从入门到放弃(一):Eigen是个什么鬼?
  • Eigen的使用总结1——基础
  • Eigen的使用总结2——geometry
  • Eigen的使用总结3——Map类

http://www.xdnf.cn/news/1095391.html

相关文章:

  • 解锁医疗新视界:医患共决策时间轴AI可视化工具
  • HighReport报表工具开始支持BS报表设计器
  • msf复现永恒之蓝
  • 不止于快:金士顿XS2000移动固态硬盘如何重塑你的数字生活
  • 32多串300A保护板测试仪:新能源电池安全的核心守护者
  • 服务器组件与 Actions:重塑 React 数据交互
  • Linux 内核日志中常见错误
  • 前端开发资源压缩与请求优化
  • 编译OpenHarmony-4.0-Release RK3566 报错
  • 鸿蒙开发文档
  • Linux入门篇学习——Linux 工具之 make 工具和 makefile 文件
  • 观成科技:基于自监督学习技术的恶意加密流量检测方案
  • 论文精读(一)| 量子计算系统软件研究综述
  • 图书管理系统(完结版)
  • Redis数据安全性分析
  • 心智模式:觉察思维定势,突破决策盲区
  • 【QT】文件、多线程、网络相关内容
  • 【PyTorch】PyTorch中数据准备工作(AI生成)
  • C++并发编程-11. C++ 原子操作和内存模型
  • 继承与多态:面向对象编程的两大支柱
  • AI Agent:我的第一个Agent项目
  • 树莓派免密登录(vs code/cursor)
  • 一天两道力扣(3)
  • 【计算机组成原理——知识点总结】-(总线与输入输出设备)-学习笔记总结-复习用
  • AI大模型:(二)4.2 文生图训练实践-真人写实生成
  • Linux的`if test`和`if [ ]中括号`的取反语法比较 笔记250709
  • kbmMemTable Pro 7.82 Delphi 11 源代码
  • 【牛客刷题】小欧的选数乘积
  • 【 MySQL】一点点相关的记录
  • Wireshark抓包实验之TCP连接