激光雷达扫描得到的点云含有大部分地面点,这对后续障碍物点云的分类、识别和跟踪带来麻烦,所以需要首先滤波滤掉。传统的基于几何特征的滤波是最基本最简单的方法,目前本文尝试的有如下几种:
水平面校准
法向量
栅格高度差
栅格最低高度以上0.2米
绝对高度
平均高度
以上方法基于假设是地面点云所构成的地面为平面,而不是弧面,当然对于有倾斜角度的地面也是可以先通过水平面校准然后再进行后处理来达到目标。下面将针对以上几种方法,通过实验结果比对各自方法优劣。
水平面校准顾名思义就是通过找到地面点所在平面,然后进行校准点云的方法。通过此步可将数据采集阶段,采集道德地面点云相对于激光雷达 z 轴不平行校准为与之平行。目的是为后续处理提供更易于处理的点云。
分割出大致地面点
找到地点所在平面
通过变换矩阵校准平面
1. 分割出大致地面点这一步可使用栅格高度差、绝对高度、法向量等方法来进行分割,目的只需要找到大部分地面点即可,不用进行精确的分割。本文通过法向量进行分割找到地面点。
2. 找到地点所在平面通过PCL自带函数进行处理。
bool estimateGroundPlane(PointCloudXYZI::Ptr &in_cloud, PointCloudXYZI::Ptr &out_cloud, visualization_msgs::MarkerPtr &plane_marker, const float in_distance_thre) { //plane segmentation pcl::SACSegmentation<pcl::PointXYZI> plane_seg; pcl::PointIndices::Ptr plane_inliers ( new pcl::PointIndices ); pcl::ModelCoefficients::Ptr plane_coefficients ( new pcl::ModelCoefficients ); plane_seg.setOptimizeCoefficients (true); plane_seg.setModelType ( pcl::SACMODEL_PLANE ); plane_seg.setMethodType ( pcl::SAC_RANSAC ); plane_seg.setDistanceThreshold ( in_distance_thre ); plane_seg.setInputCloud ( in_cloud ); plane_seg.segment ( *plane_inliers, *plane_coefficients ); return true; }
通过上述代码找到平面之后,确定平面法向量就可以找到其到 z 轴的变换矩阵 T 。
3. 通过变换矩阵校准平面将原始点云与变换矩阵 T 作点积就可得到校准后点云。从图左下方可观察到校准后点云与原始点云有一定距离,说明激光雷达在采集数据时,其 z 轴与地面法向量不平行,而且这种情况随时都在发生。自动驾驶车辆行驶过程中,路面随时都有小的颠簸,偶尔还会有较大颠簸,如通过城市道路中的减速带,转弯时速度过大等等情况。所以校准点云是很有必要的。
根据栅格尺寸生成栅格
计算每个栅格最低点与最高点高度差
比较 h 与预设高度差阈值 threshold 大小,对栅格进行分类
根据栅格分类,对栅格内点进行分类
依据对每个栅格的高度差的大小进行分类,栅格高度差方法依赖于点云数据。栅格内地面点高度差特征符合栅格高度差方法,但是对于高平台仍然符合该特征,所以对于进行栅格话之后的高平台点仍然被分类为地面点。但是,该方法的分类出的地面点包含真实的地面点。
法向量方法基于假设为计算得到的地面点法向量为竖直向上或向下,即地面点法向量值为 (0, 0, 1) 或 (0, 0, -1) 。
计算点法向量
设定法向量阈值 threshold 进行点分类
根据法向量方法的假设,一定要先对点云进行校正,如果不进行校正,那么很可能出现某一帧没有地面点被分割出来的极端情况(激光雷达倾斜角度过大)。法向量方法与高度差方法结果类似,对于平台类型障碍物生成的点无法有效区分。所以可以看到右视图中有部分店漂浮与真实地面点上方。
栅格最低高度以上 0.2 米方法中的数值 0.2 可在 0.2 附近进行选取,有论文设置为 0.15 。此方法与栅格高度差方法类似,也是基于栅格内点的高度信息来进行点分类。不过该方法并没有对栅格进行地面栅格或障碍物栅格分类,而在每个栅格内进行点的分类,最后将所有栅格内的点汇总得到地面点。
生成栅格地图
找到栅格内最低点,并储存其高度 h
找到栅格内点高度小于 h + 0.2,分类为地面点
栅格最低高度以上0.2米方法依赖于栅格内的最低点选取,当最地点正好是真实地面点时,结果较为正确,反之则不然。与栅格高度差方法类似,该方法对悬浮物无法处理。
绝对高度方法根据校准后点云高度进行分割,通过设定阈值将点云分为地面点和障碍物点。
校准点云
根据高度阈值 threshold 对点进行分类
绝对高度方法必须对校准点云进行操作,根据校准后点云通过设定高度阈值进行分类。从鸟瞰图可看出,远处有一部分地面点被分割为障碍物点,从结果右视图可看出,该方法对悬浮物可很好处理。
平均高度方法是对预处理后已经包含大部分地面点进行的处理,而不能单独进行使用。本文采用栅格最低点高度以上 0.2 米方法作为预处理,其他地面点预处理也可。该方法基于假设为,预处理分割后得到点中地面点为绝大部分点,从而可根据平均高度作为进一步滤波。
栅格最低点高度以上 0.2 米方法分割出地面点
计算 过程 1. 得到地面点的平均高度 h
以 h 为阈值再进行分割得到地面点
平均高度方法作为其他方法的一个小的补充,可对分割出的点悬浮物点进行进一步滤波。但对当大平台场景无法处理。
本文对基于几何特征方法 水平面校准方法、法向量方法、栅格高度差方法、栅格最低高度以上0.2米方法、绝对高度方法、平均高度方法 等方法进行了分别分析,对各自方法优缺点进行了探讨。各个方法可以进行合理组合来达到地面点分割效果。这些方法可作为机器学习方法的数据集生成,为机器学习方法做好数据准备。
欢迎来到泡泡论坛,这里有大牛为你解答关于SLAM的任何疑惑。
有想问的问题,或者想刷帖回答问题,泡泡论坛欢迎你!
泡泡网站:www.paopaorobot.org
泡泡论坛:http://paopaorobot.org/forums/
泡泡机器人SLAM的原创内容均由泡泡机器人的成员花费大量心血制作而成,希望大家珍惜我们的劳动成果,转载请务必注明出自【泡泡机器人SLAM】微信公众号,否则侵权必究!同时,我们也欢迎各位转载到自己的朋友圈,让更多的人能进入到SLAM这个领域中,让我们共同为推进中国的SLAM事业而努力!
商业合作及转载请联系liufuqiang_robot@hotmail.com