PCL学习笔记:地面提取

Posted Sakurazzy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PCL学习笔记:地面提取相关的知识,希望对你有一定的参考价值。

PCL学习笔记(三):地面提取

本节基于学习笔记(二)所学习的处理方法,在Gazebo中搭建仿真环境,提取地面和墙壁


仿真环境

在Gazebo中搭建一个走廊环境,移动机器人上搭载Kinect


关键代码

// 获取原始点云
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr adjust_pcl_ptr (new pcl::PointCloud<pcl::PointXYZRGBA>);  
pcl::fromROSMsg(*kinectCloudMsg, *adjust_pcl_ptr);  //把msg消息转化为点云

// 平面分割
pcl::SACSegmentation<pcl::PointXYZRGBA> seg;
pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients ());
pcl::PointIndices::Ptr inliers (new pcl::PointIndices ());
seg.setOptimizeCoefficients (true);
seg.setModelType (pcl::SACMODEL_PLANE);
seg.setMethodType (pcl::SAC_RANSAC);
seg.setMaxIterations (100);
seg.setDistanceThreshold (0.02);
seg.setInputCloud (adjust_pcl_ptr);
seg.segment (*inliers, *coefficients);

// 创建分割实例
pcl::ExtractIndices<pcl::PointXYZRGBA> extract;
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr ground_cloud (new pcl::PointCloud<pcl::PointXYZRGBA> ());
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr other_cloud (new pcl::PointCloud<pcl::PointXYZRGBA> ());
extract.setInputCloud (adjust_pcl_ptr);
extract.setIndices (inliers);
extract.setNegative (false);
extract.filter (*ground_cloud); 
extract.setNegative (true);
extract.filter (*other_cloud); 

//颜色设置
for (int i = 0; i < ground_cloud->points.size(); i++)

	ground_cloud->points[i].r = 0;
	ground_cloud->points[i].g = 255;
	ground_cloud->points[i].b = 0;
	ground_cloud->points[i].a = 255;

for (int i = 0; i < other_cloud->points.size(); i++)

	other_cloud->points[i].r = 255;
	other_cloud->points[i].g = 0;
	other_cloud->points[i].b = 0;
	other_cloud->points[i].a = 255;


// 发布点云
pcl::PointCloud<pcl::PointXYZRGBA> add_points = *ground_cloud + *other_cloud;
pcl::toROSMsg(add_points, plane_msg);  
pubCloud.publish(plane_msg);

分割结果

以上是关于PCL学习笔记:地面提取的主要内容,如果未能解决你的问题,请参考以下文章

PCL学习笔记:平面和直线提取

PCL:平整地平面但与地面保持距离

学习笔记4针对地面目标识别的遥感预训练与自监督学习

Patchwork++:基于点云的快速稳健的地面分割方法

移动机器人学习笔记-卫星导航IMU惯导

PCL学习笔记:PCL官方教程学习