点云配准文献阅读与简单实现
文献阅读
文献1
一. Deep learning-based dynamic object classification using LiDAR point cloud augmented by layer-based accumulation for intelligent vehicles
基于深度学习的基于 LiDAR 点云的动态对象分类,通过基于层的累积来增强智能车辆
背景:由于点云数据的稀疏性,无法提供检测目标足够的形状信息,因此难以应用深度学习方法进行分类
基于深度学习的点云分类方法:
-
将3D点云转换为2D投影
-
将点云转换为体素
-
直接输入点云信息
前两种方法在转换过程中会有信息缺失
文章主要内容
1.点云累积方法
点云配准算法
**迭代最近法iterative closest point (ICP)获取不同时刻同一目标物体点云刚性坐标转换矩阵
ICP算法原理:
2.点云分类实验设计
采用CAD软件创建分类物体分段3D模型,通过激光雷达实际采集的其它树木等无关数据作为负样本进行训练,在KITTI数据集上对训练的数据进行验证。
文献2
**二. LIDAR based detection of road boundaries using the density of accumulated point clouds and their gradients **
基于 LIDAR 的道路边界检测使用累积点云的密度及其梯度
仅采用扫描至路面的4根扫描线数据,通过累积方法,实现道路边界的提取
1. 点云累积方法
假设车辆行进速度为50KM/h,激光雷达扫描频率为50HZ,则车辆每前进0.29m,车辆会获取一次点云数据,文章将每4次扫描数据作为一个输入帧,计算获取坐标转换关系。
实现效果如下所示:红色为当前激光扫描数据,白色为之前累积数据
验证
1 数据说明
点云累积方法实际原理类似于多帧合成的方法,主要在于得到两帧点云之间的坐标转换关系,通过坐标转换,可以将多次对同一目标物体的扫描结果合成一帧,而上述文献中通过点云配准方法得到两帧点云之间的坐标转换关系,典型的方法便是ICP。如图所示为采集数据的路线图
2 代码实现过程
-
读取velodyen VLP16激光雷达采集的pcap文件数据
filename= 'D:\matlabwenji\lidar_pcap\a1.pcap'; %文件位置 veloReader = velodyneFileReader(filename,"VLP16"); % 读取.pcap文件 ptCloud_original=cell(1,veloReader.NumberOfFrames); % 定义储存原始点云数据的元组 for i=1:veloReader.NumberOfFrames ptCloud_original{1,i}=readFrame(veloReader,i); % 依次读取每次采样周期的数据,将其保存为pointCloud格式 end
-
读取前两帧激光雷达采集数据,以第一帧点云数据作为参考,通过ICP得到第二帧到第一帧数据的坐标转换矩阵.此外,为减少ICP过程中的点云计算量,提升提高特征匹配准确率,需对原始点云进行下采样,即对点云数据量进行减少
ptCloudRef = ptCloud_original{1}; % 将第1帧点云定义为参考点云 ptCloudCurrent = ptCloud_original{2}; % 将第2帧定义为待处理点云 %% 下采样 gridSize = 0.1; %定义下采样网格大小 fixed = pcdownsample(ptCloudRef, 'gridAverage', gridSize); moving = pcdownsample(ptCloudCurrent, 'gridAverage', gridSize); % 下采样 tform = pcregistericp(moving, fixed, 'Metric','pointToPlane','Extrapolate', true); % matlab自带ICP算法,得到moving点云至fixed点云之间的坐标转换矩阵tform ptCloudAligned = pctransform(ptCloudCurrent,tform); % 将第2帧点云通过求得的坐标转换矩阵进行转换 mergeSize = 0.015; ptCloudScene = pcmerge(ptCloudRef, ptCloudAligned, mergeSize);
-
假设以第一帧点云坐标作为全局参考坐标,重复上述步骤,即可完成整个过程的点云累积
accumTform = tform; mergeSize = 0.015; ptCloudScene = pcmerge(ptCloudRef, ptCloudAligned, mergeSize); figure hAxes = pcshow(ptCloudScene, 'VerticalAxis','Y', 'VerticalAxisDir', 'Down'); title('Updated world scene') % 设置轴属性以更快地渲染 hAxes.CameraViewAngleMode = 'auto'; hScatter = hAxes.Children; for i = 3:length(ptCloud_original) % 依次检索没帧点云 ptCloudCurrent = ptCloud_original{i};% 将第i帧数据赋值给待处理点云 ptCloudCurrent fixed = moving; % 将前一帧的移动点云作为后一帧点云的参考点云 moving = pcdownsample(ptCloudCurrent, 'gridAverage', gridSize);% 将待处理点云作为移动点云 % 应用CIP算法得到moving到fixed的坐标转换矩阵 tform = pcregistericp(moving, fixed, 'Metric','pointToPlane','Extrapolate', true); % 通过当前转换矩阵乘以前面累积的转换矩阵,得到当前帧转换至第一帧的坐标转换矩阵 accumTform = affine3d(tform.T * accumTform.T); ptCloudAligned = pctransform(ptCloudCurrent, accumTform); % 更新全局累积的点云数据 ptCloudScene = pcmerge(ptCloudScene, ptCloudAligned, mergeSize); hScatter.XData = ptCloudScene.Location(:,1); hScatter.YData = ptCloudScene.Location(:,2); hScatter.ZData = ptCloudScene.Location(:,3); end % 可视化 pcshow(ptCloudScene, 'VerticalAxis','Y', 'VerticalAxisDir', 'Down', ... 'Parent', hAxes) title('Updated world scene') xlabel('X (m)') ylabel('Y (m)') zlabel('Z (m)')
-
运行结果 .
-
结果分析
采用该方法能明显的提高点云密度,甚至能较为清晰的看到地面上的斑马线、转弯标识等交通标识,但配准所需时间太长