ROS Melodic下pcl::PointCloud<pcl::PointXYZ>转PCLPointCloud2为空问题
问题根因
- 头文件引用缺失:未引入
pcl/conversions.h时,编译器会调用错误的重载实现,转换逻辑未实际执行,导致输出对象为空。 - PCL版本兼容问题:ROS Melodic默认绑定PCL 1.8版本,该版本的
pcl::toPCLPointCloud2接口存在模板参数推导缺陷,未显式指定点类型时会出现转换失效问题。
解决方案
- 补全必要头文件
#include <pcl/point_types.h> #include <pcl/point_cloud.h> #include <pcl/conversions.h> // 若使用ROS中转方案需额外引入以下头 #include <sensor_msgs/PointCloud2.h> #include <pcl_conversions/pcl_conversions.h>
- 使用显式模板参数调用转换接口
显式指定源点云的点类型,避免PCL 1.8的模板推导bug:
pcl::PCLPointCloud2 cloud_inliers_pcl2; pcl::toPCLPointCloud2<pcl::PointXYZ>(cloud_inliers, cloud_inliers_pcl2);
- 备选ROS中转转换方案
如果纯PCL接口仍失效,可通过ROS点云消息类型中转完成转换:
sensor_msgs::PointCloud2 cloud_ros; pcl::toROSMsg(cloud_inliers, cloud_ros); pcl_conversions::toPCL(cloud_ros, cloud_inliers_pcl2);
验证方式
转换完成后可输出以下字段校验转换结果是否正常:
- 源点云点数:
cloud_inliers.size() - 转换后PCLPointCloud2对应点数:
cloud_inliers_pcl2.width * cloud_inliers_pcl2.height - 转换后数据长度:
cloud_inliers_pcl2.data.size()
内容的提问来源于stack exchange,提问作者Sant
相关产品推荐
相关产品推荐

