基于激光雷达的地面与障碍物检测

这个例子告诉我们如何去检测地平面并且找到三维LIDAR数据中与车相近的障碍物。

这个过程能够方便我们对汽车导航的可行驶区域规划。

注:每一帧的雷达属于都被存储为三维的雷达点云。为了能够高效的处理这些数据。快速的指出与搜索能力是需要的。通过kd-tree结构处理数据。周围平面通过RANSAC算法来拟合(RANSAC算法是一个稳健的模型拟合方法)。这个例子也展示了如何使用点云来实现多帧点云的动画过程。

选择要显示的点云区域

首先, 在车辆周围选择一个目标区域, 并配置pcplayer以显示它。

1.加载点云序列。

load('01_city_c2s_fcw_10s_Lidar.mat');
pcloud = d.LidarPointCloud;

2.为了规定车辆周围的环境, 在左右边20米(自由配置,此处选20)左右的车辆, 和50米(自由配置,此处选50)的前面和后面的车辆被纳入检测范围。


%% 设置第一帧点云格式
pc = pcloud(1).ptCloud; %设置目标区域.
xBound = 50;
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);
view(player, pc)

分离地面平面与障碍物

找到地面平面并移出地面平面。使用RANSAC算法来找到并拟合地平面。正常平面方向应该粗略指向Z轴。所有内收的点都应该在地面平面的20cm内。

maxDistance = 0.2; % 0.2米
referenceVector = [0, 0, 1];
[~, inPlanePointIndices, outliers] = pcfitplane(pc, maxDistance, referenceVector);

  

为点云中所有的点附着一种颜色标签。使用绿色来表示地平面,红色来表示10米内LIDAR传感器能找到的障碍物。

labelSize   = [pc.Count, 1];
colorLabels = zeros(labelSize, 'single'); % 设置颜色谱来描述不同的点云
colors = [0 0 1; ... %蓝色作为未被标签化的点云
0 1 0; ... % 绿色作为地面点云
1 0 0; ... % 红色作为障碍物点云
0 0 0]; % 汽车点云 blueIdx = 0; % 将所有点云初始化为蓝色
greenIdx = 1;
redIdx = 2;
blackIdx = 3; % 标签化地面点云
colorLabels(inPlanePointIndices) = greenIdx; % 选择出不是地面点云的点云
pcWithoutGround = select(pc, outliers);

  重新获得的点云在10米半径以内的障碍物

sensorLocation   = [0,0,0]; % 将LIDAR传感器放在车的中心坐标
radius = 10; nearIndices = findNeighborsInRadius(pcWithoutGround, sensorLocation, radius);
nearPointIndices = outliers(nearIndices); % 将障碍物点云标签化
colorLabels(nearPointIndices) = redIdx;

  分离本车雷达点云

因为雷达安装在车的本身,所有的点云数据会包括雷达他本身,比如车顶或者车身。这些点云离车最近却不是障碍物。重新获得这些包围着汽车的点云。使用这些点云来形成一个三维边界立方体来代表本车。

radius      = 3;
nearIndices = findNeighborsInRadius(pcWithoutGround, sensorLocation, radius); vehiclePointIndices = outliers(nearIndices);
pcVehicle = select(pcWithoutGround, nearIndices);

  形成一个三维立方体并标签化本车点云

delta = 0.1;
selfCube = [pcVehicle.XLimits(1)-delta, pcVehicle.XLimits(2)+delta ...
pcVehicle.YLimits(1)-delta, pcVehicle.YLimits(2)+delta ...
pcVehicle.ZLimits(1)-delta, pcVehicle.ZLimits(2)+delta]; colorLabels(vehiclePointIndices) = blackIdx;

  显示所有被标签化的点云进入点云播放器,使用我们之前设定的数字化的标签。

colormap(player.Axes, colors)
view(player, pc.Location, colorLabels);
title(player.Axes, 'Segmented Point Cloud');

  

处理点云序列(注:形成点云播放器)

现在我们有了点云播放器,并已经配置好它并且已经处理好标签化点云过程。现在开始处理整个点云序列。

for k = 2:length(pcloud)
pc = pcloud(k).ptCloud; % 将下一帧的点云数据导入
indices = find(pc.Location(:, 2) >= -yBound ...
& pc.Location(:, 2) <= yBound ...
& pc.Location(:, 1) >= -xBound ...
& pc.Location(:, 1) <= xBound);
pc = select(pc, indices); colorLabels = zeros(pc.Count, 1, 'single'); % 创造标签阵列 % 拟合地面平面
[~, inPlanePointIndices, outliers] = pcfitplane(pc, maxDistance, referenceVector);
colorLabels(inPlanePointIndices) = greenIdx; pcWithoutGround = select(pc, outliers); % 找到与障碍物相关的点
radius = 10;
nearIndices = findNeighborsInRadius(pcWithoutGround, sensorLocation, radius);
nearPointIndices = outliers(nearIndices); colorLabels(nearPointIndices) = redIdx; %找到与本车相关的点
nearIndices = findPointsInROI(pcWithoutGround, selfCube);
vehiclePointIndices = outliers(nearIndices); colorLabels(vehiclePointIndices) = blackIdx; % 显示结果
view(player, pc.Location, colorLabels);
end

  这样你就可以看到连续的点云处理界面。

matlab 三维激光雷达点云的地面与障碍物检测的更多相关文章

  1. MATLAB三维散点图的绘制(scatter3、plot3)

    MATLAB三维散点图的绘制(scatter3.plot3) (1)函数scatter3 用法:scatter3(x,y,z,'.',c) % c 为颜色,需和x,y,z长度相同 例子: x=[422 ...

  2. matlab三维画图

    matlab三维画图主要有三个命令:plot3命令.mesh命令和surf命令. plot3 plot3是三维画图的基本函数,绘制的是最为主要的3D曲线图,最主要的调用格式是: plot3(X,Y,Z ...

  3. MATLAB三维作图——隐函数

    MATLAB三维作图——隐函数 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 对于三维隐函数,没有显式表达式,无法通过Matlab现成的3-D画图函数 ...

  4. segMatch:基于3D点云分割的回环检测

    该论文的地址是:https://arxiv.org/pdf/1609.07720.pdf segmatch是一个提供车辆的回环检测的技术,使用提取和匹配分割的三维激光点云技术.分割的例子可以在下面的图 ...

  5. 如何使用云效Flow做质量检测,保障高质量的交付速度

    使用云效Flow做质量检测,保障高质量的交付速度,云效「Flow」 提供代码扫描. 安全扫描和各种自动化测试能力,支持人工测试卡点.自动化验证卡点等多种质量红线,确保业务质量.云效流水线 Flow 流 ...

  6. Matlab三维绘图

    三维绘图 1 三维绘图指令 类 别 指 令 说 明 网状图 mesh, ezmesh 绘制立体网状图 meshc, ezmeshc 绘制带有等高线的网状图 meshz 绘制带有“围裙”的网状图 曲面图 ...

  7. matlab 三维绘制

    1. mesh(Z)语句 mesh(Z)语句可以给出矩阵Z元素的三维消隐图,网络表面由Z坐标点定义,与前面叙述的x-y平面的线格相同,图形由邻近的点连接而成.它可用来显示用其它方式难以输出的包含大量数 ...

  8. MATLAB三维曲面

    今天终于测试了,发下来第一张试卷中只会做一小题.我蒙了!!! 所以呢,我现在再做一下,总结总结! 作函数 f(x)=2(x1-1)4+2x22 的三维图. 这道题要用到的知识点有函数meshgrid. ...

  9. Matlab 三维绘图与统计绘图

    一. 三维绘图 p = : pi/: *pi; x = cos(p); y = sin(p); z = p; plot3(x,y,z) x = -:.:; %有-2为起点,2为递增步长,2为终止点 y ...

随机推荐

  1. 易爆物D305

    分析:典型的并查集,每一个物品合一看成一个独立的顶点,则一个简单化合物就是一条边,如果两个顶点x,y联通则说明有危险,所以可以用一个并查集来维护图的联通分量集合,并查集的详解有一篇写的很易懂的博客并查 ...

  2. c++算法实现(一) - 递归和初始化

    递归 写递归函数经常出错,提醒自己两个规则: 1. 一般来说递归函数中不应该出现for.while之类的循环语句, 因为递归就是循环的另外一种实现: 2. 注意基线条件,具体参考<算法图解> ...

  3. linux 分析java 线程状态

    将线程3117 的线程消息放到文件dump17中 jstack 13492 > dump17 分析线程 grep java.lang.Thread.State dump17 | awk '{pr ...

  4. my work

    Dad, what's your first job? How did you achieved?

  5. P3440 [POI2006]SZK-Schools(费用流)

    P3440 [POI2006]SZK-Schools 每所学校$i$开一个点,$link(S,i,1,0)$ 每个编号$j$开一个点,$link(i,T,1,0)$ 蓝后学校向编号连边,$link(i ...

  6. Guitar Pro里的渐强渐弱符号

    今天我们来介绍Guitar Pro里经常会用到的渐强渐弱符号,渐强和减弱符号是常用的强度记号,分别用来表示音量加强或者减弱的过程. 渐强符号是由两条相等长度的线组成,它们的左端相连,右端逐渐张开.这个 ...

  7. ECS之Git服务器搭建

    最简教程 ### . 安装Git 安装Git服务,命令如下: ```Shell $ yum install curl-devel expat-devel gettext-devel openssl-d ...

  8. java如何编写多线程

    1.如何实现多线程 1.1实现Runnable接口,实现run()方法. public class Main4 implements Runnable { public static void mai ...

  9. 关于layui富文本编辑器和form表单提交的问题

    今天下午因为要做一个富文本编辑器上传文件给后台,所以看了一下layui的富文本编辑器,折腾了半天,终于把这玩意搞定了. 首先需要先创建layui的富文本编辑器 <textarea id=&quo ...

  10. Flask Web框架

    Flask依赖两个外部库:Werkzeug和Jinja2.Werkzeug是一个WSGI(在Web应用和多种服务器之间的标准Python接口)工具集:Jinja2负责渲染模板.所以在安装Flask之前 ...