为什么过滤后的 VoxelGrid 在云中只给我 1 个点?

Why VoxelGrid after filtering gives me only 1 point in the cloud?

我正在接收

类型的 ROS 消息
sensor_msgs::PointCloud2ConstPtr

在我的回调函数中,然后我将其转换为

类型的指针
pcl::PointCloud<pcl::PointXYZ>::Ptr

使用函数

pcl::fromROSMsg.

之后使用 pcl 教程中的这段代码进行正常估计:

void OrganizedCloudToNormals(
      const pcl::PointCloud<pcl::PointXYZ>::Ptr &_inputCloud,
      pcl::PointCloud<pcl::PointNormal>::Ptr &cloud_normals
      )
{ 
      pcl::console::print_highlight ("Estimating scene normals...\n");
      pcl::NormalEstimationOMP<pcl::PointXYZ,pcl::PointNormal> nest;
      nest.setRadiusSearch (0.001);
      nest.setInputCloud (_inputCloud);
      nest.compute (*cloud_normals);
    
      //write 0 wherever is NaN as value
      for(int i=0; i < cloud_normals->points.size(); i++)
      {
        cloud_normals->points.at(i).normal_x = isnan(cloud_normals->points.at(i).normal_x) ? 0 : cloud_normals->points.at(i).normal_x;
        cloud_normals->points.at(i).normal_y = isnan(cloud_normals->points.at(i).normal_y) ? 0 : cloud_normals->points.at(i).normal_y;
        cloud_normals->points.at(i).normal_z = isnan(cloud_normals->points.at(i).normal_z) ? 0 : cloud_normals->points.at(i).normal_z;
        cloud_normals->points.at(i).curvature = isnan(cloud_normals->points.at(i).curvature) ? 0 : cloud_normals->points.at(i).curvature;
      }
}

之后我有了 pcl::PointNormal 类型的点云并尝试对其进行下采样

const float leaf = 0.001f; //0.005f;
pcl::VoxelGrid<pcl::PointNormal> gridScene;
gridScene.setLeafSize(leaf, leaf, leaf);
gridScene.setInputCloud(_scene);
gridScene.filter(*_scene);

其中_scene属于

类型
pcl::PointCloud<pcl::PointNormal>::Ptr _scene (new pcl::PointCloud<pcl::PointNormal>); 

然后在过滤后我得到了我的点云_scene,它里面只有 1 个点。我试图改变叶子的大小,但这并没有改变结果。

有谁知道我做错了什么吗?

提前致谢

我找到问题出在哪里了。类型 pcl::PoinNormal 具有字段 x、y、z、normal_x、normal_y 和 normal_z,但在我的函数 OrganizedCloudToNormals 中我只填充了字段 normal_x、normal_y 和 normal_z 以及字段 x、y 和 z 的每个点的值为 0。当我从输入点云问题中填充字段 x、y 和 z 时,过滤(下采样)消失了,我已经过滤了内部超过 1 个点的云。可能在 x、y 和 z 字段中缺少值导致稍后在体素网格对象的过滤方法中出现问题。