关于如何查找和利用PCL库学习资源的一些心得

前言

学习PCL库的两个月左右时间里,从刚开始的无从下手到慢慢地摸清一些门道,走了很多弯路,也遇到过很多困惑,逐渐有了一些如何查找与利用PCL库学习资源的心得。所以把这些心得记录下来,一是为了给自己以后学习PCL库和其他库时提供借鉴,而是希望为一些新上手的PCL库学习者提供一些思路。


学习工具

  • PCL库官网
  • 《点云库PCL学习教程2》
  • CSDN等博客论坛的教程博文
  • 一些外国学术团队的总结帖


一.PCL库官网

PCL官网做的算是很贴心和充实了(虽然博主目前了解的库并不多),深入挖掘之后会发现每个模块都藏龙卧虎,可能会有你说期待的资源。当然啦,如果PCL官网能够有个“Get starting”之类的指引教程就更好了,就不要新手自己去摸索“宝藏”藏在哪里了。下面,博主就按模块分别来介绍PCL官网里的“宝藏”。(还在挖掘中,难免有遗珠,读者请勘正。)


1.Homepage

首先,就是PCL官网的主页面了,相信也是读者们度娘“PCL”点击进去最常见的页面了。页面上的“About”、“News”、“Blog”、“Download”、“Media”、“Jobs”、“Documentation”、“Contact”、“GSoC'14”模块都有其独特的作用,后面会分别讲。

  • 页面中心部分的“What is it?”是对PCL的大体介绍,是“About”模块的缩略;
  • “Latest News Articles”是一些最新的新闻和下载版本(虽然版本还停留在1.7.1,),是“News”和“Download”模块的缩略;
  • “Active Code Sprints”是对一些参加“代码冲刺”项目(“代码冲刺”项目就是相关组织联合推动立体视觉项目开源进程的计划,各个参与的组织有专门的developer来各尽所长地填充新功能,让PCL库变得更加强大与完善)的合作组织的罗列,是“Blog”模块的缩略;
  • “Latest Job Posting”是一些PCL库所属公司的招聘信息,是“Jobs”模块的缩略;
  • “Quick Links”是一些快速链接,对于用户(Users)来说,主要有“API 文件”(与“Documentation”模块一样的入口)和“用户论坛”。对于开发者(Developers)来说,主要有“发展空间”、“Bug追踪”、“发展者论坛”。对于我们使用库的使用者来说,“发展空间”和“Bug追踪”这些比较低层的内容接触面不大(当然有深入研究的读者可以参看,博主还没到那阶段),“发展者论坛”问的也是比较偏向类设计、函数设计之类偏库整合的讨论信息。对于一般使用者,“API文件”可以点击“Documentation”模块进行查看,而“User 论坛”(User forum)确实是个不错的资源可以好好利用。下面对它进行进一步介绍。



2.User forum

点击Homepage中的“Users forum”之后,就会进入如下页面,是一些“Users mailing list”,是世界各地PCL库使用者在使用PCL库过程中遇到的问题的一些讨论。对于你遇到的问题,你可以在搜索框利用关键词索引的方式查找是否有相同的问题。该资源的优点是作为使用者,你遇到的坑别人可能踩过,他山之石,可以攻玉

目前,博主查到的几个有用的信息包括:

1.描述子用.setSearchSurface( )函数和用.setIndices( )函数实现的对部分点求解描述子的效果是一样的。但基于后一种索引的方式更加直观且可能省去法线重计算的问题,所以由用户在论坛提出这个问题。后来PCL库的开发者就加上了关键点的.getKeypointsIndices( )功能的实现来获取关键点在原始点云中的索引,方便带入下一步描述子的设置索引中。

2.在ISS关键点选取过程中的一些注意事项查询过程中,发现有用户给出的关于ISS特征点详细使用的链接,比Documentation中对ISS使用介绍的code snippet要详细(这个链接是指向把ISS在PCL库实现的作者的blog文章,在“Blog”模块中比较深的目录中,不太好找),从而让博主发现原来“Blog”模块也是个“大宝藏”,只是“Blog”模块的指引做得不是特别好。

3.在相关问题的问答中验证自己方法逻辑的正确性:比如基于特征点匹配的点云配准,从关键点选取,到描述子选取,到特征匹配,再到位姿变换估计方法,每个环节有多种对象可选,哪种对象或哪种组合比较高效,每种对象需要怎样的参数设置会有比较好的效果,怎样整合衔接才是正确合理的?这些问题也许都会在你搜索相关问题的过程中有意想不到的收获。

4.看见有些新手也对一些基础的问题感到困惑,你发现自己不是孤独的;看见论坛中有PCL的开发者及时回答使用者的问题并根据需求push新的功能,你发现会有安全感和见证感;看见互不相识的用户讨论同一个问题,大家集思广益,没有利益相关但慷慨相助,你会爱上开源社区的纯粹与小众的认同感。

当然,“用户论坛”的缺点也是很明显的,主要有两点:

  • “用户论坛”的活跃度并不高,许多问题下的问答不超过10条信息记录,有些甚至只有提问者孤零零的独角戏。
  • 链接速度特别慢,要缓冲好久才能跳转到相关问题的页面。
(如果读者知道哪里有更好的PCL用户使用交流论坛,记得留言告诉博主哈,比心。)



3.About

“About”模块是关于PCL库的大概介绍,包括它的起源、性质、架构、功能等等。



4.News

“News”模块介绍PCL库以及其组织近期开展的一些比较时新的工作内容



5.Blog

“Blog”模块是本质上是“PCL Developers blog”(PCL开发者模块)。由于PCL是一个开源项目,所以它由许多开发者,许多组着在“代码冲刺”(Code Sprints)项目的框架中,有着各自的开发者对新功能进行开发与实现(有些是算法原作者把算法在PCL框架下的实现,有些是非算法原作者对已有算法在PCL框架下的实现),然后整合到PCL库中。这个“Blog”模块就是记录这些开发者在开发新功能时的一些记录。这些记录一般有开发者对自己开发的功能的详细记录(通常会比Documentation和Tutorial里对该功能的介绍要详细一些),包括心路历程、功能较详细的介绍,与同类功能的测试与对比等等,这些都是比较有价值的内容(比如RoPS描述子、ISS关键点)。

但是,要找到具体某个Developer的博客入口可不是容易的事情,这也是“Blog模块”引导做的不好的地方。你首先需要知道你查找的功能在PCL库中是哪个Developer实现的,这个developer是属于“Blog”模块中“Code Sprints”(代码冲刺)项目中的哪个组织,点击相应的组织进去,然后查找到对应的developer的blog,里面应该就有它开发该功能的相关博客记录。

所以,推荐的查找流程是:

  • 明确自己想用的功能
  • 在Documentation - Namespace - pcl 中查找是否有该功能类的实现
  • 如果有,查看对应的documentation,看能否解决问题。
  • 如果documentation的使用案例不够详细,查看该功能的实现作者(一般在该功能的Brief descript简略介绍中有介绍作者)
  • 依次在“Blog”模块中的各个“Code Sprints”组织中查找是否有该作者。
  • 若找到该作者则在其博客中看看是否有更为详细的介绍。



[案例1-RoPS描述子]

下图是“RoPS描述子”功能在PCL库中实现的作者Sergey Ushakov的PCL博客,记录了相关的RoPS实现记录。

查找路径:“Blog”- “Code Sprints” - “HRCS” - “Sergey Ushakov”(当时博主是度娘“RoPS”找到的该主页)

网址链接http://184.154.22.163/blog/hrcs/sushakov/index.php



[案例2-ISS关键点]

下图是“ISS关键点”在PCL库中实现的作者Gioia Ballin的PCL blog中对ISS关键点的使用的详细介绍(比Documentaion中的介绍多了ISS-BE边缘剔除用法的介绍),在该博客中还有作者对ISS关键点与Harris3D以及NARF在不同数据集下的效果对比,得出的ISS关键点效果更好的结论。

查找路径:“Blog” - “Code Sprints” - “gsoc12”- “Gioia Ballin”(博主当时是在User forum中查看ISS使用方法的相关问题时看见有用户给出的这条链接)

网址链接http://www.pointclouds.org/blog/gsoc12/gballin/iss.php


当然,链接目录如此复杂,遍历所有组织找人名优点本末倒置的感觉,当然提前先度娘一下或者bing一下看看能不能找到也许是个更合理的选择。如果documentation已经能够解决你大部分的问题,足够用了,当然就不一定有必要去辛辛苦苦去寻觅那份可能存在的“源本密经”了。因人而异,各取所需


6.Download

“Download”模块是下载“PCL二进制版本”、“PCL源程序”以及“PCL logo”的地方。目前从此入口进去的Windows版本的PCL还停留在1.5.x和1.6.x上,所以不推荐下载。

如果需要下载比较新的版本,推荐到下面链接中下载:

PCL 1.8.0和PCL 1.8.1官方链接http://unanancyowen.com/en/pcl18/   (链接墙内可能进不去了)

PCL 1.8.0百度云链接http://pan.baidu.com/s/1c1sqoQO 

关于如何安装在Win8上安装PCL 1.8.0 AllInOne版本以及在VS2013上的相关配置可以参看博主先前的博文:

PCL-1.8.0-AllInOne VS2013 Win8 X64 安装配置及部分问题解决方法

如果想要最新版本,就去github/pcl fork吧,这个repository是实时更新的,用啥取啥。

github/pcl链接https://github.com/PointCloudLibrary/pcl



7.Media

“Media”模块也是一个“卧虎藏龙”之地。主要分为以下几个部分:

  • PCL的历史
  • PCL开发者与实习生关于PCL不同模块的Presentation
  • 社区的数据资源(包括PCL自己的数据,还有许多其他机构的数据,入口链接都已经按功能模块帮你分类列好了,真的很nice,是个大大的福利)
  • PCL提供的一些开源成品软件(即下即用,很实用)
  • PCL组织在历年一些计算机视觉领域会议的报告(里面有价值的信息很多,有对PCL的整体框架与模块设置的大概介绍,也有PCL在时新领域的工作结合等等)


下图就是PCL组织在“CGLIBS13”做得会议交流的记录页面。里面有当时对“PCL库”的整体框架以及几个重要模块的架构的介绍,对于刚接触PCL库的读者可以起到一个启蒙的作用



8.Jobs

“Jobs”模块就是PCL组织的招贤纳士啦。



9.Documentation

对于所有的库来说,“Documentation”都是最重头戏,PCL库当然也是一样。“悟Documentation者悟天下”。“Documentation”的主页面还是比较“和蔼可亲”的,有“Getting Started”之类的图文并茂的几个大的模块介绍

分别有:

  • filters
  • features
  • keypoints
  • registration
  • kdtree
  • octree
  • segmentation
  • sample_consensus
  • surface
  • recognition
  • io
  • visualization
  • ......



点击页面中的“API documentation”中的某个版本的API documentation链接,就正式开始“较深层的documentation攻坚之旅”啦。


以PCL1.8.1的API Documentation为例,有四个页面项

  • Main Page
  • Modules
  • Namespaces
  • Classes

这四个页面项中,Main Page主要是关于这个API Documentation的一些基本信息,关系不大;“Class”页面项下的分类很混乱,博主现在看得云里雾里所以用的不多。所以博主平时找某个API或者类的时候用三种方式比较多:

  • 直接在搜索框输入关键词进行搜索(查找所有类和函数)

PCL库的API Documentation提供搜索机制,所以最简单的方式就是在搜索框里输入要查的类或函数,然后回车就OK啦。正所谓“哪里不会点哪里”应该就是这样的吧。

缺点就是出来的结果是你搜索的关键词的超集或者超超集,对初学者并不是很友好,容易看得一头雾水而找不到自己真正想要的那个)


  • 利用Modules页面项(查找对应模块下的类和函数)

该页面项是按模块分类的(模块类型大致和上面说的几种差不多,有所补充)。如果用户知道自己查找哪方面的类或函数时,可以直捣黄龙在相应的模块里查找有没有你想要的Mr. Right。

(不过缺点就是有一些新加的功能没有加入到该模型下或者一些较小的分支孤零零地走丢了也没有包进来,难免就有遗珠了。所以就有了咱们下面的第三种方法:pcl大法好呀)


下图是在模块页面项中点击进入“registration”时的页面。有模块的知识概览,类介绍,函数介绍等等...



  • Namespace-pcl大法(查找所有pcl命名空间下的类与函数)

如果要说一种大而全且精确的类查找方法,没有遗珠的方法,那就是Namespace-pcl大法了。它可以查找所有定义在pcl命名空间里的类与函数,不会有遗珠。

查找路径:“Namespaces”-“pcl”-“按首字母顺序遍历查找”


以“pcl::RangeImage”类为例,在进入“Namespace”-“pcl”- class"RangeImage"(当然也有其他方式进入该类的参考页面)后,一般有如下几个模块(带括号的表示可能有可能无,加粗为重点项):

  • 公共类别(预定义)
  • 公共成员函数
  • (公共数据成员/属性)(隐私工作普遍好)
  • 静态公共成员函数
  • 静态公共数据成员/属性
  • 静态保护成员函数
  • 保护数据成员/属性
  • 静态保护数据成员/属性
  • 附加集成的成员
  • 细节介绍(包括Code Snippet、作者信息)
  • 成员定义文件(预定义)
  • 成员枚举文档
  • 重构&析构函数文档
  • 成员函数文档(上面成员函数的详细版介绍,有函数功能介绍,各个参数的介绍,以及在.hpp文件中定义的位置)
(P CL的文件功能分配为:.h文件进行(模板类)声明,.hpp进行(模板类)实现,.cpp文件进行模板类实例化/限定


如果以上三种方法还满足不了你“上下求索”的心,那就可以直接扎根到本地下载的PCL库或者github/pcl repository的相关“.h、.hpp、.cpp”文件中寻找你要的真相与真理啦。Enjoy it!


10.Tutorials

“Tutorial”是PCL库的二当家,按模块分类介绍了各个模块下的主要应用的教程示例。模块分类为:

  • Basic Usage
  • Advanced Usage
  • Applications
  • Features
  • Filtering
  • I/O
  • Keypoints
  • KdTree
  • Octrss
  • Range Images
  • Recoginition
  • Sample Consensus
  • Segmentation
  • Surface
  • Visualization
  • GPU

这是最原汁原味也是最可靠的官方教程,如果你想用的类与功能刚好是在Tutorial中存在的幸运儿,那你庆幸把然后好好专研吧。当然,有时候你想要的功能可能Tutorial里咋一看没有,但是“蓦然回首,那人竟在灯火阑珊处”。比如,在Tutorial-"Keypoints"模块里只有NARF关键字的教程,而你想找的是SHOT关键字的教程。等你读的书够多,走的路够多之后,发现一切都殊途同归。在Tutorial-"3D Object Recognition based on Correspondence Grouping"中在关键点查找环节中就是用的SHOT关键点,其中有相应的教程。

此外,Tutorial里或多或少有些理论背景介绍,也有相关的论文链接,想要深入研究或了解原理的读者不要放过哦。



11.Contact

“Contact”模块是与PCL组织联系的模块,当然你可以发一封邮件去感谢PCL组织的贴心和贡献



12.GSoC'14

“GSoC'14”模块可以理解为“手把手带你用PCL做项目”的模块。指导详细,资源充足,如果你是一个学习PCL且有充裕时间的萌新,可以通过这个模块建立你与PCL的友谊,增强你热爱编程世界的可能性



13.github/pcl

这里有实时更新的pcl库,有原汁原味的源代码,有各种各样的Issues等你参看,各种各样的Pull requests等着向你述说变迁的历史风雨。也许刚开始你是一个旁观者,感叹历史风雨变幻,英雄人物造实世,但你也会在参与着历史的创造中,无一例外。共勉!

另外,github上搜索pcl还会出现好多用户自己整合的“精而美”的pcl库,也行是pcl库的“轻装上阵”,也许是pcl的“DIY”,也许是pcl与其他库的“结合”,这些都可以给予我们参考价值。Smart is the new sexy.



由上可知,PCL库的官方资源的六个主要杀手锏是:

API Documentation -> Tutorials -> Media -> github/pcl -> Blog -> User forum.


二.《点云库PCL学习教程2》

诚然,《点云库PCL学习教程2》正如网上很多网友说的其实就是官方资料的汉化翻译而已

这本书的组织结构是按照PCL库的几个大体模块按章节分块编写的,每一章主要分为三个部分:

  • 模块背景知识/理论知识介绍(作者对该模块知识的理解与整理,是在PCL库基础上一个不错的补充
  • 模块中重要的类的API介绍(对应部分重要的API Documentation的汉化翻译)
  • 模块中的类的教程介绍(对应Tutorial的汉化翻译)


1.Theoretical primer

这部分主要有PCL的编程规范、架构介绍、模块的背景介绍、理论介绍、逻辑介绍等。

这部分是作者对该模块知识的理解与整理,是在PCL库基础上一个不错的补充




2.Classes Information

模块中重要的类的API介绍(对应部分重要的API Documentation的汉化翻译)




3.Tutorial

模块中的类的教程介绍(对应Tutorial的汉化翻译)



博主个人推荐是把PCL官网的“API Documentation”、“Tutorial”和《点云库PCL学习教程2》结合起来用效果会比较好。如果你需要用到某项功能,先去看原版的PCL官网的“API Documentation”、“Tutorial”获取最原汁原味的“第一感觉”,然后再去看《点云库PCL学习教程2》进行“中文亲切版收割”,其中还可以顺便收割一波“理论背景与整理”。先啃硬骨头,然后云里笑。


三.CSDN等博客论坛的教程博文

当然,度娘搜索目标功能的关键词,就能在CSDN、博客园等博客论坛上找到相应的教程博文。该类博文主要分为三种:

1.纯汉化PCL官网的Tutorial

这类博文主要就是对PCL官网上的Tutorial进行汉化与翻译,所以推荐有英文阅读能力的同学最好是PCL官网的原版Tutorial和汉化版的教程博文结合起来看比较好,这样一些细节的地方(比如参数)能够自己有所理解并及时勘误

2.功能的整合应用

这类博文把PCL官网中的Tutorial进行了整合。比如功能“A+B+C”的整合应用可以给你关于 API衔接环节参数设置的参考价值;

3.自己的工程实例

这类博文对PCL官网中的Tutorial进行了实例工程的应用。比如是“A”或“B”或“C”应用到某个具体工程领域,可以让你了解关于该方法在特定场景下的表现效果以及在特定场景下参数设置的经验。


四.一些外国学术团队的总结贴

国外的一些学术团队会针对自己的领域(比如:ROS、SLAM等)对PCL库进行重新的理解与教程编排,不乏一些很好的总结贴。如果说PCL库中的各个Tutorial是一个独立散落的珍珠,而这些针对某个领域大型应用的串联整理贴就是穿针引线而成的项链,不论领域是否相同,都会对你有所启发,比如如何对独立功能进行整合,不同选择选择对象的比较,各个环节的可视化等等。

最难得的是,在实现“全身运气”的前提下,还贴心整理出了每个环节相关的论文链接PCL-API Documentation链接PCL-Tutorial链接,真的很nice!

下面就是一个研究ROS领域的学术团队以“三维目标识别”的流程大框架把PCL库大部分功能串联起来详细分析的教程贴


网址链接:

http://robotica.unileon.es/index.php/PCL/OpenNI_tutorial_4:_3D_object_recognition_(descriptors)

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页