激光雷达障碍物识别

Lidar系列文章

传感器融合是将多个传感器采集的数据进行融合处理,以更好感知周围环境;这里首先介绍激光雷达的相关内容,包括激光雷达基本介绍(本节内容),激光点云数据处理方法(点云数据显示,点云分割,点云聚类,障碍物识别实例)等。

系列文章目录

1. 激光雷达基本介绍
2. 激光点云数据显示
3. 基于RANSAC的激光点云分割
4. 点云分割入门级实例学习
5. 激光点云目标物聚类
6. 基于PCL实现欧式聚类提取
7. 激光雷达障碍物识别



在前一章节,我们已经了解如何分割和聚类简单的仿真产生的点云。这里我们将介绍如何使用分割和聚类算法处理自动驾驶车辆的真实点云数据的整个过程。同时我们将介绍点云滤波处理,以及处理pcd文件流实现障碍物检测的方法。

障碍物检测的步骤

  1. 读取PCD点云数据流;
  2. 点云滤波;
  3. 点云分割;
  4. 障碍物点云聚类;
  5. 确定聚类点云的边界框;
    我们要处理的点云如下图所示。
    在这里插入图片描述

PCD数据流读取

通常用于加载单帧的pcd数据,函数实现可以如下loadPcd

template<typename PointT>
typename pcl::PointCloud<PointT>::Ptr ProcessPointClouds<PointT>::loadPcd(std::string file)
{
   
    typename pcl::PointCloud<PointT>::Ptr cloud (new pcl::PointCloud<PointT>);

    if (pcl::io::loadPCDFile<PointT> (file, *cloud) == -1) //* load the file
    {
   
        PCL_ERROR ("Couldn't read file \n");
    }
    std::cerr << "Loaded " << cloud->points.size () << " data points from "+file << std::endl;
    return cloud;
}

然后加载pcd数据即可。

  ProcessPointClouds<pcl::PointXYZI>* pointProcessorI = new ProcessPointClouds<pcl::PointXYZI>();
  pcl::PointCloud<pcl::PointXYZI>::Ptr inputCloud = pointProcessorI->loadPcd("../src/sensors/data/pcd/data_1/0000000000.pcd");
  renderPointCloud(viewer,inputCloud,"inputCloud");

由于本项目中提供的是事先录制好的pcd点云数据流,因此我们需要逐个加载录制的pcd文件,这里首先获取pcd文件名列表。

template<typename PointT>
std::vector<boost::filesystem::path> ProcessPointClouds<PointT>::streamPcd(std::string dataPath)
{
   
    std::vector<boost::filesystem::path> paths(boost::filesystem::directory_iterator{
   dataPath}, boost::filesystem::directory_iterator{
   });

    // sort files in accending order so playback is chronological
    sort(paths.begin(), paths.end());
    return paths;
}

然后逐个加载pcd数据,流水线方式处理列表中的pcd数据。

    //Create point cloud processor
    ProcessPointClouds<pcl::PointXYZI>* pointProcessorI = new ProcessPointClouds<pcl::PointXYZI>();
    std::vector<boost::filesystem::path> stream = pointProcessorI->streamPcd("../src/sensors/data/pcd/data_1");
    auto streamIterator = stream.begin();
    pcl::PointCloud<pcl::PointXYZI>::Ptr inputCloudI;
    
    while (!viewer->wasStopped ())
    {
   
        // Clear viewer
        viewer->removeAllPointClouds();
        viewer->removeAllShapes();

        // Load pcd and run obstacle detection process
        inputCloudI = pointProcessorI->loadPcd((*streamIterator).string());
        cityBlock(viewer, pointProcessorI, inputCloudI);

        streamIterator++;
        if(streamIterator == stream.end())
            streamIterator = stream.begin();
        
        viewer->spinOnce ();
    } 

这里我们首先创建了一个ProcessPointClouds对象pointProcessorI,其中ProcessPointClouds包含我们的点云处理函数模块(pcd数据加载,滤波,点云分割,聚类,pcd数据存储等),CityBlock函数实现对点云的障碍物检测。

PCL点云滤波

下一步我们需要利用PCL库的滤波函数实现点云滤波。我们使用的点云数据为通过64线激光雷达采集所得,一帧包含120000点。这里我们将进行降采样,降低点云的精度,以提高处理速度。同时,我们有ROI感兴趣区域,集中于包含障碍物的道路区域,比如x轴车辆行驶方向30m,y轴横向10m的矩形区域。
本小节主要工作如下:

  1. Voxel Grid滤波器:进行点云降采样以加快点云处理速度;
    Voxel Grid滤波器生成一系列立方体网格对点云进行滤波,通过每个体素立方体单元只保留一个点云来实现降采样,因此立体单元越大,输出的点云分辨率就越低。这里我们将使用PCL库的voxel grid filtering功能。
  2. 保留ROI感兴趣区域内的点云,删除其他点云。这里我们将使用PCL库的Region of Interest功能。
  3. 去除车顶的反射点;
template<typename PointT>
typename pcl::PointCloud<PointT>::Ptr ProcessPointClouds<PointT>::FilterCloud(typename pcl::PointCloud<PointT>::Ptr cloud, float filterRes, Eigen::Vector4f minPoint, Eigen::
  • 5
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 使用MATLAB实现激光雷达障碍物检测的过程主要包括数据读取、预处理、障碍物提取和可视化展示等步骤。 首先,需要读取激光雷达传感器采集到的数据。MATLAB提供了许多函数用于读取常见的激光雷达数据格式,例如PCAP、ROS Bag等。读取数据后,可以通过MATLAB的数据处理工具进行预处理。 接下来,进行预处理步骤。对于激光雷达数据,常见的预处理包括去除无效点、校准数据和滤波等操作。去除无效点是为了提高后续处理的准确性,校准数据可以调整激光雷达当前位置和角度的误差,滤波操作则可以平滑数据并去除噪声。 随后,进行障碍物提取步骤。根据激光雷达数据的特点,可以利用聚类算法来提取障碍物。常见的聚类算法包括基于距离的聚类算法(如DBSCAN)和基于密度的聚类算法(如MeanShift)。通过对激光雷达数据进行聚类,可以将障碍物从背景中提取出来。 最后,将提取的障碍物进行可视化展示。MATLAB提供了各种绘图函数,可以将检测到的障碍物以图像或点云的形式显示出来。通过可视化展示,可以直观地观察激光雷达障碍物检测效果。 综上所述,使用MATLAB实现激光雷达障碍物检测涉及数据读取、预处理、障碍物提取和可视化展示等步骤。通过这些步骤,可以有效地检测激光雷达传感器采集到的障碍物信息,并将其可视化展示出来。 ### 回答2: 激光雷达是一种常用的传感器,用于测量周围环境的物体距离和方向。基于MATLAB的激光雷达障碍物检测可以通过以下步骤完成。 首先,需要获取激光雷达的输入数据。这可以通过与激光雷达的硬件连接,并通过MATLAB提供的相关函数实现。一旦连接完成,可以使用MATLAB的激光雷达驱动程序获取激光雷达的扫描数据。 接下来,需要对激光雷达的数据进行预处理。这包括去除噪声、滤波和校准等处理。可以使用MATLAB的信号处理工具箱提供的函数来实现这些处理步骤。 然后,可以使用聚类算法对处理后的数据进行分割和分类。通过识别激光雷达数据中的点群,可以确定障碍物的位置和形状。MATLAB中提供了多种聚类算法,如k-means或DBSCAN等,可以根据需求选择合适的算法。 随后,可以根据聚类结果绘制激光雷达的检测图。可以使用MATLAB的图形绘制函数将检测到的障碍物标记在图上,以便更直观地展示检测效果。 最后,可以实现障碍物的跟踪和预测功能。如果目标是实时检测障碍物并进行跟踪,可以使用MATLAB中提供的跟踪算法和滤波器来实现。这些算法可以利用之前的检测结果和当前的传感器数据来预测障碍物的位置和运动轨迹。 综上所述,基于MATLAB实现激光雷达障碍物检测的步骤包括获取激光雷达数据、预处理、聚类分割、绘制检测图和跟踪预测。通过使用MATLAB的信号处理、图形绘制和跟踪算法等功能,可以实现高效、准确的激光雷达障碍物检测系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值