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

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

前言


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

![点运数据](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xMDAyODA1OC1mMTRiZjY2MDU5ZDkwMDQ4LmdpZg)

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

地面点分割


相关工作

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

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

地面点分割流程

算法流程:
  1. 法向量分割
  2. 平均高度分割
  3. 校准平面
  4. 栅格内高度差分割
  5. 平均高度分割
部分代码:
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;
}

试验结果


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

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

KITTI 原始点云数据(PCL)地面点分割_第1张图片

KITTI 原始点云数据(PCL)地面点分割_第2张图片

KITTI 原始点云数据(PCL)地面点分割_第3张图片

KITTI 原始点云数据(PCL)地面点分割_第4张图片

KITTI 原始点云数据(PCL)地面点分割_第5张图片

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

以上。


你可能感兴趣的:(ROS,算法,CNN,分割地面点云,ROS)