Eigen/Geometry模块
1. 旋转向量:Eigen::AngleAxis
- 初始化
AngleAxisd rotation_vector(alpha, Vector3d(x, y, z)); //alpha:旋转角度,(x, y, z):旋转轴
- 转换为旋转矩阵
Matrix3d rotation_matrix;
rotation_matrix = rotation_vector.matrix();
或
rotation_matrix = rotation_vector.toRotationMatrix();
- 转换为欧拉角(需要先转换为旋转矩阵)
euler_angles = rotation_vector.matrix().eulerAngles(2, 1, 0);
- 转换为四元数
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:
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
- 定义
Isometry3d T = Isometry3d::Identity(); //T实际为4*4矩阵
T.rotate(rotation_vector); //定义欧式变换的旋转矩阵
T.pretranslate(Vector3d(x, y, z)); //定义欧式变换的平移向量
- 转换为4*4变换矩阵
Matrix4d transform_matrix = T.matrix();
- 用欧式变换进行坐标变换
Vector3d v = (1, 2, 3);
Vector3d v_transformed = T * v; //相当于R*v+t
4. 四元数:Eigen::Quaternion
- 初始化
直接初始化:
Quaterniond q(w, x, y, z);
注意:初始化时实部在前,虚部在后,但在内部存储顺序为[x, y, z, w]
使用旋转向量和旋转矩阵初始化:
Quaterniond q1(rotation_vector);
Quaterniond q2(rotation_matrix);

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





