ROS学习历程-6-PCL(PointCloud)学习记录(一)

这篇博文主要目的是记录关于ROS点云的一些学习过程,以及相关资料汇总。

第一部分:B站视频入门学习(https://www.bilibili.com/video/BV1JV411C7f3) 

一.关于点云的基本知识:

1. PCL功能:

  • 点云PCL库是一个开源库,主要用于对于三维物体的采集/滤波/重构/识别及分析等功能。

2. PCL库的网址:

  • 网址为:https://pointclouds.org/about/

3. 什么是点云数据?

  • 点云数据是用来采集多维度的物体信息,其中主要包含物体的XYZ三维坐标,以及物体的表面颜色信息。 XYZ+表面颜色信息组成了4D的点云数据。总结来讲,点云数据是4D的(XYZ+Color)(https://pointclouds.org/about/)

4.  PCL 主要软件包(Library)功能简介

                                                                                  ROS学习历程-6-PCL(PointCloud)学习记录(一)_第1张图片

  • 1.Filter(滤波):主要功能是将当前采集到的点云数据进行滤波;主要方法为:(1)对每一个点的附近点进行统计学分析,找到偏差过于大的点,并将其过滤掉;(2)对所有点进行高斯处理,并将离群点进行过滤。(与Sample Consensus/Kdtree/Octree相关联-依赖)
  • 2.Features(特征提取):这个功能包的主要功能是对点云数据进行特征提取。进行特征提取,主要是使用octree和KD-tree等方法。
  • 3.Keypoints(关键点):这个功能包主要作用是进行特征点的识别,其中主要包含两种算法。可以提取出稳定的/独特的-可被检测的特征点。
  • 4.Registration(点云配准):将多个数据集采集的数据汇总到同一个坐标系中,例如:使用两个激光雷达所采集到的数据,统一进行匹配,并且汇总到同一个坐标系下。核心思想是:辨别不同数据集中的点,并且找到特征点在不同数据集中的位置,一起他们的转换关系,以便于将两个激光雷达采集到的数据进行汇总使用。(例如:在同一个AGV上有两个激光雷达,用两个激光雷达采集同一个坐标系下的环境数据)--好处是:点云的精度增加+范围增加                                                                                     ROS学习历程-6-PCL(PointCloud)学习记录(一)_第2张图片

  • 5.kd-Treek-dimensional tree):是一个空间划分的数据结构,存储了一系列的K维点集合;并且使用一个树形结构将K维点进行存储;可以被用于进行高效的“一定范围内的点的搜索”和“最近临近点的搜索”,其中,临近点搜索是一个PCL库的核心方法。(efficient range searches and nearest neighbour searches)

  •                                                                          ROS学习历程-6-PCL(PointCloud)学习记录(一)_第3张图片

  • 6.octree:octree(八叉树)这个库使用点云数据,创建了一个分层树状数据结构(hierarchical tree data structure);可以实现spatial partitioning(空间划分)+downsampling(降采样)+特征值提取等。同时,octree这个库也包含了很多高效的附近范围的特征值搜索;例如:邻域本素搜索(Neighbors within Voxel Search),K邻域搜索K Nearest Neighbor Search‘等。

  •                                                                       ROS学习历程-6-PCL(PointCloud)学习记录(一)_第4张图片

  • 7.segmentation(分割):分割这个库主要包含了一系列的算法,可以用于将点云的数据进行分割;也就是将完整的点云数据分成很多小的块,然后对每个块进行处理。这个library尤其适用于处理有几个不同区域组成的点云数据。

                                           ROS学习历程-6-PCL(PointCloud)学习记录(一)_第5张图片ROS学习历程-6-PCL(PointCloud)学习记录(一)_第6张图片

  • 8.pcl_sample_consensus(采样一致性模块库): 这个库中包含了SAmple Consensus (SAC)方法,并且包含了了平面/圆柱体/球体等预设模型;可以将预设模型进行自由组合在点云中检测具有这些特征的数据。(包含:直线/平面/圆柱/球提等预设特征)。其中:平面拟合主要用于检测室内平面:墙/桌面/地板等模型;其他预设的模型可以被用来拟合其他的物品,例如使用圆柱拟合杯子等。

ROS学习历程-6-PCL(PointCloud)学习记录(一)_第7张图片ROS学习历程-6-PCL(PointCloud)学习记录(一)_第8张图片ROS学习历程-6-PCL(PointCloud)学习记录(一)_第9张图片

  • 8.Surface(平滑合成采样): 这个软件包的主要作用是,从3D扫描数据中,重建物体的表面。

           1. 可以用来将点云数据进行重新采样(resampling),尤其适用于表面噪声较大或者多次采样的情况。

           2. 与此同时,可以识别并提取出所扫描物品的表面法向信息。这个方法主要包含两个主要的算法:(1) Fast trangulation超快速三角划分 (2)Slowing meshing 用于进行表面平顺以及空洞(表面缝隙)填充。图1,2

          3. 同时,这个软件库也可以进行凹包络及凸包络线的绘制。图3

                                                                 ROS学习历程-6-PCL(PointCloud)学习记录(一)_第10张图片

  • 9. recognition(识别模块):主要用于进行对象的识别                                                          
  • 10. IO (输入输出模块库):主要用于读取PCD点云文件,以及连接一些点云相关传感器。
  •                                                            ROS学习历程-6-PCL(PointCloud)学习记录(一)_第11张图片                               
  • 11. Visualization(可视化模块):主要功能是,提供一个快速建立Prototype+算法结果的可视化工具,类似与OPENCV的highgui模块,可以生成2D的图片;可以用来设置渲染一些n-维-点云内容(颜色,尺寸等),同时也可以生成一些基本3D图形(原型,圆柱,球形等)。也可以生成直方图模式,需要基于VTK库进行3D渲染。
  •                                                                   ROS学习历程-6-PCL(PointCloud)学习记录(一)_第12张图片ROS学习历程-6-PCL(PointCloud)学习记录(一)_第13张图片
  • 12 Search(寻找):这个功能包可以被用来寻找最近的数据点:(JHU的project)
  • ROS学习历程-6-PCL(PointCloud)学习记录(一)_第14张图片

5.  PCL 软件库运行时候所需的依赖

   (需要已经安装的软件环境见链接:https://pcl.readthedocs.io/projects/tutorials/en/latest/compiling_pcl_posix.html#id2)

6. 一些较为有用的资源(持续更新)

  • PCL问题讨论论坛: http://www.pcl-users.org/

  • PCL github thread: https://github.com/PointCloudLibrary/pcl

  • PCL API+ Library: https://pointclouds.org/documentation/group__registration.html

7. 头文件存储位置:若在程序编译过程中提示找不到头文件等问题,可以在PCL官网上查找到该功能包的默认头文件存放位置,以PCL-Filter为例,网址为:https://pcl.readthedocs.io/projects/tutorials/en/latest/walkthrough.html#walkthrough

   Tips:一个简单的查找某一文件的存储位置指令:命令行:which+文件名即可

                          ROS学习历程-6-PCL(PointCloud)学习记录(一)_第15张图片

8.  PCL 较为常用的通用指令(https://pcl.readthedocs.io/projects/tutorials/en/latest/walkthrough.html#common

  • 8.1 PCL_viewer:用于查看PCD格式及VTK格式的点云文件。(下边链接中Binaries 内)https://pcl.readthedocs.io/projects/tutorials/en/latest/walkthrough.html#common
  • 8.2 PCL_viewer:中可以设置点云大小/点云颜色/多窗口等指令
  • 8.3 PCL_convert:能够将老版本PCD文件转化为新版本(pcd_convert_NaN_nan)。也能够将ASCII格式的PCD文件转化为binary文件,或者转换回去。(convert_pcd_ascii_binary)。同时也能够将点云数据进行压缩
  • 8.4 pcl_concatenate_points_pcd: 可以将两个点云文件合二为一。
  • 8.5 pcl_pcd2vtk: 可以将PCD文件转化为vtk文件。
  • 8.6 pcl_pcd2ply: 将PCD文件转化为ply格式。
  • 8.7 pcl_mesh2pcd: 可以将CAD 文件(.obj/ply)转化为pcd点云文件(之后可以将pcd文件再转化为别的文件)(注意!这个功能对于仿真非常有用)。这个指令可以将obj数模转化为pcd点云,以便在没有三维点云采集传感器的情况下,进行点云采集及处理! 下图中,上边的是原图,下边的是转化出来的点云。
  •                                      ROS学习历程-6-PCL(PointCloud)学习记录(一)_第16张图片
  • 8.8 octree_viewer: 通过八叉树方式打来点云数据.pcd文件。(注意在PCD浏览器中,可以看到有一些指令;这些指令可以增加/减少方格的密度及数量+显示原始点云等功能)

ROS学习历程-6-PCL(PointCloud)学习记录(一)_第17张图片

 

9.  PCL基本数据结构(https://pcl.readthedocs.io/projects/tutorials/en/latest/basic_structures.html#id11

在C++程序中,点云的基本数据类型为:pcl:PointCloud,其中包含若干不同的class,用于实现不同的点云功能,存储不同的点云数据。

基础概念:点云是否为Organized point cloud dataset?

          ->    Organized point cloud (经过整理的点云数据)

                有良好的数据结构,点云被分为很多的row和columns,每个点所在的行和列的信息都是已知的;

                不同点云之间的关系是已知的,可以节省运算资源,采用TOF技术的相机的输出点云是这个格式的。

          ->   Projectable point cloud  (未经处理的点云数据)

                未经处理的点云文件,此种类型的点云信息可以被认为是一坨(混杂在一起的数据;

                每个点的信息是由x,y组成的;采集原理是小孔成像原理,可以通过小孔成像算法计算出每个点的实际位置。

                小孔成像:u = f*x/z and v = f*y/z;(https://www.cnblogs.com/majiale/p/9293499.html)

9.1 :pcl:`width` (int)- 点云的宽度数据类型(每一行内几个点?)

cloud.width = 640; // there are 640 points per line
在point_cloud.h的头文件中,定义了cloud.width的数据类型是:
uint_32
\\这条语句用于设定:
\\ 1.在organized 的点云数据中,这条指令可以存储每一行中,包含有多少个点。
\\ 2.在未organized的点云数据中,这条指令可以存储在这个点云文件中,共包含了多少点(总点数)

9.2 :pcl:`width` (int)- 点云的高度数据类型(一共有多少行?)

*在organized 的点云中,可以设置长宽的具体数据*
cloud.width = 640; // Image-like organized structure, with 480 rows and 640 columns,
cloud.height = 480; // thus 640*480=307200 points total in the dataset

*在没有-organized 的点云中,由于在宽度方向已经存储了所有点的数量,因此在高度方向上,设置为1即可*
cloud.width = 307200;
cloud.height = 1; // unorganized point cloud dataset with 307200 points


*在point_cloud.h的头文件中,定义了cloud.height的数据类型是:uint_32
\\这条语句用于设定:
\\ 1.在organized 的点云数据中,这条指令可以存储点云文件中共有多少行(高度方向上)。
\\ 2.在未organized的点云数据中,这个指令设置为1 即可。
\\ 3.从上边的语句可以看到,不论采用什么样的方式,不论什么样的点云数据,总点数总是一样的(殊途同归)

9.3 :pcl:`width` (std::vector)- 储存/获取某一个位于XYZ位置的特定点的信息

pcl::PointCloud cloud;
std::vector data = cloud.points;

*在point_cloud.h的头文件中,定义了point的数据类型是vector(一个容器)
\\这条语句的含义:
\\ 当创建一个格式为pcl::PointCloud的对象时,其中包含了很多点云里面的点(XYZ格式的),所以当我们要采集cloud内部的一个点的信息时,我们可以直接创建一个vector的对象,然后从cloud的对象中存取相关点的信息。(待update)

9.4 :pcl:`is_dense` (bool) -点云是否有限?是否有无效点?

:pcl:`is_dense` (bool)

例子:
if (!cloud.isOrganized ())

*在point_cloud.h的头文件中,定义了is_dense的数据类型是bool
\\这条语句的含义:
\\ 判断一个点云是否是包含有有限个点?true
\\ 或者是否存在某个点的坐标包含 Inf/NaN 无线的值;false

9.5:pcl:`sensor_origin_` (Eigen::Vector4f)

      :pcl:`sensor_orientation_`

      包含相机位姿等数据,一般情况下不用

9.6: 注意! PointT类型:

      这个类型主要用于占位,PointT内已经包含了pointxyz,pointxyzi等类型,可以用后两个直接代替API中,PointT所在的位置。主要用来指带多种不同点云数据,减少复杂程度

 

10. 生成PCL 1.7 and PCL1.11官方文档在本地:https://www.bilibili.com/video/BV1ai4y1M7K3

11. 关联非默认安装位置的PCL库:若PCL库安装在非预设位置时,在编译使用PCL库的项目时,可能会出现找不到库的情况;具体方法详见链接中,Weird installations条目:(https://pcl.readthedocs.io/projects/tutorials/en/latest/generate_local_doc.html#generate-local-doc)

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(ROS学习历程,c++)