当前位置:   article > 正文

机器人基础数学知识3——3D空间的相似、仿射、射影变换_eigen::affine3f

eigen::affine3f

参考:

  1. 视觉SLAM十四讲学习笔记-第三讲-相似、仿射、射影变换和eigen程序、可视化演示
  2. 使用Eigen实现四元数、欧拉角、旋转矩阵、旋转向量之间的转换 Eigen::Affine3f和Eigen::Matrix4f的转换 以及float 和 double类型转换

相似、仿射、射影变换

除了欧氏变换之外,3D空间还存在其他几种变换方式。它们一部分和测量几何有关。欧氏变换保持了向量的长度和夹角,相当于我们把一个刚体原封不动地进行了移动或旋转,不改变它自身的样子其他几种变换则会改变它的外形。它们都拥有类似的矩阵表示。

1. 相似变换

相似变换比欧氏变换多了一个自由度,它允许物体进行均匀缩放,其矩阵表示为:
在这里插入图片描述
旋转部分多了一个缩放因子s,表示我们在对向量旋转之后,可以在 x,y,z 三个坐标上进行均匀缩放由于含有缩放,相似变换不再保持图形的面积不变。可以想象一个边长为1的立方体通过相似变换后,变成边长为10的样子(但仍然是立方体)。三维相似变换的集合也叫做相似变换群,记作Sim(3)

2. 仿射变换

仿射变换的矩阵形式如下:
在这里插入图片描述
与欧氏变换不同的是,仿射变换只要求A是一个可逆矩阵,而不必是正交矩阵。仿射变换也叫正交投影。经过仿射变换之后,立方体就不再是方的了,但是各个面仍然是平行四边形

3. 射影变换

射影变换是最一般的变换,它的矩阵形式为:
在这里插入图片描述
左上角为可逆矩阵A,右上角为平移t,左下角为缩放a。由于采用了齐次坐标,当 v≠0时,我们可以对整个矩阵除以 v 得到一个右下角为 1 的矩阵;否则得到右下角为 0 的矩阵。因此,2D 的射影变换一共有 8 个自由度,3D 则共有 15 个自由度

射影变换是变换中,形式最为一般的从真实世界到相机照片的变换可以看成一个射影变换。可以想象一个原本方形的地板砖,在照片当中是什么样子:首先,它不再是方形的。由于近大远小的关系,它甚至不是平行四边形,而是一个不规则的四边形。

总结

在“不变性质”中,从上到下是有包含关系的。例如,欧氏变换除了保体积之外,也具有保平行、相交等性质
在这里插入图片描述
从真实世界到相机照片的变换是一个射影变换如果相机的焦距为无穷远,那么这个变换为仿射变换

使用Eigen库进行空间变换

旋转矩阵(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。

在三维空间中,常常需要变换当前机器人的位姿计算定义的绝对坐标系和当前机器人所处相对坐标系之间的关系。而主要的变换则是平移和旋转,有时候可能需要尺度变换,那么就可以描述为:

Transform<float,3,Affine> T = Translation3f(p) * AngleAxisf(a,axis) * Scaling(s);
  • 1

Affine3d T是一个4*4齐次矩阵变换

旋转
Eigen::Quaternionf quater;
  可以采用沿着某一个轴进行计算,  
Eigen::AngleAxisd(M_PI/2.0,Eigen::Vector3d::UnitZ());
  也可以直接给定参数  
quater.x() = 0;
quater.y() = 0;
quater.z() = sin(M_PI/2.0 / 2.0);
quater.w() = cos(M_PI/2.0 / 2.0);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
平移
Eigen::Translation3f translation(x,y,z);
  • 1
尺度缩放
Scaling(sx, sy)
Scaling(sx, sy, sz)
Scaling(s)
Scaling(vecN)
  • 1
  • 2
  • 3
  • 4
仿射变换
//仿射变换矩阵
Eigen::Affine3f affine3f = translation*quater.toRotationMatrix();

//求逆矩阵
affine3f = affine3f.inverse();
  • 1
  • 2
  • 3
  • 4
  • 5
Eigen::Affine3f和Eigen::Matrix4f的转换
Eigen::Affine3f A;
Eigen::Matrix4f M;
M = A.matrix();
A = M;
  • 1
  • 2
  • 3
  • 4
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/227146
推荐阅读
相关标签
  

闽ICP备14008679号