激光雷达点云处理:直通滤波、体素降采样、欧式聚类、boundingbox

       初接触ROS的小白一枚,借鉴PCL官方以及Adam大佬的内容,好不容易跑通了这一套处理点云的代码,在此做一下记录。

一、直通滤波:

PCL官方提供的代码使用通过过滤点云库 0.0 文档过滤点云云 (pcl.readthedocs.io)

以及借鉴的一篇CSDN文章(5条消息) PCL点云滤波:直通滤波PassThrough(简单卡阈值留点)和适用场景_手口一斤-CSDN博客

对z轴、y轴上的点云进行直通滤波:

void
cloud_cb (const sensor_msgs::PointCloud2ConstPtr& cloud_msg)
{
  // Container for original & filtered data
  pcl::PCLPointCloud2* cloud = new pcl::PCLPointCloud2;
  pcl::PCLPointCloud2ConstPtr cloudPtr(cloud);
  pcl::PCLPointCloud2* cloud_filtered = new pcl::PCLPointCloud2;
  pcl::PCLPointCloud2ConstPtr passPtr(cloud_filtered);

  // Convert to PCL data type
  pcl_conversions::toPCL(*cloud_msg, *cloud);

  // Perform the actual filtering
  pcl::PassThrough<pcl::PCLPointCloud2> pass;
    // build the filter
  pass.setInputCloud (cloudPtr);
  pass.setFilterFieldName ("y");
  pass.setFilterLimits (-5.0, 16.0);
    // apply filter
  pass.filter (*cloud_filtered);


 // Perform the actual filtering
  pcl::PassThrough<pcl::PCLPointCloud2> passz;
    // build the filter
  passz.setInputCloud (passPtr);
  passz.setFilterFieldName ("z");
  passz.setFilterLimits (-0.9, 20.0);
    // apply filter
  passz.filter (*cloud_filtered);


// Convert to ROS data type
  sensor_msgs::PointCloud2 cloud_pt;
  pcl_conversions::moveFromPCL(*cloud_filtered, cloud_pt);


  // Publish the data
  pub.publish (cloud_pt);
}

二、降采样

PCL官方提供的代码使用 VoxelGrid 过滤器对点云进行下采样 - 点云库 0.0 文档 (pcl.readthedocs.io)

void
cloud_cb (const sensor_msgs::PointCloud2ConstPtr& cloud_msg)
{
  // Container for original & filtered data
  pcl::PCLPointCloud2* cloud = new pcl::PCLPointCloud2;
  pcl::PCLPointCloud2ConstPtr cloudPtr(cloud);
  pcl::PCLPointCloud2 cloud_filtered;

  // Convert to PCL data type
  pcl_conversions::toPCL(*cloud_msg, *cloud);

  // Perform the actual filtering
    pcl::VoxelGrid<pcl::PCLPointCloud2> sor;
    // build the filter
    sor.setInputCloud (cloudPtr);
    sor.setLeafSize (0.5, 0.5, 0.5);
    // apply filter
    sor.filter (cloud_filtered);

  // Convert to ROS data type
  sensor_msgs::PointCloud2 cloud_vog;
  pcl_conversions::moveFromPCL(cloud_filtered, cloud_vog);

  // Publish the data
  pub.publish (cloud_vog);
}

三、欧式聚类和boundingbox

借鉴了Adam大佬的一篇博客(5条消息) 无人驾驶汽车系统入门(二十五)——基于欧几里德聚类的激光雷达点云分割及ROS实现_AdamShan的博客-CSDN博客

 四、总结

编写launch文件运行上述cpp文件的几个节点,最后出来的效果如上图。

 受实验环境影响,boundingbox的效果一般。

还需要继续努力呀!!

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS(机器人操作系统)是一个基于开源的软件平台,广泛应用于机器人控制、导航、感知和执行等方面。其中,ROS的激光处理模块是非常重要的部分。激光处理主要是针对激光测距仪或LIDAR等传感器采集到的数据进行处理,实现对环境的建模、地图构建以及目标检测等功能。本文主要介绍基于ROS的激光处理中的三个重要方面:点采样、欧式聚类分割的目标检测和地面拟合分割。 首先是点采样。对于一些大规模的三维点数据,通常需要对其进行采样减少数据量以及提高点处理效率。ROS中,PointCloud2节点提供了一个非常灵活的点采样模块,可以通过ROS消息类型进行订阅、采样处理和发布。同时,ROS中也提供了一些基本的采样算法,如均匀采样、随机采样滤波等。 其次是基于欧式聚类分割的目标检测。在激光传感器中,目标物通常是一些密集的点簇,通过欧式聚类算法可以将属于同一目标的点簇进行分割,从而实现目标的检测。ROS中,可以通过PCL库实现欧式聚类分割算法,并结合提取出的目标点簇进行目标检测、跟踪和分类等任务。 最后是地面拟合分割。很多情况下,机器人需要整地分析环境,而非只是分析某些目标。因此,在处理激光数据时,需要将地面和非地面点进行分别处理,以便更好地进行环境建模和点分类等任务。ROS中,可以通过PCL库实现RANSAC算法对垂直平面进行拟合,从而实现对地面点拟合和分割。 综上所述,基于ROS的激光处理可以实现多种功能,包括点采样、欧式聚类分割的目标检测和地面拟合分割。这些功能可以为机器人的环境感知和控制提供优秀的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值