点云配准文献阅读与简单实现

文献阅读

文献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 代码实现过程

  1. 读取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
    
  2. 读取前两帧激光雷达采集数据,以第一帧点云数据作为参考,通过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);
    
  3. 假设以第一帧点云坐标作为全局参考坐标,重复上述步骤,即可完成整个过程的点云累积

    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)')
    
  4. 运行结果 .


  5. 结果分析
    采用该方法能明显的提高点云密度,甚至能较为清晰的看到地面上的斑马线、转弯标识等交通标识,但配准所需时间太长

posted @ 2022-06-03 16:56  嶽过山丘  阅读(242)  评论(0编辑  收藏  举报