[关闭]
@iStarLee 2019-07-09T01:52:56.000000Z 字数 2601 阅读 719

eigen学习(5)——Geometry

eigen


1 Space transformations介绍

geometry模块提供的变换有两类:

Note:
如果你使用OpenGL 4x4矩阵,那么Affine3f和Affine3d就是你想要的。由于Eigen默认为列主存储,所以可以直接使用Transform::data()方法将转换矩阵传递给OpenGL。

• 旋转矩阵(3 × 3):Eigen::Matrix3d。
• 旋转向量(3 × 1):Eigen::AngleAxisd。
• 欧拉角(3 × 1):Eigen::Vector3d。
• 四元数(4 × 1):Eigen::Quaterniond。
• 欧氏变换矩阵(4 × 4):Eigen::Isometry3d。
• 仿射变换(4 × 4):Eigen::Affine3d。
• 射影变换(4 × 4):Eigen::Projective3d

2 欧式变换

  1. // 欧氏变换矩阵使用 Eigen::Isometry
  2. Eigen::Isometry3d T=Eigen::Isometry3d::Identity(); // 虽然称为3d,实质上是4*4的矩阵
  1. Rotation2D<float> rot2(angle_in_radian);
  1. //角轴
  2. AngleAxis<float> aa(angle_in_radian, Vector3f(ax,ay,az));
  3. //旋转矩阵
  4. Matrix3f m(aa);
  5. //四元数
  6. Quaternion<float> q;
  7. q = AngleAxis<float>(angle_in_radian, axis);
  8. //欧拉角
  9. Eigen::Vector3d euler_angles = rotation_matrix.eulerAngles ( 2,1,0 ); // ZYX顺序,即roll pitch yaw顺序
  10. Eigen::Vector3d euler_angles = rotation_matrix.eulerAngles ( 2,1,2 ); // ZYZ顺序
  1. Eigen::Isometry3d trans = Eigen::Isometry3d::Identity();//欧式变换矩阵4x4
  2. trans.prerotate(R);//T左乘一个R
  3. trans.pretranslate(t);//T左乘一个t
  4. trans.rotate(R);//右乘一个R
  5. trans.translate(t);//右乘一个t
  6. //可以通过如下方法初始化一个trans
  7. Eigen::Isometry3d trans = Eigen::Isometry3d::Identity();//欧式变换矩阵4x4
  8. trans.prerotate(R);//一定要先设置旋转,在设置平移,不然结果不对
  9. // trans.rotate(R);也可以
  10. trans.pretranslate(t);
  11. cout << "rotation matrix: \n" << R << endl;
  12. cout << "transfrom matrix:\n" << trans.matrix() << endl;

3 旋转矩阵和欧拉角的理解和代码实践

3.1 一些设定

3.2 从I系到B系的坐标变换

此时我们使用ZYX欧拉角表示方法


其中,

3.3 从B系到I系的坐标变换(B在I中的位姿)

注意这里我们定义的这些旋转矩阵是从I系到B系的,也就是认为B系是target frame的。
source在target中的位姿,这个最常用。

在Eigen中的实践

  1. //使用角轴表示的旋转对应着我们这里的R_z(yaw)^T,也就是认为I系是target frame的
  2. Eigen::AngleAxisd init_rotation_z(0.3, Eigen::Vector3d::UnitZ());

所以表示从B系到I系(B中的点变换到I中的点)是

  1. Eigen::Translation3d init_translation(1, 2, 3);
  2. Eigen::AngleAxisd init_rotation_x(0.1, Eigen::Vector3d::UnitX());
  3. Eigen::AngleAxisd init_rotation_y(0.2, Eigen::Vector3d::UnitY());
  4. Eigen::AngleAxisd init_rotation_z(0.3, Eigen::Vector3d::UnitZ());
  5. Eigen::Matrix4d init_guess1 = (init_translation*init_rotation_z*init_rotation_y*init_rotation_x).matrix();
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注