pcl::PCLPointCloud2使用方法

5
我对何时使用和感到困惑。
例如,使用这些定义,和:
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函数都应该接受参数吧?

2个回答

5

pcl::PCLPointCloud2是ROS(机器人操作系统)消息类型,取代了旧版的sensors_msgs::PointCloud2。因此,只有在与ROS交互时才应使用它。(可以查看这里的示例:here

如果需要,PCL提供了两个函数用于将一种类型转换为另一种类型:

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

额外信息

fromPCLPointCloud2toPCLPointCloud2是用于转换的PCL库函数。ROS在pcl_conversions/pcl_conversions.h中提供了这些函数的包装器,您应该使用它们。这些包装器将调用正确的函数组合来在消息和模板格式之间进行转换。


3
作为对Albert所说的内容的跟进,对于使用ROS的用户,在ROS Hydro和以后的版本中,PCL已经进行了工作,将其所有依赖项从ROS中删除。这意味着pcl创建了一组几乎与相应的ROS消息相同的类,以最小化pcl用户的API破坏。现在要求使用“现已弃用”的sensor_msgs::PointCloud2的PointCloud用户使用pcl_conversions包,该包实现了从/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})

关于迁移规则的更多信息可以在这里查找,在这里查找和在这里查找


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接