pcl学习笔记:平面和直线提取(代码片段)

Sakurazzy Sakurazzy     2022-12-02     539

关键词:

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);

提取结果


直线提取

分别直通滤波提取两侧的直线点云,通过RANSAC拟合直线参数,将两条直线参数取中点得到地面中线

关键代码

// 直通滤波获取左侧直线
pcl::PassThrough<pcl::PointXYZRGBA> passthrough;
passthrough.setInputCloud(line_cloud); 
passthrough.setFilterFieldName("x");
passthrough.setFilterLimits(-2, 0);
passthrough.setFilterLimitsNegative(false); 
passthrough.filter(*line_left_pass);   
// RANSAC拟合直线获取直线参数
pcl::ModelCoefficients::Ptr left_coefficients(new pcl::ModelCoefficients);
pcl::PointIndices::Ptr left_inliers(new pcl::PointIndices);  //inliers表示误差能容忍的点 记录的是点云的序号
pcl::SACSegmentation<pcl::PointXYZRGBA> left_seg;    
left_seg.setOptimizeCoefficients(true);  
left_seg.setModelType(pcl::SACMODEL_LINE); 
left_seg.setMethodType(pcl::SAC_RANSAC);  
left_seg.setDistanceThreshold(0.01);         //设置误差容忍范围,也就是阈值
left_seg.setInputCloud(line_left_pass);            
left_seg.segment(*left_inliers, *left_coefficients);   //分割点云,获得平面和法向量

提取结果

pcl学习笔记:pcl官方教程学习(代码片段)

PCL学习笔记(二):PCL官方教程学习PCD文件制作Features表面法线提取Keypoints提取NARF关键点KdTreeRangeImageHowtocreatearangeimagefromapointcloudHowtoextractbordersfromrangeimagesSegmentationPlanemodelsegmentatio 查看详情

pcl学习笔记:pcl官方教程学习(代码片段)

PCL学习笔记(二):PCL官方教程学习PCD文件制作Features表面法线提取Keypoints提取NARF关键点KdTreeRangeImageHowtocreatearangeimagefromapointcloudHowtoextractbordersfromrangeimagesSegmentationPlanemodelsegmentationCylindermodelsegmentation本节学习PCL的官... 查看详情

pcl:多直线拟合(ransac)(代码片段)

文章目录1RANSAC空间直线拟合2RANSAC多直线拟合1RANSAC空间直线拟合具体可参考以下博客。https://blog.csdn.net/weixin_46098577/article/details/1201141522RANSAC多直线拟合代码描述:根据已知的或者想要拟合的直线个数,进行RANSAC多直线拟合。每... 查看详情

pcl:多直线拟合(ransac)(代码片段)

文章目录1RANSAC空间直线拟合2RANSAC多直线拟合1RANSAC空间直线拟合具体可参考以下博客。https://blog.csdn.net/weixin_46098577/article/details/1201141522RANSAC多直线拟合代码描述:根据已知的或者想要拟合的直线个数,进行RANSAC多直线拟合。每... 查看详情

pcl学习笔记:环境安装(代码片段)

PCL学习笔记(一):环境安装Realsense安装ROS中PCL的简单使用修改点云RGB颜色PCL滤波参考博客学习ROS中的PCL使用,完成Realsense安装,PCL的简单使用Realsense安装官方源码:https://github.com/IntelRealSense/realsense-ros参... 查看详情

ar学习笔记:边缘分割优化和提取特征点(代码片段)

AR学习笔记(五):边缘分割优化和提取特征点特征点思路1:取牙齿轮廓底部中点设置ROI及门牙中线的提取牙齿分割及边缘的提取传统方法深度学习新的提取轮廓的想法特征点计算特征点思路2:取牙齿和牙龈... 查看详情

ar学习笔记:边缘分割优化和提取特征点(代码片段)

AR学习笔记(五):边缘分割优化和提取特征点特征点思路1:取牙齿轮廓底部中点设置ROI及门牙中线的提取牙齿分割及边缘的提取传统方法深度学习新的提取轮廓的想法特征点计算特征点思路2:取牙齿和牙龈... 查看详情

ar学习笔记:边缘分割优化和提取特征点(代码片段)

AR学习笔记(五):边缘分割优化和提取特征点特征点思路1:取牙齿轮廓底部中点设置ROI及门牙中线的提取牙齿分割及边缘的提取传统方法深度学习新的提取轮廓的想法特征点计算特征点思路2:取牙齿和牙龈... 查看详情

pcl学习笔记:环境安装(代码片段)

PCL学习笔记(一):环境安装Realsense安装ROS中PCL的简单使用修改点云RGB颜色PCL滤波参考博客学习ROS中的PCL使用,完成Realsense安装,PCL的简单使用Realsense安装官方源码:https://github.com/IntelRealSense/realsense-ros参... 查看详情

pcl学习笔记:环境安装(代码片段)

PCL学习笔记(一):环境安装Realsense安装ROS中PCL的简单使用修改点云RGB颜色PCL滤波参考博客学习ROS中的PCL使用,完成Realsense安装,PCL的简单使用Realsense安装官方源码:https://github.com/IntelRealSense/realsense-ros参... 查看详情

学习loam笔记——特征点提取与匹配(代码片段)

学习LOAM笔记——特征点提取与匹配学习LOAM笔记——特征点提取与匹配1.特征点提取1.1对激光点按线束分类1.2计算激光点曲率1.3根据曲率提取特征点2.特征点匹配2.1scan-to-scan中的特征点匹配2.2scan-to-map中特征点匹配3.补充学习LOAM笔... 查看详情

学习loam笔记——特征点提取与匹配(代码片段)

学习LOAM笔记——特征点提取与匹配学习LOAM笔记——特征点提取与匹配1.特征点提取1.1对激光点按线束分类1.2计算激光点曲率1.3根据曲率提取特征点2.特征点匹配2.1scan-to-scan中的特征点匹配2.2scan-to-map中特征点匹配3.补充学习LOAM笔... 查看详情

youcans的opencv例程200篇130.形态学之提取水平和垂直线(代码片段)

...例程200篇』系列,持续更新中欢迎关注『youcans的OpenCV学习课』系列,持续更新中【youcans的OpenCV例程200篇】130.形态学之提取水平和垂直线3.形态学算法形态学处理的主要应用是提取图像中用来表示和描述形状的元素和成分... 查看详情

机器学习:逻辑回归(使用多项式特征)(代码片段)

一、基础逻辑回归中的决策边界,本质上相当于在特征平面中找一条直线,用这条直线分割所有的样本对应的分类;逻辑回归只可以解决二分类问题(包含线性和非线性问题),因此其决策边界只可以将特征平面分为两部分;问... 查看详情

pcl随机采样一致性:ransac平面拟合(代码片段)

文章目录1平面方程2算法原理3算法实现1平面方程平面方程是指空间中所有处于同一平面的点所对应的方程,其一般式形如Ax+By+Cz+D=0Ax+By+Cz+D=0Ax+By+Cz+D=0点已知平面法向量(A,B,C)(A,B,C)(A,B,C)和平... 查看详情

pcl:ransac空间直线拟合(代码片段)

...MODEL_LINE模型2实现代码3结果展示4源码1SACMODEL_LINE模型空间直线模型,每次采样2个点,返回6个最优模型系数6个最优模型系数系数意义coefficient[0]直线上一点的x坐标coefficient[1]直线上一点的y坐标coefficient[2]直线上一点的z坐... 查看详情

pytorch学习笔记8.实现线性回归模型(代码片段)

PyTorch学习笔记8.实现线性回归模型一、回归的概念1.概念2.目标3.应用4.训练线性回归的步骤二、数据集1.构造数据集2.把数据集转为pytorch使用的张量三、模型1.模型定义2.损失函数3.优化器四、使用模型1.训练2.测试3.预测4.可视化五... 查看详情

pcl:平面模型分割(代码片段)

...1原理描述2代码实现3结果展示4相关链接1原理描述与RANSAC平面拟合原理一致,只是实现代码有些差异。2代码实现#include<pcl/io/pcd_io.h>#include<pcl/ModelCoefficients.h>#include<pcl/sample_consensus/method_types.h>#include<pcl/sample_cons... 查看详情