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 ...
随机推荐
- jq+bootstrap响应式系统管理页面
用bootstrap搭建的一个系统管理页面基于经典的HTML+Css 弊端:代码量太大,用vue组件化开发的思想更加便捷且方便!不过如果是做纯展示的系统页面,只需要一些简单的数据交互,用jq配合boo ...
- 利用Team@OSC进行团队协作开发平台
利用Team@OSC进行团队协作开发平台 Team@OSC介绍 Team@OSC 是一个团队协作开发平台,轻松管理轻量级团队.代码运行平台(PaaS).代码质量检查应有尽有. 链接:https://t ...
- html5与css3面试题(2)
10.xhtml与HTML的区别? Html是对web网页设计的语言,而xhtml是基于xml的置标语言 11.面向对象的引用方法分为几种? 内部写的 原型链引用的 12.什么是重载? 函数名相同,但 ...
- django2.2/mysql ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3
报错环境 python=3.6.5,django=2.2,PyMySQL=0.9.3 …… django.core.exceptions.ImproperlyConfigured: mysqlcl ...
- es7,es8
ES7新特性 ES7在ES6的基础上添加了三项内容:求幂运算符(**).Array.prototype.includes()方法.函数作用域中严格模式的变更. Array.prototype.incl ...
- 高版本mysql8.0解压版安装步骤
解压版安装操作官网下载: mysql-installer-community-8.0.12.0.msi如上操作: http://www.cnblogs.com/elfin/p/9429877.html ...
- Extundelete 数据恢复
Extundelete 数据恢复 “rm -rf /*” 是我们经常使用的命令,操作不慎全盘接蹦,从删库到跑路,身为过来人的我们都经历过rm带来的痛苦. 不要慌,当我们有了Extundelete就可以 ...
- 关于Hibernate 连接mysql不能自动建表的问题
最近看旧书,李刚那本<轻量级J2EE>在讲解hibernate的时候遇到一个问题,就是与mysql连接后,明明配置了自动建表,却老是建不了表,上网查了发现是方言的原因,到底什么是方言?这里 ...
- dnsmasq 设置自动获取主机名
A1_IP:192.168.164.145 A1# yum install dnsmasq -y A1# echo "addn-hosts=/etc/domains" >&g ...
- 图像旋转、伸缩的自写matlab实现
一.图像的旋转 今天的代码不是自己写的,缺少一些时间.但是认认真真推导了一下旋转的公式,代码的思想与原博博主一致,致敬! 愚以为,自己来实现图像旋转算法的关键点有二:其一,确定旋转后的图像边界.其二, ...