我们将介绍几何模块提供的处理2D和3D旋转以及投影或仿射变换的方法。
1. 变换类型
// 下面的类型将d换成f就可以得到单精度的数据结构
Eigen::Matrix3d; //旋转矩阵3*3
Eigen::AngleAxisd; //旋转向量3*1
Eigen::Vector3d; //欧拉角3*1
Eigen::Quaterniond; //四元数4*1
Eigen::Isometry3d; //欧氏变换矩阵4*4
Eigen::Affine3d; //仿射变换4*4
Eigen::Projective3d; //射影变换
2. 旋转定义
//旋转向量
AngleAxisd rotation_vector(M_PI / 4,Vector3d(0,0,1)); //沿Z轴旋转45度
//旋转矩阵
Matrix3d rotation_matrix = Matrix3d::Identity();
rotation_matrix = rotation_vector.toRotationMatrix(); //用旋转向量给旋转矩阵赋值
rotation_matrix = rotation_vector.matrix(); //和toRotationMatrix()等价
//欧拉角
Vector3d euler_angles = rotation_matrix.eulerAngles(2,1,0); //ZYX顺序,将旋转矩阵直接转化为欧拉角
//四元数
Quaterniond q = Quaterniond(rotation_vector); //用旋转向量来初始化,反过来也行
q = Quaterniond(rotation_matrix); //用旋转矩阵来初始化
//Quaterniond q(0.35,0.2,0.3,0.1); //直接用构造器定义也行
3. 欧氏变换定义
//欧氏变换
Isometry3d T = Isometry3d::Identity();
T.rotate(AngleAxisd(M_PI / 4,Vector3d(0,0,1))); // 按照旋转向量进行旋转
T.pretranslate(Vector3d(1,3,4)); //pretranslate是加上t, translate是加上Rt
cout<<"T(pretranslate) = \n"<<T.matrix()<<endl;
T = Isometry3d::Identity();
T.rotate(AngleAxisd(M_PI / 4,Vector3d(0,0,1))); // 按照旋转向量进行旋转
//T = Isometry3d(AngleAxisd(M_PI / 4,Vector3d(0,0,1))); //直接用构造器定义旋转变换也行
T.translate(Vector3d(1,3,4)); //pretranslate是加上t, translate是加上Rt
cout<<"T(translate) = \n"<<T.matrix()<<endl;
结果:
T(pretranslate) =
0.707107 -0.707107 0 1
0.707107 0.707107 0 3
0 0 1 4
0 0 0 1
T(translate) =
0.707107 -0.707107 0 -1.41421
0.707107 0.707107 0 2.82843
0 0 1 4
0 0 0 1
4. 旋转变换
//用AngleAxis进行坐标变换
Vector3d v(1,0,0);
Vector3d v_rotated = rotation_vector * v;
//用旋转矩阵进行坐标变换
v_rotated = rotation_matrix * v;
//用四元数进行坐标变换,使用重载的乘法即可
v_rotated = q * v; //注意数学上是qvq^{-1}
//这里没用欧拉角进行坐标变换,应该也能用的,可以自己搜一下
5. 欧氏变换
Vector3d v(1,0,0);
Vector3d v_transformed = T * v;