Eigen/Geometry模块学习笔记

本文深入讲解了Eigen库的Geometry模块,涵盖了旋转向量、欧拉角、欧式变换和四元数的使用方法及相互转换。通过实例演示了如何在3D空间中进行旋转和平移操作,适用于机器人、计算机视觉等领域。

Eigen/Geometry模块

1. 旋转向量:Eigen::AngleAxis

  1. 初始化
AngleAxisd rotation_vector(alpha, Vector3d(x, y, z));  //alpha:旋转角度,(x, y, z):旋转轴
  1. 转换为旋转矩阵
Matrix3d rotation_matrix;
rotation_matrix = rotation_vector.matrix();

rotation_matrix = rotation_vector.toRotationMatrix();
  1. 转换为欧拉角(需要先转换为旋转矩阵)
euler_angles = rotation_vector.matrix().eulerAngles(2, 1, 0);
  1. 转换为四元数
Quaternion q = Quaterniond(rotation_vector);

2. 欧拉角:Eigen::eulerAngles(a0, a1, a2)

用法:a0, a1, a2从{0, 1, 2}中取值,0代表X轴,1代表Y轴,2代表Z轴,旋转顺序为从后到前(下一次旋转使用的旋转轴是上一次旋转之后的)。
得到的Euler Angle角度值范围:[0, pi] x [-pi, pi] x [-pi, pi]

  1. 欧拉角与旋转矩阵

举例1:

Vector3f euler_angles = rotation_matrix.eulerAngles(2, 1, 0); 

等价于

rotation_matrix = AngleAxisd(euler_angles[0], Vector3f::UnitZ())
     * AngleAxisd(euler_angles[1], Vector3f::UnitY())
     * AngleAxisd(euler_angles[2], Vector3f::UnitX()); 

均表示先绕X轴旋转euler_angles[2] rad,再绕Y轴旋转euler_angles[1] rad,再绕Z轴旋转euler_angles[0] rad。

举例2:

Vector3f euler_angles = rotation_matrix.eulerAngles(0, 1, 2); 

等价于

rotation_matrix = AngleAxisd(euler_angles[0], Vector3f::UnitX())
     * AngleAxisd(euler_angles[1], Vector3f::UnitY())
     * AngleAxisd(euler_angles[2], Vector3f::UnitZ()); 

均表示先绕Z轴旋转euler_angles[2] rad,再绕Y轴旋转euler_angles[1] rad,再绕X轴旋转euler_angles[0] rad。

坐标系:X轴朝前, Y轴朝左, Z轴朝上
*注意:XYZ轴并不一定总是对应roll, pitch, yaw,要根据实际情况判断。roll表示横滚,pitch表示俯仰,yaw表示偏航。

3. 欧式变换:Eigen::Isometry

  1. 定义
Isometry3d T = Isometry3d::Identity();  //T实际为4*4矩阵
T.rotate(rotation_vector);  //定义欧式变换的旋转矩阵
T.pretranslate(Vector3d(x, y, z));  //定义欧式变换的平移向量
  1. 转换为4*4变换矩阵
Matrix4d transform_matrix = T.matrix();
  1. 用欧式变换进行坐标变换
Vector3d v = (1, 2, 3);
Vector3d v_transformed = T * v;  //相当于R*v+t

4. 四元数:Eigen::Quaternion

  1. 初始化
    直接初始化:
Quaterniond q(w, x, y, z);

注意:初始化时实部在前,虚部在后,但在内部存储顺序为[x, y, z, w]

使用旋转向量和旋转矩阵初始化:

Quaterniond q1(rotation_vector);
Quaterniond q2(rotation_matrix);
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值