W.S*_*man 5 c++ point-cloud-library
我很困惑何时使用pcl::PointCloud2vspcl::PointCloudPointCloud
例如,使用pcl1_ptrA、pcl1_ptrB和的这些定义pcl1_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
Run Code Online (Sandbox Code Playgroud)
我可以调用以下 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);
Run Code Online (Sandbox Code Playgroud)
但是,如果我改为使用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 ());
Run Code Online (Sandbox Code Playgroud)
该函数的工作原理:
pcl::VoxelGrid<pcl::PCLPointCloud2> vox;
vox.setInputCloud(pcl2_ptrA);
vox.setLeafSize(0.02f, 0.02f, 0.02f);
vox.filter(*pcl2_ptrB);
Run Code Online (Sandbox Code Playgroud)
但这些甚至无法编译:
//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);
Run Code Online (Sandbox Code Playgroud)
我无法发现哪些函数接受哪些对象。理想情况下,不是所有 PCL 函数都接受pcl::PCLPointCloud2参数吗?
pcl::PCLPointCloud2是一种 ROS(机器人操作系统)消息类型,取代了旧的sensors_msgs::PointCloud2. 因此,它只能在与 ROS 交互时使用。(参见此处的示例)
如果需要,PCL 提供两个函数来从一种类型转换为另一种类型:
void fromPCLPointCloud2 (const pcl::PCLPointCloud2& msg, cl::PointCloud<PointT>& cloud);
void toPCLPointCloud2 (const pcl::PointCloud<PointT>& cloud, pcl::PCLPointCloud2& msg);
Run Code Online (Sandbox Code Playgroud)
额外的信息
fromPCLPointCloud2和toPCLPointCloud2是用于转换的 PCL 库函数。ROS 在pcl_conversions/pcl_conversions.h中有这些函数的包装器,您应该使用它们。这些将调用正确的函数组合来在消息和模板格式之间进行转换。
| 归档时间: |
|
| 查看次数: |
13712 次 |
| 最近记录: |