此示例显示如何通过分割地平面并找到附近的障碍物来处理安装在车辆上的传感器的3-D激光雷达数据。这可以促进车辆导航的可行驶路径规划。该示例还显示了如何可视化流式激光雷达数据。
创建VelodyneFileReader
使用安装在车辆上的Velodyne HDL32E传感器记录该示例中使用的激光雷达数据。设置velodyneFileReader对象以读取记录的PCAP文件。(都是matlab数据内部)
fileName = 'lidarData_ConstructionRoad.pcap' ;
deviceModel = 'HDL32E' ;
veloReader = velodyneFileReader(fileName,deviceModel);
阅读激光雷达扫描
激光雷达数据的每次扫描都存储为3-D点云。使用快速索引和搜索有效地处理这些数据是传感器处理流水线性能的关键。使用pointCloud对象实现此效率,该对象使用Kd树数据结构在内部组织数据。
为每个激光雷达扫描veloReader组织的构造pointCloud。该Location属性pointCloud是M-by-N-by-3矩阵,包含以米为单位的XYZ坐标。点强度存储在Intensity。
ptCloud = readFrame(veloReader)%#ok <NOPTS>
构造点云图,返回一个结构体
ptCloud =
pointCloud with properties:
Location: [32×1083×3 double]
Color: []
Normal: []
Intensity: [32×1083 double]
Count: 34656
XLimits: [-80.0444 87.1780]
YLimits: [-85.6287 92.8721]
ZLimits: [-21.6060 14.3558]
Location: [32×1083×3 double] 一共32×1083个点 每个点的坐标有xyz三个
接着 进行点云图显示
该pcplayer可用于可视化流点云数据。通过配置设置车辆周围的区域以进行显示pcplayer。
% Specify limits of point cloud display
xlimits = [-25 45]; % meters
ylimits = [-25 45];
zlimits = [-20 20];
% Create a pcplayer
lidarViewer = pcplayer(xlimits, ylimits, zlimits);
% Customize player axes labels
xlabel(lidarViewer.Axes, 'X (m)')
ylabel(lidarViewer.Axes, 'Y (m)')
zlabel(lidarViewer.Axes, 'Z (m)')
% Display the raw Lidar scan
view(lidarViewer, ptCloud)
发现问题 出的点云图显示并不是网站上的 仿佛丢失了一角
在这个例子中,我们将分割属于地平面,自我车辆和附近障碍物的点。设置颜色图以标记这些点。
Ego points就是自我车辆的点(自我点)
% Define labels to use for segmented points
colorLabels = [...
0 0.4470 0.7410; ... % Unlabeled points, specified as [R,G,B]
0.4660 0.6740 0.1880; ... % Ground points
0.9290 0.6940 0.1250; ... % Ego points
0.6350 0.0780 0.1840]; % Obstacle points
% Define indices for each label 为每个标签定义索引
colors.Unlabeled = 1;
colors.Ground = 2;
colors.Ego = 3;
colors.Obstacle = 4;
% Set the colormap
colormap(lidarViewer.Axes, colorLabels)
不知道为什么RGB保存成了浮点数 存疑
划分自我车辆
激光雷达安装在车辆的顶部,并且点云可以包含属于车辆本身的点,例如在车顶或车顶上。知道了车辆的尺寸,我们可以分割出最接近车辆的点。
创建vehicleDimensions用于存储车辆尺寸的对象。
vehicleDims = vehicleDimensions(); %典型车辆4.7米乘1.8米乘1.4米
在车辆坐标系中指定激光雷达的安装位置。车辆坐标系以后轴的中心为中心,在地面上,正X方向指向前方,正Y指向左侧,正Z指向上方。在该示例中,激光雷达安装在车辆的顶部中心,平行于地面。
mountLocation = [ ...
vehicleDims.Length / 2 - vehicleDims.RearOverhang,... %x
0,... %y
vehicleDims.Height];
使用辅助功能分割自我车辆helperSegmentEgoFromLidarData。该函数分割由自我车辆定义的长方体内的所有点。将分段点存储在结构中points。
points = struct(); 创建一个结构体
points.EgoPoints = helperSegmentEgoFromLidarData(ptCloud,vehicleDims,mountLocation);
closePlayer = false;
helperUpdateView(lidarViewer, ptCloud, points, colors, closePlayer);
这时发现一个问题 未定义函数helperSegmentEgoFromLidarData
在文档末尾定义了这个函数:
略 反正找文尾就行
出现新问题 无法执行赋值,因为此类型的变量不支持使用点进行索引。
问题在
colors.Unlabeled = 1;
colors.Ground = 2;
colors.Ego = 3;
colors.Obstacle = 4;
结果第二天来搞 发现自己好了…也不知道怎么解决的
以上则划分了自我车辆
继续
elevationDelta = 10;
points.GroundPoints = segmentGroundFromLidarData(ptCloud, 'ElevationAngleDelta', elevationDelta);
为了识别激光雷达数据中的障碍物,首先使用该segmentGroundFromLidarData功能对地平面进行分段以实现此目的。此功能根据有组织的激光雷达数据对属于地面的点进行分段。
再次发现问题 这个
segmentGroundFromLidarData函数未定义
其实只需要点击网页中的链接即可获得一条指令,复制到命令行即可获得一条帮助