为什么过滤后的 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 字段中缺少值导致稍后在体素网格对象的过滤方法中出现问题。
我正在接收
类型的 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 字段中缺少值导致稍后在体素网格对象的过滤方法中出现问题。