Eigen库:(三)空间变换

我们将介绍几何模块提供的处理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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值