KITTI 原始点云数据(PCL)地面点分割

欢迎访问我的个人博客网站:zengzeyu.com

前言


自动驾驶系统中,对激光雷达获取的点云数据进行地面点分割是第一步,地面点分割结果的好坏直接影响聚类,识别和追踪效果。在对地面点分割过程中,前人尝试了许多方法,部分方法结果请参考本人博文《基于几何特征的地面点云分割》。所以,地面点分割是自动驾驶激光雷达点云处理永恒的话题。目前,基于几何特征的地面点分割都基于各自的前提假设,大多数的原理是根据地面点与非地面点的特征不同而进行区分,如法向量、高度、高度差等。

点运数据

本文利用现有的KITTI点云数据进行地面点分割,通过不同方法组合,试验出结果相对较好的方法,并予以结果显示。

地面点分割

相关工作

本文相关的一些工作,请参考本博客前博文:

1.  《KITTI 原始bin数据转pcd数据》
2.  《KITTI 无序点云数据转有序点云数据》
3.  《基于几何特征的地面点云分割》

地面点分割流程

算法流程:

1. 法向量分割
2. 平均高度分割
3. 校准平面
4. 栅格内高度差分割
5. 平均高度分割
部分代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void KittiPCL::generateGroundCloud(PointCloudXYZI::Ptr &out_cloud, visualization_msgs::MarkerPtr &plane_marker)
{
PointCloudXYZI::Ptr temp_cloud_1 ( new PointCloudXYZI );
PointCloudXYZI::Ptr temp_cloud_2 ( new PointCloudXYZI );
*temp_cloud_1 = *kitti_organised_cloud_ptr_;
// calibration
this->filtCloudWithNormalZ( temp_cloud_1, temp_cloud_2 );
this->filtWithAverageHeight( temp_cloud_2, kitti_organised_cloud_ptr_, temp_cloud_1 );
this->estimateGroundPlane( temp_cloud_1, transform_cloud_ptr_, plane_marker );
// grid
this->generateGridMap( transform_cloud_ptr_, temp_cloud_2, 75.0f, 0.2f );
this->computePtsCloudFeature(transform_cloud_ptr_);
*out_cloud = *temp_cloud_2;
}

试验结果


为了客观合理展示试验结果,S选取了直道路和十字路口的点云进行分割结果展示。
同时,统计时间,在 Release 模式下,处理一帧平均耗时 130ms

平台配置:
CPU: Intel® Xeon(R) CPU E3-1230 v3 @ 3.30GHz × 8
GPU: GeForce GT 730/PCIe/SSE2
System: 64-bit

Screenshot from 2018-03-28 16:02:53.png

Screenshot from 2018-03-28 16:04:27.png

Screenshot from 2018-03-28 16:05:02.png

Screenshot from 2018-03-28 16:05:52.png

Screenshot from 2018-03-28 16:08:50.png

最后一张图片右上方,可发现有大块地面点未被分割出来,原因是该十字路口地面不平,本文算法还无法适用于这种情况,后续需要改进。

以上。