激光雷达点云分割和障碍物检测的MATLAB实现

激光雷达点云分割和障碍物检测的MATLAB实现

MATLAB处理点云工具箱

从MATLAB2019a开始就有了一些处理激光3D点云的函数比如pcfitplane()拟合地面等。在官网中可以查看其具体的使用方法,https://www.mathworks.com/help/vision/ref/pcfitplane.html?action=changeCountry&s_tid=gn_loc_drop。
随着无人驾驶技术的发展,更多优秀的方法贡献出来供研究使用。从MATLAB2019a添加了视觉处理工具箱,丰富了激光点云的处理。详见
https://www.ilovematlab.cn/thread-567484-1-1.html
https://ww2.mathworks.cn/products/computer-vision.html
包括了点云降采样,点云分割为簇等高级方法。详见
https://ww2.mathworks.cn/help/vision/segment-downsample-and-denoise-point-clouds.html

直接放上我的代码

在我的研究中也参考了很多前人的方法,其中这位作者的方法对我帮助较大,促成我的方法产生,详见https://blog.csdn.net/qq_33801763/article/details/79152376。

clear;clc;close all;
% 主要目的:分割出地面,并对障碍物聚类
%
%% 
for img_idx = 181:446
    fid = fopen(sprintf('E:/work/数据/KITTI/2011_09_26_drive_0009_sync/2011_09_26/2011_09_26_drive_0009_sync/velodyne_points/data/%010d.bin',img_idx),'rb');
    velo = fread(fid,[4 inf],'single')';
    velo = velo(:,1:3); % 取前三列x y z
%     a = pointCloud(velo);
    points = transcsv(velo);
    a = pointCloud(points);
    pcloud(img_idx-180).ptCloud = a;
    fclose(fid);
end
%% 

%%选择要显示的点云
% 为了突出周围的环境, 车辆, 集中在一个地区的利益, 横跨20米左右的车辆, 40 米的前面和后面的车辆。
pc = pcloud(1).ptCloud;

% 设置感兴趣区域(单位米)
xBound  = 40; 
yBound  = 20; 
xlimits = [-xBound, xBound];
ylimits = [-yBound, yBound];
zlimits = pc.ZLimits;

player = pcplayer(xlimits, ylimits, zlimits);

% 裁剪指定范围内的点云
indices = find(pc.Location(:, :, 2) >= -yBound ...
             & pc.Location(:, :, 2) <=  yBound ...
             & pc.Location(:, :, 1) >= -xBound ...
             & pc.Location(:, :, 1) <=  xBound);


% 将裁剪到的点显示出来
pc = select(pc, indices,'OutputSize','full');
view(player, pc);


%% 分割地平面和附近障碍物
% 找到地面平面并移除地面平面点。使用RANSAC算法检测和匹配地面平面。
% 平面的法线方向应大致沿 Z 轴向上指向。所有 inlier 点必须在地面平面的20厘米以内。

maxDistance = 0.3; % in meters
referenceVector = [0, 0, 1];
[mode, inPlanePointIndices, outliers] = pcfitplane(pc, maxDistance, referenceVector);

%%
% 标出地平面点。
pcGround = select(pc, inPlanePointIndices);

% 选择不属于地平面一部分的点。
pcWithoutGround = select(pc, outliers);

%% 检索半径在20米以内的点, 并将它们标记为障碍物。
sensorLocation   = [0,0,0]; % 将激光雷达传感器放在坐标系的中心
radius           = 40;      % in meters

nearIndices  = findNeighborsInRadius(pcWithoutGround, sensorLocation, radius);    
nearPointIndices = outliers(nearIndices);

% 标记障碍物点
pcObstacle = select(pc,nearPointIndices,'OutputSize','full');

% Cluster the points,ignoring the ground plane points.
distThreshold = 0.5;
[labels,numClusters] = pcsegdist(pcObstacle, distThreshold);

% Add an additional label for the ground plane.
numClusters = numClusters + 1;
labels(inPlanePointIndices) = numClusters;

% %% 将所有标记的点绘制到点云播放器中。使用前面设置的数字颜色标签。
labelColorIndex = labels+1;
pcshow(pc.Location,labelColorIndex)
colormap([hsv(numClusters);[0 0 0]])
title('Point Cloud Clusters')

colormap(player.Axes, [hsv(numClusters);[0 0 0]])
points1 = pc.Location;
view(player, points1, labelColorIndex);
title(player.Axes, 'Segmented Point Cloud');

结果

原始点云
在这里插入图片描述
地面和障碍区分割
在这里插入图片描述

交流

本人是刚入门,有错误之处望各位大佬纠正,并不吝赐教!
目前正在学习使用pcl库,遇到困难,希望能够和大佬交流!

  • 22
    点赞
  • 186
    收藏
    觉得还不错? 一键收藏
  • 27
    评论
### 回答1: 使用MATLAB实现激光雷达障碍物检测的过程主要包括数据读取、预处理、障碍物提取和可视化展示等步骤。 首先,需要读取激光雷达传感器采集到的数据。MATLAB提供了许多函数用于读取常见的激光雷达数据格式,例如PCAP、ROS Bag等。读取数据后,可以通过MATLAB的数据处理工具进行预处理。 接下来,进行预处理步骤。对于激光雷达数据,常见的预处理包括去除无效点、校准数据和滤波等操作。去除无效点是为了提高后续处理的准确性,校准数据可以调整激光雷达当前位置和角度的误差,滤波操作则可以平滑数据并去除噪声。 随后,进行障碍物提取步骤。根据激光雷达数据的特点,可以利用聚类算法来提取障碍物。常见的聚类算法包括基于距离的聚类算法(如DBSCAN)和基于密度的聚类算法(如MeanShift)。通过对激光雷达数据进行聚类,可以将障碍物从背景中提取出来。 最后,将提取的障碍物进行可视化展示。MATLAB提供了各种绘图函数,可以将检测到的障碍物以图像或点的形式显示出来。通过可视化展示,可以直观地观察激光雷达障碍物检测效果。 综上所述,使用MATLAB实现激光雷达障碍物检测涉及数据读取、预处理、障碍物提取和可视化展示等步骤。通过这些步骤,可以有效地检测激光雷达传感器采集到的障碍物信息,并将其可视化展示出来。 ### 回答2: 激光雷达是一种常用的传感器,用于测量周围环境的物体距离和方向。基于MATLAB激光雷达障碍物检测可以通过以下步骤完成。 首先,需要获取激光雷达的输入数据。这可以通过与激光雷达的硬件连接,并通过MATLAB提供的相关函数实现。一旦连接完成,可以使用MATLAB激光雷达驱动程序获取激光雷达的扫描数据。 接下来,需要对激光雷达的数据进行预处理。这包括去除噪声、滤波和校准等处理。可以使用MATLAB的信号处理工具箱提供的函数来实现这些处理步骤。 然后,可以使用聚类算法对处理后的数据进行分割和分类。通过识别激光雷达数据中的点群,可以确定障碍物的位置和形状。MATLAB中提供了多种聚类算法,如k-means或DBSCAN等,可以根据需求选择合适的算法。 随后,可以根据聚类结果绘制激光雷达检测图。可以使用MATLAB的图形绘制函数将检测到的障碍物标记在图上,以便更直观地展示检测效果。 最后,可以实现障碍物的跟踪和预测功能。如果目标是实时检测障碍物并进行跟踪,可以使用MATLAB中提供的跟踪算法和滤波器来实现。这些算法可以利用之前的检测结果和当前的传感器数据来预测障碍物的位置和运动轨迹。 综上所述,基于MATLAB实现激光雷达障碍物检测的步骤包括获取激光雷达数据、预处理、聚类分割、绘制检测图和跟踪预测。通过使用MATLAB的信号处理、图形绘制和跟踪算法等功能,可以实现高效、准确的激光雷达障碍物检测系统。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值