matlab实现点云累计-坐标系转换-目标范围点云提取(附代码与代码注释)(代码片段)

tsytian tsytian     2023-02-10     256

关键词:

  1. 主要流程介绍:由于单帧点云数据稀疏,通过点云累计方法,可将多帧点云数据配准为一帧;由于在本次实验时将激光雷达倾斜安装,激光雷达坐标系发生变化,为将其转换至倾斜前坐标,需进行坐标系的转换;最后将感兴趣区域内数据进行提取。
  1. 点云累计

原始pcap点云数据:

本次实验读取文件为VLP-16激光雷达采集的pcap文件,在matlab中可通过工具箱函veloReader = velodyneFileReader(filename,"VLP16")进行文件读取,再设定一个感兴趣区域roi,只对区域内的数据进行保存,减小计算量;通过indices_11,i = findPointsInROI(ptCloud_original1,i,roi);
ptCloud_interest1,i=select(ptCloud_original1,i,indices_11,i);对roi区域内的点云进行逐帧选择并保存至ptCloud_interest,将第一帧点云设置为参考点云,第二帧为待处理点云;对点云进行下采样处理,定义下采样网格大小与采样比例,通过fixed = pcdownsample(ptCloudRef, \'random\', percentage);moving = pcdownsample(ptCloudCurrent, \'random\', percentage); % 下采样,实现;通过matlab工具箱中的ICP函数tform=pcregistericp(moving, fixed, \'Metric\',\'pointToPlane\',\'Extrapolate\', true); % matlab自带ICP算法,得到moving点云至fixed点云之间的坐标转换矩阵tformptCloudAligned = pctransform(ptCloudCurrent,tform); % 将第2帧点云通过求得的坐标转换矩阵进行转换实现点云配准,得到待处理点云与参考点云之间的坐标转换矩阵,再通过坐标转换函数实现坐标转换。最后通过点云拼接函数将两帧点云进行拼接,则完成了第一帧点云与第二帧点云的累计。后续同样原理,只要求得后续每帧点云与第1帧点云的坐标转换关系,如第三帧点云与第一帧点云坐标转换矩阵为第三帧点云与第二帧点云转换矩阵乘以第二帧点云与第一帧点云转换矩阵。

点云累计前:

点云累计后:

filename= \'D:\\leidashuji\\LIDAR_0515\\01.pcap\'; %文件位置    
veloReader = velodyneFileReader(filename,"VLP16"); % 读取.pcap文件
ptCloud_original=cell(1,veloReader.NumberOfFrames); % 定义储存原始点云数据的元组
roi = [-20 20 -20 40 -4 1]; % roi区域筛选
num=60;
for i=1:num%veloReader.NumberOfFrames
ptCloud_original1,i=readFrame(veloReader,i); % 依次读取每次采样周期的数据,将其保存为pointCloud格式
k=1;
% 选择感兴趣区域
indices_11,i = findPointsInROI(ptCloud_original1,i,roi);
ptCloud_interest1,i=select(ptCloud_original1,i,indices_11,i);
end
ptCloudRef = ptCloud_interest1; % 将第1帧点云定义为参考点云
ptCloudCurrent = ptCloud_interest2; % 将第2帧定义为待处理点云
figure
pcshow(ptCloudRef)
%% 下采样
gridSize = 0.5; %定义下采样网格大小
percentage=0.5;
fixed = pcdownsample(ptCloudRef, \'random\', percentage);
moving = pcdownsample(ptCloudCurrent, \'random\', percentage); % 下采样
tform = pcregistericp(moving, fixed, \'Metric\',\'pointToPlane\',\'Extrapolate\', true); % matlab自带ICP算法,得到moving点云至fixed点云之间的坐标转换矩阵tform
ptCloudAligned = pctransform(ptCloudCurrent,tform); % 将第2帧点云通过求得的坐标转换矩阵进行转换
mergeSize = 0.025;
ptCloudScene = pcmerge(ptCloudRef, ptCloudAligned, mergeSize);
accumTform = tform; 
figure
hAxes = pcshow(ptCloudScene);
title(\'Updated world scene\')
%% 设置轴属性以更快地渲染
hAxes.CameraViewAngleMode = \'auto\';
hScatter = hAxes.Children; 
    for i = 3:num%length(ptCloud_original) % 依次检索没帧点云
        ptCloudCurrent = ptCloud_interesti;% 将第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
figure
pcshow(ptCloudScene) 
  1. 坐标转换:本次实验测得thetax= 23.46°,thetay =2°,thetaz = 0,代码中需转换为弧度格式

坐标转换后:

thetax = 23.46*pi/180;%
thetay =2*pi/180;
thetaz = 0;
rotx = [1 0 0; ...
      0 cos(thetax) -sin(thetax); ...
      0 sin(thetax)  cos(thetax)];
rotz=[cos(thetaz)  sin(thetaz) 0; ...
      -sin(thetaz) cos(thetaz) 0; ...
               0          0  1];
roty=[cos(thetay) 0 sin(thetay);
          0      1     0;
    -sin(thetay) 0 cos(thetay)];
trans = [0, 0, 0];
tform = rigid3d(roty*rotx*rotz,trans);
ptcloud_zuobiao=pctransform(ptCloudScene,tform);
figure
pcshow(ptcloud_zuobiao) 
  1. 路面范围提取:路面的roi区域为[-1 0.7 2 4 -2 -0.5],选择区域内数据进行保存,并将其ptCloud_road.Location(xyz坐标)写入lidar_15.csv文件中进行保存。

路面范围提取后:

roi = [-1 0.7 2 4 -2 -0.5]; % roi区域筛选
indices_2 = findPointsInROI(ptcloud_zuobiao,roi);
ptCloud_road=select(ptcloud_zuobiao,indices_2);
figure
pcshow(ptCloud_road)
csvwrite(\'lidar_15.csv\',ptCloud_road.Location )

matlab点云处理(二十六):将无序点云转换为有序点云(pcorganize),删除无效点(removeinvalidpoints)

文章目录1什么是点云?什么是无序点云?什么是有序点云?2将无序点云转换为有序点云3删除点云中的无效点(有序→无序)1什么是点云?什么是无序点云?什么是有序点云?点云是在同一空间参考系下表达目标空间分布和目... 查看详情

matlab点云处理(二十一):点云旋转平移(详细解读!)

文章目录1刚体运动变换基础知识1.1旋转矩阵1.2平移向量1.3坐标转换矩阵(旋转+平移)2坐标转换函数pctransform3代码实现1刚体运动变换基础知识刚体运动变换,即刚性变换,是指在三维空间中,把一个物体做... 查看详情

使用点云库将点云转换为世界坐标

...越来越难得到一个直接的答案。我需要将点云转换为世界坐标系。在转换之前,Z轴(kinect传感器)将指向对象,x轴指向底部,Y轴指向左侧。或任何其他方向的kinect传感器。变换 查看详情

pcl实现选框裁剪点云(代码片段)

PCL实现选框裁剪点云需求:在屏幕上点击画出多边形,裁剪对应框内的点云。实现:按"x"绘制多边形再按"x"裁剪实现算法来自PCL裁剪之多边形裁剪一、实现屏幕画线1.实现屏幕坐标转换至世界坐标/***@bri... 查看详情

点云格式转换:pcd点云转txt点云(xyzxyzixyzrgb)(代码片段)

...intXYZ)将pcd点云转为txt点云,只保留XYZ三维坐标信息代码实现:#include<pcl/io/pcd_io.h> 查看详情

3d点云目标识别和抓取

1、点云目标识别流程点云目标识别,顾名思义,需要有标准的目标点云或者标准的点云特征描述向量;对实时采集的点云数据,在里面寻找与目标点云相似度最高的点云块。 2、圆环工件的识别和抓取图2.1点云在XY平面的投... 查看详情

pcl实现选框裁剪点云(代码片段)

PCL实现选框裁剪点云需求:在屏幕上点击画出多边形,裁剪对应框内的点云。实现:按"x"绘制多边形再按"x"裁剪实现算法来自PCL裁剪之多边形裁剪一、实现屏幕画线1.实现屏幕坐标转换至世界坐标/***@bri... 查看详情

点云配准相关知识

...),将源点云(sourcecloud)变换到目标点云(targetcloud)相同的坐标系下。可以表示为以下的方程:其中就是targetcloud与sourcecloud中的一对对应点。而我们要求的就是其中的R与 查看详情

点云格式转换:las点云转txt点云(xyzxyzixyzrgbxyzrgbigpstime)(代码片段)

文章目录1las点云转txt点云(PointXYZ)2las点云转txt点云(PointXYZI)3las点云转txt点云(PointXYZRGB)4las点云转txt点云(PointXYZRGBIGpstime)5结果展示从las点云中读取字段信息(如XYZ),并将指定字段转换为txt点云。1las点云转txt点云(Poin... 查看详情

matlab怎么实现两个点云的配准

参考技术A对同一个地方进行多次扫面后,会有多个点云数据,然后将两个数据中同一点的点云进行匹配,也就是将两幅点云中相同点的点云放在一起 查看详情

3d,点云拼接2

...旋转平移变换矩阵,进而将待配准点云数据转换到统一的坐标系内,可以为精配准提供良好的初始值。常见粗配准算法:基于特征匹配(PFH)的配准算法:SAC-IA采样一致性初始配准算法(Sam 查看详情

点云格式转换:pcd点云转txt点云(xyzxyzixyzrgb)(代码片段)

文章目录1pcd转txt的方法2pcd点云转txt点云(PointXYZ)3pcd点云转txt强度点云(PointXYZI)4pcd点云转txt点云(PointXYZRGB)1pcd转txt的方法依次读取pcd点云坐标及强度、真彩等属性,并逐行输出到txt文本中。更多文件操作内容,请参考C++:... 查看详情

matlab点云处理(二十五):点云生成dem(pc2dem)

文章目录1什么是数字高程模型DEM2语法3数字地面模型DTM4数字表面模型DSM5参数说明5.1输入参数5.2Name-Value参数5.3输出参数6注意1什么是数字高程模型DEM数字高程模型(DigitalElevationModel,DEM):是一定范围内规则格网点的平面坐标(X... 查看详情

matlab点云处理(十九):点云合并(pcmerge)(代码片段)

文章目录1点云合并函数pcmerge2代码实现1点云合并函数pcmergepcmerge—合并两个点云语法:给定输入点云A和输入点云B,以及体素下采样的栅格边长gridstep,将合并结果保存到pcCloudMerge中ptCloudMerge=pcmerge(ptCloudA,ptCloudB,grid... 查看详情

点云配准的传统算法icp与ndt概述

...。什么是点云配准点云配准是指将多个点云数据集在相同坐标系下进行对齐的过程,使得它们在空间中具有一致的位置和姿态。在点云配准中,需要估计点云之间的转换关系,包括平移、旋转和尺度等变换。点云配准... 查看详情

pcl滤波采样——直通滤波

文章目录一、应用背景二、实现过程三、主要函数及代码实现1、主要函数2、核心代码3、效果实现四、参考文献一、应用背景1、卡出或者卡掉某一个维度取值在一定范围内的点,适合点云初步卡ROI区域;2、适合点云分布较分散... 查看详情

pcl滤波采样——直通滤波

文章目录一、应用背景二、实现过程三、主要函数及代码实现1、主要函数2、核心代码3、效果实现四、参考文献一、应用背景1、卡出或者卡掉某一个维度取值在一定范围内的点,适合点云初步卡ROI区域;2、适合点云分布较分散... 查看详情

急求用matlab显示点云数据

n*7的数据,前三列坐标,中间一列灰度值,最后散列RGB值,怎么显示出来?scatter3和trisurf都不好用啊参考技术A用scatter3,假设数据存在data里(n*7)scatter3(data(:,1),data(:,2),data(:,3),1,data(:,5:7));灰度值用不上,如果要的话就要转换,加到... 查看详情