2023年2月23日
PCL学习笔记(三)PCL的一些常用方法(不定期更新)
1.不同类型的点云之间进行类型转换
方法1:使用PCL库函数copyPointCloud
#include <pcl/common/impl/io.h> pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_xyz (new pcl::PointCloud<pcl::PointXYZ> ()); pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud_xyzrgba (new pcl::PointCloud<pcl::PointXYZRGBA> ()); pcl::copyPointCloud(*cloud_xyz, *cloud_xyzrgba);
方法2:手动转换
cloud_xyzrgba->points.resize(cloud_xyz->size()); for (size_t i = 0; i < cloud_xyz->points.size(); i++) { cloud_xyzrgb->points[i].x = cloud_xyz->points[i].x; cloud_xyzrgb->points[i].y = cloud_xyz->points[i].y; cloud_xyzrgb->points[i].z = cloud_xyz->points[i].z; }
参考: PCL 不同类型的点云之间进行类型转换_AoboSir的博客-CSDN博客_pcl 不同类型 转换
2.旋转、平移点云
变换矩阵工作原理 :
|——-> 变换矩阵列
| 1 0 0 x | \
| 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(); // 定义一个旋转矩阵 (见 https://en.wikipedia.org/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; // 执行变换,并将结果保存在新创建的 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_1);
方法2:使用 Affine3f
这种方法简单,不易出错
Eigen::Affine3f transform_2 = Eigen::Affine3f::Identity(); // 在 X 轴上定义一个 2.5 米的平移. transform_2.translation() << 2.5, 0.0, 0.0; // 和前面一样的旋转; Z 轴上旋转 theta 弧度 transform_2.rotate (Eigen::AngleAxisf (theta, Eigen::Vector3f::UnitZ())); // 执行变换,并将结果保存在新创建的 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);