赞
踩
参考:
除了欧氏变换之外,3D空间还存在其他几种变换方式。它们一部分和测量几何有关。欧氏变换保持了向量的长度和夹角,相当于我们把一个刚体原封不动地进行了移动或旋转,不改变它自身的样子。其他几种变换则会改变它的外形。它们都拥有类似的矩阵表示。
相似变换比欧氏变换多了一个自由度,它允许物体进行均匀缩放,其矩阵表示为:
旋转部分多了一个缩放因子s,表示我们在对向量旋转之后,可以在 x,y,z 三个坐标上进行均匀缩放。由于含有缩放,相似变换不再保持图形的面积不变。可以想象一个边长为1的立方体通过相似变换后,变成边长为10的样子(但仍然是立方体)。三维相似变换的集合也叫做相似变换群,记作Sim(3)。
仿射变换的矩阵形式如下:
与欧氏变换不同的是,仿射变换只要求A是一个可逆矩阵,而不必是正交矩阵。仿射变换也叫正交投影。经过仿射变换之后,立方体就不再是方的了,但是各个面仍然是平行四边形。
射影变换是最一般的变换,它的矩阵形式为:
左上角为可逆矩阵A,右上角为平移t,左下角为缩放a。由于采用了齐次坐标,当 v≠0时,我们可以对整个矩阵除以 v 得到一个右下角为 1 的矩阵;否则得到右下角为 0 的矩阵。因此,2D 的射影变换一共有 8 个自由度,3D 则共有 15 个自由度。
射影变换是变换中,形式最为一般的。从真实世界到相机照片的变换可以看成一个射影变换。可以想象一个原本方形的地板砖,在照片当中是什么样子:首先,它不再是方形的。由于近大远小的关系,它甚至不是平行四边形,而是一个不规则的四边形。
在“不变性质”中,从上到下是有包含关系的。例如,欧氏变换除了保体积之外,也具有保平行、相交等性质。
从真实世界到相机照片的变换是一个射影变换。如果相机的焦距为无穷远,那么这个变换为仿射变换。
• 旋转矩阵(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);
而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);
Eigen::Translation3f translation(x,y,z);
Scaling(sx, sy)
Scaling(sx, sy, sz)
Scaling(s)
Scaling(vecN)
//仿射变换矩阵
Eigen::Affine3f affine3f = translation*quater.toRotationMatrix();
//求逆矩阵
affine3f = affine3f.inverse();
Eigen::Affine3f A;
Eigen::Matrix4f M;
M = A.matrix();
A = M;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。