主要内容

使用2-D LIDAR的碰撞警告

此示例显示了如何使用2-D LIDAR数据检测障碍物和警告可能的碰撞。

概要

物流仓库正越来越多地在自动导航车辆(AGV)上安装二维激光雷达,以实现导航目的,这是由于传感器的可承受性、远程和高分辨率。传感器辅助碰撞检测是复杂环境下agv安全导航的重要任务。这个例子展示了如何表示一个充满障碍物的机器人工作空间,生成2-D激光雷达数据,检测障碍物,并在即将发生碰撞前提供警告。

创建仓库地图

要代表机器人工作区的环境,请定义abinaryoccupancymap.(导航工具箱)包含仓库的平面图的对象。占用电网中的每个单元格都具有逻辑值。占用位置表示为1,并且可以使用占用信息来表示占用信息来生成合成的2-D LIDAR数据。

在地图上靠近AGV指定路线的地方添加障碍物。

%创建二进制仓库地图并将障碍放在定义的位置地图= helperCreateBinaryOccupancyMap;%可视化障碍物和AGV的地图图显示(地图)标题('仓库平面图与障碍和agv'%将AGV添加到地图上姿势= [5 40 0];Helperplotrobot(GCA,姿势);

图中包含一个坐标轴。以“带障碍物的仓库平面图”和“AGV”为标题的坐标轴包含2个类型为image、patch的对象。

模拟二维激光雷达传感器

使用A模拟2-D LIDAR传感器rangeSensor对象收集生成的地图的LIDAR读数。加载包含AGV的预定义航点的MAT文件进入工作区。使用模拟的LIDAR传感器返回AGV的姿势的范围和角度读数,然后使用范围和角度来生成一个lidarScan包含2-D LIDAR扫描的对象

%模拟激光雷达传感器,设置探测角度为[-pi/2 pi/2]激光雷达= rangeSensor;激光雷达。= [-pi/2 pi/2];%设置传感器可检测范围的最小值和最大值,单位为仪表lidar.range = [0 5];AGV移动的%加载航点加载waypoints.mattraj = waypointsMap;选择一个路径点来可视化扫描数据升高= traj(350,:);%生成激光雷达读数[范围,角度] =激光雷达(锻炼,地图);存储和可视化二维激光雷达扫描扫描= LIDARSCAN(范围,角度);绘制(扫描)标题(“自我观”)Helperplotrobot(GCA,[0 0锻工(3)]);

图中包含一个坐标轴。标题为Ego View的轴包含两个类型为line, patch的对象。

设置可视化

设置一个图形窗口,显示AGV在仓库中的移动,相关的激光雷达扫描环境,在鸟瞰图中以填充的圆圈显示障碍,以及用颜色编码的碰撞警告信息。每个警告所使用的颜色表示碰撞的可能性,该可能性基于障碍物在该路径点所占据的检测区域。

%设置显示显示= HelperVisualizer;%绘图仓库映射在显示窗口中hrobot = plotbinarymap(显示,地图,姿势);

基于区域的碰撞警告

只有当障碍物落在AGV的探测区域内时,才会出现碰撞警告。

定义检测区域

使用不同颜色,形状和修改图GUI的颜色区域区域创建自定义可检测区域。运行以下部分的代码并修改多边形手柄以适应您对检测区域的要求。下面的代码创建了3个多边形处理的半圆形区域,半径为5,2,1,2,1,AGV位于[0 0]。修改半径或更改多边形对象以创建自定义检测区域。

figure detAxes = gca;标题(两家,定义检测区域的)轴(瓦皮斯,[-210 -2 4])Xlabel(脱瓦,'x')ylabel(瓦皮斯,“Y”)轴(两家,“平等”)栅格(瓦皮斯,'次要')t = linspace(-pi / 2,pi / 2,30)';%指定颜色值 - 白色,黄色,橙色,红色颜色= [1 1 1;1 1 0;1 0.5 0;1 0 0];%指定半径以米为单位半径= [5 2 1];%创建一个多边形类型的3x1矩阵detareahandles = repmat(images.roi.polygon,[3 1]);pos = [cos(t)sin(t)] *半径(1);pos = [0 -2;POS(14:17,:);0 2];DetareaHandles(1)= DrawPolygon(......“父”两家,......“InteractionsAllowed”'重塑'......“位置”,pos,......“StripeColor”“黑”......“颜色”颜色(:));Pos = [cost sin(t)] * radius(2);Pos = [0 -1.5;: pos (19);0 1.5);detAreaHandles (2) = drawpolygon (......“父”两家,......“InteractionsAllowed”'重塑'......“位置”,pos,......“StripeColor”“黑”......“颜色”颜色(:));Pos = [cost sin(t)] * radius(3);Pos = [0 -1;: pos (21);0 1];detAreaHandles (3) = drawpolygon (......“父”两家,......“InteractionsAllowed”'重塑'......“位置”,pos,......“StripeColor”“黑”......“颜色”、颜色(4:));暂停(2)%暂停以加载检测区域窗口

要保存创建的检测区域,请运行helperSaveDetectionArea函数。使用轴柄的图形与检测区域的多边形相关联DetareaHandles.变量作为输入参数。该函数以数据类型矩阵的形式输出检测区域uint8.,和一个边界框。检测区域周围的蓝色矩形表示边界框。

Axesdet = GCA;包含多边形手柄的图形窗口的%轴[Detarea,Bbox] = evermeravedetectionArea(Axesdet,DetareaHandles);

图中包含一个坐标轴。具有标题定义检测区域的轴包含4型对象的Images.roi.polygon,图像。

%通过缩放颜色使检测区域透明%alphadata = double(detarea〜= 0)* 0.5;AX3 = GetDetectionAleaaxes(显示);H = ImageC(AX3,[BBOX(1)(BBOX(1)+ BBOX(3))],......-  [bbox(2)(bbox(2)+ bbox(4))],......detarea);Colormap(AX3,颜色);%绘图检测区域plotobstacledisplay(显示)

运行仿真

检测区域分为三个级别为:红色,橙色和黄色。每个区域与特定程度的危险相关联:

  • 红碰撞迫在眉睫

  • 橙色:碰撞几率高

  • 黄色-采取谨慎措施

不在检测范围内的障碍物距离AGV的安全距离。这些是碰撞警告所涉及的主要步骤:

  • 模拟2-D LIDAR并提取点云数据。

  • 将点云数据分段为障碍物集群。

  • 环行每个障碍物以检查可能的碰撞。

  • 根据危险水平发出警告。

  • 显示靠近AGV的障碍物。

移动AGV通过航路点对于ij = 27:size(traj, 1) currentPose = traj(ij,:);

模拟2-D LIDAR和提取点云数据

使用模拟传感器收集地图的LIDAR读数。从WayPoints文件中加载AGV的当前姿势。用来rangeSensor你创建的对象来获得距离和角度测量。

检索激光雷达扫描[范围,角度] =激光雷达(函第回文,地图);扫描= LIDARSCAN(范围,角度);%储存2-D扫描作为点云车= scan.Cartesian;Cart (:, 3) = 0;电脑= pointCloud(购物车);

将点云数据分段为障碍物群集

用来pcsegdist函数将扫描点云分段为集群,使用点之间的最小欧几里德距离作为分割标准。

基于欧几里得距离将点云分割成簇Mindistance = 0.9;[标签,numflusters] = PCSegdist(PC,Meadistance);

使用地图和扫描数据更新可视化窗口

%更新显示地图UpdateMapDisplay(显示,Hrobot,函第消息);%绘图2-D LIDAR扫描plotlidarscan(显示,扫描,函样(3));%删除最后一次扫描到下一个扫描行的障碍如果存在('sc''var'删除(sc)清晰SC.结束

循环在每个障碍物上找到碰撞的可能性

通过基于其标签循环通过群集,以提取位于它们内部的点。

附近=零(numflusters,2);maxLevel = -inf;%循环通过PC中的所有集群对于i = 1:numClusters c = find(labels == i);障碍物的%xy坐标提取xy =个人电脑。位置(c, 1:2);

将每个障碍的世界位置转换为相机坐标系。

%转换为归一化坐标系(0->最小检测位置%面积,1->检测区域最大位置)a = [xy(:,1)xy(:,,2)]  -  repmat(bbox([1 2]),[尺寸(xy,1)1]);b = repmat(bbox([3 4]),[尺寸(xy,1)1]);XY_ORG = A./B;%坐标系(0,0) - >(0,0),(1,1) - >(宽度,高度)的滴度IDX =楼层(XY_ORG。* REPMAT([尺寸(DELAREA,2)尺寸(DELAREA,1)],[尺寸(XY_ORG,1),1])));

提取位于检测区域的障碍点的指标。

%提取物仅作为索引的索引中的曲线坐标ValididX = 1 <= IDx(:,1)&1 <= IDX(:,2)&......IDX(:,1)<=尺寸(detarea,2)和Idx(:,2)<=尺寸(Detarea,1);

对于每个有效的障碍点,在检测矩阵中找到相关的值。检测矩阵中所有相关点的最大值确定该障碍物所代表的危险程度。基于障碍物的危险水平显示彩色圆圈警告的颜色显示窗口的窗格。

%围绕索引,从Detarea获得每个障碍的水平COLS = IDX(VANVIDIDX,1);Rows = IDX(Valididx,2);级别=双(Detarea(Sub2ind(尺寸(DECARAEA),行,COL))));如果〜isempty(级别)级别= max(水平);MaxLevel = Max(MaxLevel,Level);xyinds =查找(valididx);xyinds = xyinds(级别==级别);%获得了检测区域中最近的障碍坐标附近(我,:) = Helpernearobstacles(XY(Xyinds,:));别的找出障碍物在集群中最近的坐标nearxy(i,:) = helperNearObstacles(xy);结束结束%显示表示危险级别的警告颜色。如果是%障碍物不落在检测区域内,不显示颜色。开关maxlevel%红地区案例3 Circledisplay(显示,颜色(4,:))%橙色区域案例2个circledisplay(显示,颜色(3,:))%的黄色区域案例1个circledisplay(显示,颜色(2,:))%默认情况否则circleDisplay(显示、[])结束

显示最接近AGV的障碍点

由于仓库中的障碍物大多是线性的,并且是长的,所以只显示每个障碍物群中最接近AGV的点。障碍物显示为填充的圆圈鸟瞰图显示窗口的窗格。

对于我= 1:numClusters如果在坐标轴的范围内存在障碍显示sc(i,:) = displayObstacles(display, nearxy(i,:)); / /显示障碍物结束updateDisplay(显示)暂停(0.01)结束

图碰撞警告显示包含UIPanel类型4轴和其他对象。带有标题仓库平面图的轴1包含4型图像,贴片,线。带有标题2-D激光扫描的轴2包含2个类型的线,贴片。带有标题显示障碍的轴3包含3个类型图像的对象,散射。这些对象代表AGV,障碍物。轴4包含类型散射的对象。

图碰撞警告显示包含UIPanel类型4轴和其他对象。带有标题仓库平面图的轴1包含686型图像,贴片,线路。带有标题2-D激光扫描的轴2包含2个类型的线,贴片。带有标题显示障碍的轴3包含3个类型图像的对象,散射。这些对象代表AGV,障碍物。轴4包含类型散射的对象。

金宝app支持文件

helperCreateBinaryOccupancyMap创建机器人工作区的仓库地图

函数地图= helperCreateBinaryOccupancyMap ()% helperCreateBinaryOccupancyMap创建一个指定的仓库映射%分辨率作为binaryoccupancimap的参数传递map = binaryOccupancyMap(100, 80, 1);Occ = 0 (80, 100);Occ (1,:) = 1;Occ (end,:) = 1;Occ ([1:30, 51:80], 1) = 1;Occ ([1:30, 51:80], end) = 1;Occ (40, 20:80) = 1;Occ (28:52, [20:21 32:33 44:45 56:57 68:69 80:81]) = 1;Occ (1:12, [20:21 32:33 44:45 56:57 68:69 80:81]) = 1;Occ (end-12:end, [20:21 32:33 44:45 56:57 68:69 80:81]) = 1;%设置占用物的占用值SetoCcupancy(地图,OCC);在地图的特定位置添加障碍。输入%HelperAddobstacle是障碍宽度,障碍和障碍物。Helperaddobstacle(地图,5,5,[10,30]);Helperaddobstacle(地图,5,5,[20,17]);Helperaddobstacle(地图,5,5,[40,17]);结束%helperaddobstacle将占用率的障碍增加了障碍函数Helperaddobstacle(地图,障碍宽,障碍,障碍物,障碍物位置)值=(障碍,障碍物);SetoCcupancy(地图,ropactle划分,值)结束

另请参阅

binaryoccupancymap.(导航工具箱)|lidarScan|rangeSensor|pcsegdist