硬件:Kinect2、UR5。
软件:Ubuntu16.04、ROS kinetic。
未经处理的Kinect点云包含噪声、视野范围太大,所以需要对其进行处理。我采用了直通、半径、体素三种方式。
以下内容纯属个人学习,如有错误,欢迎指正,不胜感激!!
1、PCL滤波学习
官方教程:http://pointclouds.org/documentation/tutorials/index.php#filtering-tutorial
参考教程:https://blog.youkuaiyun.com/fandq1223/article/details/53185053
https://blog.youkuaiyun.com/u013019296/article/details/70052319
https://blog.youkuaiyun.com/qq_34719188/article/details/79179430
下面是我所使用的三种滤波,仅有滤波器的主体和参数设置部分(ROS下只用到了这些)。
直通滤波
保留或删除某一轴线特定范围内的点,改变视野范围。
pcl::PassThrough<pcl::PointXYZ> pass; //创建滤波器
pass.setInputCloud (cloud); //设置点云输入
pass.setFilterFieldName ("z"); //设置滤波的方向,z轴
pass.setFilterLimits (0.0, 1.0); //设置滤波的范围
//pass.setFilterLimitsNegative (true); //设置范围内点云保留还是过滤,默认保留
pass.filter (*cloud_filtered); //执行滤波
体素滤波
使用体素网格进行下采样,这么做减少了点云的数量和数据(并没有发现变化)、保留点云表面的形状体征,可以提高配准、表面重建等。
pcl::VoxelGrid<pcl::PCLPointCloud2> sor; //创建体素滤波器
sor.setInputCloud (cloud); //设置点云输入
sor.setLeafSize (0.01f, 0.01f, 0.01f); //设置滤波的体素大小,0.01m立方体
sor.filter (*cloud_filtered); //执行滤波
半径滤波
降噪,删除该图像内符合约束条件的点。
pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem; //创建半径滤波
outrem.setInputCloud(cloud); //设置点云输入
outrem.setRadiusSearch(0.8); //设置查询半径,0.8m,并查询该邻域
outrem.setMinNeighborsInRadius (2); //该邻域内点的个数小于XX则删除
outrem.filter (*cloud_filtered); //执行滤波
2、ROS下的PCL
官方教程: