pcl::PCLPointCloud2 usage
pcl::PCLPointCloud2 usage
我不知道何时使用pcl::PointCloud2
和pcl::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
我可以调用以下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})
有关迁移规则的更多信息,请访问此处、此处和此处。
- C++ Usage of AsyncCallback
- std::visit and std::variant usage
- QLoggingCategory::setFilterRules usage
- C++ std::initializer_list usage
- Direct3D typedef usage
- Windows SetupAPI DIF_REMOVE usage
- C++ unique_ptr() Usage
- c++14 static constexpr auto with odr usage
- The usage of snprintf
- pcre2 UTF32 usage
- Qt QProccess with ping utility usage
- Usage of InternetGetConnectedStateEx
- Usage of QOpenGLVertexArrayObject
- QtGstreamer camerabin2 usage
- pcl::PCLPointCloud2 usage
- Zlib usage - deflateEnd() error
- OpenCV C++ usage of cv::Moments
- libGL heap usage
- 为什么"find usage"不适用于不同子项目中的信号
- Qt connect() usage