pcl::PCLPointCloud2 usage

pcl::PCLPointCloud2 usage

本文关键字:usage PCLPointCloud2 pcl      更新时间:2023-10-16

我不知道何时使用pcl::PointCloud2pcl::PointCloudPointCloud

例如,使用pcl1_ptrApcl1_ptrBpcl1_ptrC:的这些定义

pcl::PointCloud<pcl::PointXYZRGB>::Ptr pcl1_ptrA(new pcl::PointCloud<pcl::PointXYZRGB>); //pointer for color version of pointcloud
pcl::PointCloud<pcl::PointXYZRGB>::Ptr pcl1_ptrB(new pcl::PointCloud<pcl::PointXYZRGB>); //ptr to hold filtered Kinect image
pcl::PointCloud<pcl::PointXYZRGB>::Ptr pcl1_ptrC(new pcl::PointCloud<pcl::PointXYZRGB>); //ptr to hold filtered Kinect image

我可以调用以下PCL功能:

pcl::VoxelGrid<pcl::PointXYZRGB> vox;
vox.setInputCloud(pcl1_ptrA); 
vox.setLeafSize(0.02f, 0.02f, 0.02f);
vox.filter(*pcl1_ptrB); 
cout<<"done voxel filtering"<<endl;
cout<<"num bytes in original cloud data = "<<pcl1_ptrA->points.size()<<endl;
cout<<"num bytes in filtered cloud data = "<<pcl1_ptrB->points.size()<<endl; // ->data.size()<<endl; 
Eigen::Vector4f xyz_centroid; 
pcl::compute3DCentroid (*pcl1_ptrB, xyz_centroid);
float curvature;
Eigen::Vector4f plane_parameters;  
pcl::computePointNormal(*pcl1_ptrB, plane_parameters, curvature); //pcl fnc to compute plane fit to point cloud
Eigen::Affine3f A(Eigen::Affine3f::Identity());
pcl::transformPointCloud(*pcl1_ptrB, *pcl1_ptrC, A);    

但是,如果我使用pcl::PCLPointCloud2对象,例如:

pcl::PCLPointCloud2::Ptr pcl2_ptrA (new pcl::PCLPointCloud2 ());
pcl::PCLPointCloud2::Ptr pcl2_ptrB (new pcl::PCLPointCloud2 ());
pcl::PCLPointCloud2::Ptr pcl2_ptrC (new pcl::PCLPointCloud2 ());

此功能有效:

pcl::VoxelGrid<pcl::PCLPointCloud2> vox;
vox.setInputCloud(pcl2_ptrA); 
vox.setLeafSize(0.02f, 0.02f, 0.02f);
vox.filter(*pcl2_ptrB);

但这些甚至都不编译:

//the next 3 functions do NOT compile:
Eigen::Vector4f xyz_centroid; 
pcl::compute3DCentroid (*pcl2_ptrB, xyz_centroid);
float curvature;
Eigen::Vector4f plane_parameters;   
pcl::computePointNormal(*pcl2_ptrB, plane_parameters, curvature); 
Eigen::Affine3f A(Eigen::Affine3f::Identity());
pcl::transformPointCloud(*pcl2_ptrB, *pcl2_ptrC, A);  

我很难发现哪些函数接受哪些对象。理想情况下,不是所有PCL函数都接受pcl::PCLPointCloud2参数吗?

pcl::PCLPointCloud2是取代旧sensors_msgs::PointCloud2的ROS(机器人操作系统)消息类型。因此,它只能在与ROS相互作用时使用。(参见此处的示例)

如果需要,PCL提供两种功能从一种类型转换为另一种类型:

void fromPCLPointCloud2 (const pcl::PCLPointCloud2& msg, cl::PointCloud<PointT>& cloud);
void toPCLPointCloud2 (const pcl::PointCloud<PointT>& cloud, pcl::PCLPointCloud2& msg);

额外信息

CCD_ 10和CCD_ 11是用于转换的PCL库函数。ROS在pcl_conversions/pclconversions.h中为这些函数提供了包装,您应该使用这些包装。这些函数将调用正确的函数组合,以便在消息和模板格式之间进行转换。

作为Albert所说的For ROS Hydro and later (if you are using ROS)的后续工作,PCL已经完成了从ROS中删除所有依赖项的工作。这意味着pcl创建了一组与相应ROS消息几乎相同的类,以最大限度地减少pcl用户的API破坏。使用"now depracated" sensor_msgs::PointCloud2的PointCloud用户现在被要求使用pcl_conversions包,该包实现转换from/to sensor_msgs::PointCloud2 to/from) pcl::PointCloud,应该包括:

#include <pcl_conversions/pcl_conversions.h>

ROS代码应修改如下:

void foo(const sensor_msgs::PointCloud2 &pc)
{
  pcl::PCLPointCloud2 pcl_pc;
  pcl_conversions::toPCL(pc, pcl_pc);
  pcl::SomePCLFunction(pcl_pc);
  ...
}

此外,ROS社区不再将pcl打包为catkin包,因此任何直接依赖pcl的包都应该使用新的rosdep规则libpcl-all和libpcl-all-dev,并遵循pcl开发人员在CMake中使用pcl的指南。一般来说,这意味着package.xml将像这样更改:

find_package(PCL REQUIRED)
...
include_directories(${PCL_INCLUDE_DIRS})
...
target_link_libraries(<YOUR_TARGET> ${PCL_LIBRARIES})

有关迁移规则的更多信息,请访问此处、此处和此处。