主要内容

使用激光雷达地面飞机和障碍物检测

这个例子展示了如何处理三维激光雷达数据从一个传感器安装在车辆分割地平面附近,发现障碍。这可以促进可行驶的车辆路径规划导航。示例还显示了如何可视化流激光雷达数据。

创建一个调速发电机文件阅读器

在这个例子中使用的激光雷达数据记录使用调速发电机®HDL32E传感器安装在一辆汽车。建立了一个velodyneFileReader对象读取PCAP记录文件。

文件名=“lidarData_ConstructionRoad.pcap”;deviceModel =“HDL32E”;veloReader = velodyneFileReader(文件名,deviceModel);

读了激光雷达扫描

每个扫描激光雷达三维点云数据存储。有效地处理这些数据使用快速索引和搜索传感器处理管道的性能的关键。这个效率是实现使用pointCloud对象,它在内部使用k d树的数据结构来组织数据。

veloReader构建一个有组织的pointCloud对于每一个激光雷达扫描。的位置财产的pointCloud是一个M-by-N-by-3矩阵,包含的XYZ坐标点米。强度都存储在强度

%读扫描激光雷达数据ptCloud = readFrame (veloReader)% #好< NOPTS >
ptCloud = pointCloud属性:位置:[32 x1083x3单一]数:34656 XLimits: [-80.0444 - 87.1780] YLimits: [-85.6287 - 92.8721] ZLimits:[-21.6060 - 14.3558]颜色:正常:[][]强度:[32 x1083 uint8]

设置显示流点云

pcplayer可用于可视化流点云数据。设置车辆周围的地区显示通过配置pcplayer

%指定点云显示的局限性xlimits = 45 [-25];%米ylimits = 45 [-25];zlimits = 20 [-20];%创建一个pcplayerlidarViewer = pcplayer (xlimits ylimits zlimits);%定制球员轴标签包含(lidarViewer.Axes“X (m)”)ylabel (lidarViewer.Axes“Y (m)”)zlabel (lidarViewer.Axes“Z (m)”)%显示原始激光雷达扫描视图(lidarViewer ptCloud)

在这个例子中,我们将分段点属于地平面,自我车辆和附近的障碍。为标签设置colormap这些点。

%定义标签用于分割点colorLabels = [0 0.4470 - 0.7410;%标记点,指定为(R, G, B)0.4660 0.6740 0.1880;%地面点0.9290 0.6940 0.1250;%自我点0.6350 0.0780 0.1840);%的障碍点%为每个标签定义指标颜色。无标号= 1;颜色。地面= 2;颜色。自我= 3;颜色。障碍= 4;%设置colormapcolormap (lidarViewer。轴,colorLabels)

段自我车辆

激光雷达安装的车辆,和点云可能包含点属于车辆本身,如在屋顶或罩。了解车辆的尺寸,我们可以细分出点最接近的车辆。

创建一个vehicleDimensions对象存储车辆的尺寸。

vehicleDims = vehicleDimensions ();%典型车辆4.7 m×1.8 m×1.4 m

指定安装位置的激光雷达坐标系。车辆坐标系统集中在后轴的中心,在地面上,积极的X方向指向前方,积极Y向左边,Z和积极向上。在这个例子中,激光雷达是安装在顶部中心的车辆,平行于地面。

mountLocation = [vehicleDims。/ 2 - vehicleDims.RearOverhang长度,% x0,y %vehicleDims.Height];% z

段自我车辆使用helper函数helperSegmentEgoFromLidarData。这个函数段内的所有点自我定义的长方体。存储结构分割点

点=结构();点。EgoPoints = helperSegmentEgoFromLidarData (ptCloud vehicleDims mountLocation);

可视化的点云分割自我。使用helperUpdateViewhelper函数。

closePlayer = false;helperUpdateView (lidarViewer ptCloud,点,颜色,closePlayer);

段地平面和附近的障碍

从激光雷达数据以识别障碍,第一段地面飞机使用segmentGroundFromLidarData函数来完成这个。这个函数从组织的激光雷达数据段分属于地面。

elevationDelta = 10;点。GroundPoints = segmentGroundFromLidarData (ptCloud,“ElevationAngleDelta”,elevationDelta);%可视化分割地平面。helperUpdateView (lidarViewer ptCloud,点,颜色,closePlayer);

删除分属于自我地面车辆和飞机使用选择函数在点云。指定“OutputSize”作为“全部”保留组织性质的点云。

nonEgoGroundPoints = ~点。EgoPoints & ~ points.GroundPoints;ptCloudSegmented =选择(ptCloud nonEgoGroundPoints,“OutputSize”,“全部”);

接下来,段附近的障碍通过寻找所有点不属于地面或自我车辆自我一些半径内车辆。这个半径可以确定基于激光雷达的范围和感兴趣的领域进行进一步处理。

sensorLocation = (0, 0, 0);%传感器的中心坐标系统半径= 40;%米点。ObstaclePoints = findNeighborsInRadius (ptCloudSegmented,sensorLocation,半径);%可视化分割障碍helperUpdateView (lidarViewer ptCloud,点,颜色,closePlayer);

过程激光雷达序列

现在一个激光雷达扫描的点云处理管道布局,把这一切放在一起处理的顺序记录数据。下面的代码是缩短关键参数一直以来在前面的步骤中定义。在这里,没有进一步的解释使用的参数。

%倒带| veloReader |开始从一开始的序列重置(veloReader);isPlayerOpen = true;hasFrame (veloReader) & & isPlayerOpen%抓住下一个激光雷达扫描ptCloud = readFrame (veloReader);%段分属于自我的工具点。EgoPoints = helperSegmentEgoFromLidarData (ptCloud vehicleDims mountLocation);%段分属于地上飞机点。GroundPoints = segmentGroundFromLidarData (ptCloud,“ElevationAngleDelta”,elevationDelta);%去除分属于自我车辆和地平面nonEgoGroundPoints = ~点。EgoPoints & ~ points.GroundPoints;ptCloudSegmented =选择(ptCloud nonEgoGroundPoints,“OutputSize”,“全部”);%段障碍点。ObstaclePoints = findNeighborsInRadius (ptCloudSegmented sensorLocation,半径);closePlayer = ~ hasFrame (veloReader);%更新激光雷达显示isPlayerOpen = helperUpdateView (lidarViewer ptCloud,点,颜色,closePlayer);结束snapnow

万博1manbetx支持功能

helperSegmentEgoFromLidarData段分属于自我汽车车辆的尺寸和安装位置。

函数egoPoints = helperSegmentEgoFromLidarData (ptCloud vehicleDims mountLocation)% helperSegmentEgoFromLidarData段自我车辆从激光雷达数据点% egoPoints = helperSegmentEgoFromLidarData (ptCloud、vehicleDims mountLocation)%段vehicleDims分属于自我的维度从激光雷达扫描ptCloud %。激光雷达是安装在指定的位置%的mountLocation车辆坐标系。ptCloud是一个% pointCloud对象。vehicleDimensions vehicleDimensions对象。% mountLocation转换是一个向量指定XYZ的位置%激光雷达的车辆坐标系。%%这个函数假设激光雷达安装平行于地面%平面,用积极X方向指向前方的车辆,%积极Y方向指向左边的车辆%右撇子体系。%自我车辆周围的缓冲区bufferZone = (0.1, 0.1, 0.1);%在米%定义自我车辆限制车辆坐标egoXMin = -vehicleDims。RearOverhang bufferZone (1);egoXMax = egoXMin + vehicleDims。长度+ bufferZone (1);egoYMin = -vehicleDims。宽/ 2 - bufferZone (2);egoYMax = egoYMin + vehicleDims。宽度+ bufferZone (2);egoZMin = 0 - bufferZone (3);egoZMax = egoZMin + vehicleDims。身高+ bufferZone (3);egoXLimits = [egoXMin, egoXMax];egoYLimits = [egoYMin, egoYMax]; egoZLimits = [egoZMin, egoZMax];%转换为激光雷达坐标egoXLimits = egoXLimits - mountLocation (1);egoYLimits = egoYLimits - mountLocation (2);egoZLimits = egoZLimits - mountLocation (3);%使用逻辑索引选择自我车辆数据集内点egoPoints = ptCloud.Location (:: 1) > egoXLimits (1)& ptCloud.Location (:: 1) < egoXLimits (2)& ptCloud.Location (:: 2) > egoYLimits (1)& ptCloud.Location (:: 2) < egoYLimits (2)& ptCloud.Location (:,:, 3) > egoZLimits (1)& ptCloud.Location (:,:, 3) < egoZLimits (2);结束

helperUpdateView更新流点云显示最新的点云标签和相关的颜色。

函数isPlayerOpen = helperUpdateView (lidarViewer ptCloud,点,颜色,closePlayer)% helperUpdateView更新流点云显示% isPlayerOpen = helperUpdateView (lidarViewer ptCloud,点,颜色,closePlayers)%更新pcplayer lidarViewer中指定对象的新观点云ptCloud %。点结构中指定点是彩色的%的colormap lidarViewer使用指定的标签%结构体的颜色。closePlayer标志指示是否关闭% lidarViewer。如果closePlayer隐藏(lidarViewer);isPlayerOpen = false;返回;结束scanSize =大小(ptCloud.Location);scanSize = scanSize (1:2);%初始化colormapcolormapValues = 1 (scanSize,“喜欢”ptCloud.Location) * colors.Unlabeled;如果isfield(点,“GroundPoints”)colormapValues (points.GroundPoints) = colors.Ground;结束如果isfield(点,“EgoPoints”)colormapValues (points.EgoPoints) = colors.Ego;结束如果isfield(点,“ObstaclePoints”)colormapValues (points.ObstaclePoints) = colors.Obstacle;结束%更新视图视图(lidarViewer ptCloud。位置,colormapValues)%检查球员是否开放isPlayerOpen = isOpen (lidarViewer);结束

另请参阅

功能

对象

相关的话题