matlab 三维激光雷达点云的地面与障碍物检测
基于激光雷达的地面与障碍物检测
这个例子告诉我们如何去检测地平面并且找到三维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 三维激光雷达点云的地面与障碍物检测的更多相关文章
- MATLAB三维散点图的绘制(scatter3、plot3)
MATLAB三维散点图的绘制(scatter3.plot3) (1)函数scatter3 用法:scatter3(x,y,z,'.',c) % c 为颜色,需和x,y,z长度相同 例子: x=[422 ...
- matlab三维画图
matlab三维画图主要有三个命令:plot3命令.mesh命令和surf命令. plot3 plot3是三维画图的基本函数,绘制的是最为主要的3D曲线图,最主要的调用格式是: plot3(X,Y,Z ...
- MATLAB三维作图——隐函数
MATLAB三维作图——隐函数 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 对于三维隐函数,没有显式表达式,无法通过Matlab现成的3-D画图函数 ...
- segMatch:基于3D点云分割的回环检测
该论文的地址是:https://arxiv.org/pdf/1609.07720.pdf segmatch是一个提供车辆的回环检测的技术,使用提取和匹配分割的三维激光点云技术.分割的例子可以在下面的图 ...
- 如何使用云效Flow做质量检测,保障高质量的交付速度
使用云效Flow做质量检测,保障高质量的交付速度,云效「Flow」 提供代码扫描. 安全扫描和各种自动化测试能力,支持人工测试卡点.自动化验证卡点等多种质量红线,确保业务质量.云效流水线 Flow 流 ...
- Matlab三维绘图
三维绘图 1 三维绘图指令 类 别 指 令 说 明 网状图 mesh, ezmesh 绘制立体网状图 meshc, ezmeshc 绘制带有等高线的网状图 meshz 绘制带有“围裙”的网状图 曲面图 ...
- matlab 三维绘制
1. mesh(Z)语句 mesh(Z)语句可以给出矩阵Z元素的三维消隐图,网络表面由Z坐标点定义,与前面叙述的x-y平面的线格相同,图形由邻近的点连接而成.它可用来显示用其它方式难以输出的包含大量数 ...
- MATLAB三维曲面
今天终于测试了,发下来第一张试卷中只会做一小题.我蒙了!!! 所以呢,我现在再做一下,总结总结! 作函数 f(x)=2(x1-1)4+2x22 的三维图. 这道题要用到的知识点有函数meshgrid. ...
- Matlab 三维绘图与统计绘图
一. 三维绘图 p = : pi/: *pi; x = cos(p); y = sin(p); z = p; plot3(x,y,z) x = -:.:; %有-2为起点,2为递增步长,2为终止点 y ...
随机推荐
- WC.exe【C】
gitee传送门!!!(电脑打不开github,多次尝试未果,决定先用gitee存着先) 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序 ...
- 常用MSSQL语句
现在很少用SQL 写东西,但有时真用起来半天想不起来,看来还是有必要记录一下... 新建表: create table [表名] ( [自动编号字段] int IDENTITY (1,1) PRIMA ...
- ftp 上传和下载
ftp 下载 #!/bin/bash #auth liwei #date DATE=$(date -d today +%Y%m%d) #data files path SRCDIR=/home/web ...
- Python 计算当真因子个数为偶数个时为幸运数,计算区间内幸运数之和
晚饭后朋友发来个问题,正好无事做,动手写了一下 若一个正整数有偶数个不同的真因子,则称该数为幸运数.如4含有2个真因子为 1 和 2 .故4是幸运数.求[2,100]之间的全部幸运数之和. 常规思路 ...
- 哨兵2 NDVI
shp从国外网站下载的,不是很准确了 数据:COPERNICUS/S2 交流合作请联系:ab000c@163.com
- js开发环境配置
使用Sublime Text3作为主要开发工具.下载地址:http://www.sublimetext.com/3. sublime拥有大量实用插件,使用插件需要先下载PackageControl以便 ...
- github一些事
我的个人github地址是:https://github.com/BUGDuYu 我们开发团队小组的github地址是: https://github.com/APPdoctrine 资源推荐: gi ...
- 2、每日复习点--ConcurrentHashMap vs HashMap vs HashTable
HashMap:允许键或者值为null.底层是基于数组+链表的结构.默认初始容量是16,默认加载因子是0.75F,默认扩容增加一倍.如果指定了初始容量n,n必然在(2x,2x+1]范围内,n经过运算所 ...
- VMware install MikroTik RouterOS
1 download the vmdk from Mikro Tik official website 2 create a new vmware host with use an exited vm ...
- SQL-递归查询在Ora与Mssql
今天在工作中,有同事“请教”从 Sql Server 移植数据到 DM DB 的改写问题,本以为难度不大,结果发现 Sql Server 数据库的语法.架构上,与 Oracle / DM 数据库差异还 ...