【⾃动驾驶】Eigen变换矩阵的⼏种⽤法Matrix4f、Affine3f、⽅法1:
/* 提⽰: 变换矩阵⼯作原理 :
|-------> 变换矩阵列
| 1 0 0 x |  \
identity matrix是什么意思| 0 1 0 y |  }-> 左边是⼀个3阶的单位阵(⽆旋转)
| 0 0 1 z |  /
| 0 0 0 1 |    -> 这⼀⾏⽤不到 (这⼀⾏保持 0,0,0,1)
⽅法⼀ #1: 使⽤ Matrix4f
这个是“⼿⼯⽅法”,可以完美地理解,但容易出错!
*/
Eigen::Matrix4f transform_1 = Eigen::Matrix4f::Identity();
/
/ 定义⼀个旋转矩阵 (见 /wiki/Rotation_matrix)
float theta = M_PI/4;// 弧度⾓
transform_1(0,0)=cos(theta);
transform_1(0,1)=-sin(theta);
transform_1(1,0)=sin(theta);
transform_1(1,1)=cos(theta);
// 在 X 轴上定义⼀个 2.5 ⽶的平移.
transform_1(0,3)=2.5;
⽅法2:
/*  ⽅法⼆ #2: 使⽤ Affine3f
这种⽅法简单,不易出错
*/
Eigen::Affine3f transform_2 = Eigen::Affine3f::Identity();
// 在 X 轴上定义⼀个 2.5 ⽶的平移.
anslation()<<2.5,0.0,0.0;
// 和前⾯⼀样的旋转; Z 轴上旋转 theta 弧度
ate(Eigen::AngleAxisf(theta, Eigen::Vector3f::UnitZ()));
// 打印变换矩阵
printf("\nMethod #2: using an Affine3f\n");
std::cout << transform_2.matrix()<< std::endl;
// 执⾏变换,并将结果保存在新创建的transformed_cloud 中
pcl::PointCloud<pcl::PointXYZ>::Ptr transformed_cloud(new pcl::PointCloud<pcl::PointXYZ>());
/
/ 可以使⽤ transform_1 或 transform_2; t它们是⼀样的
pcl::transformPointCloud(*source_cloud,*transformed_cloud, transform_2);
⽅法3:
Eigen::AngleAxisf rotation_x(alpha, Eigen::Vector3f::UnitX());
Eigen::AngleAxisf rotation_y(beta, Eigen::Vector3f::UnitY());
Eigen::AngleAxisf rotation_z(gamma, Eigen::Vector3f::UnitZ());
Eigen::Translation3f translation(2.1,6.3,1.5);
Eigen::Matrix4f transform =
(translation * rotation_y * rotation_z * rotation_x).matrix();
⽅法4(和⽅法3⼀样):
Eigen::Affine3f transform =
Eigen::Translation3f(2.5,0,0)
* Eigen::AngleAxisf(alpha, Vector3f::UnitX())
* Eigen::AngleAxisf(beta, Vector3f::UnitY())
* Eigen::AngleAxisf(gamma, Vector3f::UnitZ());