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;
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Eigen::Matrix4f是Eigen中的一个类,表示一个4x4的浮点数矩阵。它可以用于表示刚体变换矩阵,例如平移和旋转。这个类提供了一系列的方法来进行矩阵的初始化、转换和计算等操作。\[1\] Eigen::Quaternionf是Eigen中的一个类,表示一个四元数。四元数是一种用于表示旋转的数学工具,它可以用于表示空间中的旋转操作。Eigen::Quaternionf类提供了一系列的方法来进行四元数的初始化、转换和计算等操作。\[1\] 在机器视觉领域的应用中,Eigen::Matrix4f和Eigen::Quaternionf常常被用于表示相机的位姿变换和姿态信息。通过使用这两个类,可以方便地进行刚体变换和旋转操作,从而实现目标检测、定位、抓取、测量和缺陷检测等任务。\[2\] #### 引用[.reference_title] - *1* [使用Eigen实现四元数、欧拉角、旋转矩阵、旋转向量之间的转换 Eigen::Affine3f和Eigen::Matrix4f的转换 ...](https://blog.csdn.net/Enochzhu/article/details/125934638)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Eigen入门系列 —— Eigen::Matrix常用数据类型及初始化](https://blog.csdn.net/memorynode/article/details/124534276)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值