Eigen库:四元数转欧拉角

本文探讨了四元数与欧拉角的关系,包括四元数的概念、欧拉角的万向锁问题以及如何从四元数转换到欧拉角。详细介绍了静态与动态欧拉角的区别,并提供了相关资源进行深入理解,如图文博客和万向锁演示demo。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、四元数

1. 维基百科 https://zh.wikipedia.org/wiki/%E5%9B%9B%E5%85%83%E6%95%B8

 

 

二、欧拉角

1. 万向锁

维基百科 https://zh.wikipedia.org/wiki/%E7%92%B0%E6%9E%B6%E9%8E%96%E5%AE%9A

欧拉角有两种:

  • 静态:即绕世界坐标系三个轴的旋转,由于物体旋转过程中坐标轴保持静止,所以称为静态。
  • 动态:即绕物体坐标系三个轴的旋转,由于物体旋转过程中坐标轴随着物体做相同的转动,所以称为动态。

使用动态欧拉角会出现万向锁现象;静态欧拉角不存在万向锁的问题。

一个典型的万向锁问题可以表述如下:先仰45°再俯90°,这与先俯90°再仰45°是等价的。事实上,一旦选择±90°作为俯角,就会导致第一次旋转和第三次旋转等价,整个旋转表示系统被限制在只能绕竖直轴旋转,丢失了一个表示维度。这种角度为±90°的第二次旋转使得第一次和第三次旋转的旋转轴相同的现象,称作万向锁。

 

 

2. 优酷视频 

### 使用Eigen实现四元数欧拉角换 为了使用Eigen四元数换为欧拉角,可以按照如下方法操作: 定义并初始化一个四元数对象 `Quaterniond` 来表示旋状态。之后通过调用 `.toRotationMatrix()` 方法将其化为旋矩阵形式。最后利用 `.eulerAngles(0, 1, 2)` 函数来获取对应的欧拉角(这里假设顺序为XYZ)。注意,在实际应用中应当确认所使用的坐标系以及期望得到的角度序列是否匹配。 下面给出具体的C++代码示例用于展示这一过程[^3]: ```cpp #include <iostream> #include <Eigen/Dense> using namespace Eigen; using namespace std; int main() { // 定义一个四元数 q(w,x,y,z),此处仅为测试数据 Quaterniond q(0.70710678, 0.0, 0.70710678, 0.0); // 将四元数成旋矩阵再求解欧拉角,默认按ZYZ方式计算 Vector3d euler_angles = q.toRotationMatrix().eulerAngles(2, 1, 0); cout << "Euler Angles (in radians):" << endl; cout << "Roll: " << euler_angles.x() << ", Pitch: " << euler_angles.y() << ", Yaw: " << euler_angles.z() << endl; return 0; } ``` 此程序片段展示了如何创建一个四元数实例,并执行必要的换以获得相应的欧拉角度数值。值得注意的是,`.eulerAngles()` 的参数指定了所需的旋顺序;在这个例子中选择了ZYX作为默认值,但可以根据具体需求调整这些参数[^2]。 当涉及到不同框架间的兼容性问题时,比如ROS环境下的TF包提供了方便快捷的方式来进行此类运算,建议优先考虑官方推荐的做法以便减少潜在错误的发生概率[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值