![点云库PCL从入门到精通](https://wfqqreader-1252317822.image.myqcloud.com/cover/632/31251632/b_31251632.jpg)
2.2 开发工程的建立与项目管理
2.2.1 Windows下建立编译链接PCL工程
在Windows下面建立编译链接PCL工程,读者可以参考2.1.1节中的测试安装是否成功来建立自己的工程,也可以通过手动添加所需的头文件和链接库等方式建立工程。因为PCL本身就是用CMake作为工程管理的工具,本书中所有实例都提供了CMakeLists文件,所以建议读者使用CMake来进行工程管理,自学CMake相关命令和宏定义,相信会非常受益于该工具。
2.2.2 ROS下建立编译链接PCL工程
1.如何在ROS环境下建立与编译基于PCL的模块
本节内容成功重现的前提是,读者已经按照2.1.2小节安装配置好了Ubuntu和ROS环境。
安装openni(编译案例需要,一般开发不是必须)
这里安装openni是由于后面案例需要使用到该软件包,一般PCL在ROS下的开发不需要该步骤。openni_camera 包是OpenNI 深度(+RGB)相机的 ROS 驱动程序。其中包括:Microsoft Kinect,PrimeSense PSDK,ASUS Xtion Pro 和 Pro Live,驱动程序发布原始深度,RGB和IR图像流。
该软件包为使用OpenNI标准的深度传感器提供ROS接口。这里使用的深度传感器为ASUS Xtion PRO Live。
安装ASUS Xtion PRO Live 的 ROS 驱动程序,首先安装 openni_camera 包(如图2-23所示)。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/32_01.jpg?sign=1739355679-CwEmElB4vyay9S2WPwjlUyCmsYEQTmYK-0-25a1e39cfd6094c54a872d67ff2e3cc5)
强烈建议通过openni_launch使用此软件包,该软件为openni_node生成的数据提供额外的RGB-D处理能力。安装openni_launch(如图2-24所示)。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/32_02.jpg?sign=1739355679-gFrLzDyHF6FUaVqWHafgcEqUy66Aa9uR-0-ac3d2bf42ad037c8659fb2598cdc4379)
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/33_01.jpg?sign=1739355679-TFTveJoeGCWotxzYbdPDlAuIE8kUkrvq-0-bef4a8030c04e9897074cc43cc0fccdb)
图2-23 安装openni camera 驱动模块
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/33_02.jpg?sign=1739355679-LSraPv4RUsoEYkgyHRcJiXssL8liLk0K-0-9866190887f0b58627db5b133e1921ea)
图2-24 安装openni launch模块
安装完毕后,在运行roslaunch openni_launch openni.launch命令启动OpenNI驱动程序时可能会出现以下错误。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/33_03.jpg?sign=1739355679-WpqqFWFgkzDlGpVxrYjHVeoJRNJVaP4A-0-8f06915cc4ff8ddc2bf6295fcc3907fd)
这时需要对/etc/openni/GlobalDefaults.int文件进行修改,将UsbInterface的值改为0、1或者2。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/33_04.jpg?sign=1739355679-5nAEUF3iiq0Z1kaUIhEf93jB5FNaWaFB-0-d528fbc6b1f52342f8e9c5512fa2b421)
运行roscore,重新运行roslaunch openni_launch openni.launch命令,打开rviz可实时显示Xtion PRO Live获取的点云信息,测试说明ROS下该设备使用正常,如图2-25所示。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/34_01.jpg?sign=1739355679-nuBCicijoC7ii88NvDoLG9SPesA0YOwU-0-0051f5a553bf72870c0094b7f5839321)
图2-25 测试roslaunch openni_launch openni.launch结果
创建PCL的 package
该小节参考http://wiki.ros.org/pcl/Tutorials,读者可以直接参考官方网站资料。
(1)首先切换到之前创建的catkin工作空间中的src目录下。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/34_02.jpg?sign=1739355679-FErtMkYQiJP606sOnP1VjpGmTwlY06Ck-0-e268651c1ea845f82515bcf15b67ede3)
使用catkin_create_pkg命令来创建一个名为my_pcl_tutorial的新程序包,这个程序包依赖于pcl_conversions、pcl_ros、std_msgs、roscpp和sensor_msgs。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/34_03.jpg?sign=1739355679-QLSqupG2rQ7qtWQiJANUfwABe9kPZh7i-0-1323e18213dd2ec4fba8b587820ebfef)
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/34_04.jpg?sign=1739355679-QWP1620bFJxlzr2UZYzH8WAsp2JjCb4j-0-2ab814ac5a17987807c06c29fce9db62)
(2)修改package.xml文件,添加下列语句,这里使用Gedit编辑器进行编辑。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/34_05.jpg?sign=1739355679-WsxbfRu6Vvy88EQqBCxBWvr7HyofAtAZ-0-933f6eef6fc18427230c68c3b92042a4)
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/34_06.jpg?sign=1739355679-LxBo7IeZXHLnOHmKgfU9E9HKrLLVql6k-0-c42c3a0d8a676e173ca1e58672233c5b)
使用<run_depend>标签,在后面的编译中可能出现以下错误,这时只需将标签改为<exec_depend>,就能成功编译。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/35_01.jpg?sign=1739355679-fYzufziEuAAjExbNX4afQiOwiSHXC0jz-0-94ae50fc0e669c1e79c36f0921bf3f41)
(3)创建一个名为src/example.cpp的空文件,并在其中粘贴代码,读者可以到下面的网址下载这个例子的源文件。
http://wiki.ros.org/pcl/Tutorials/hydro?action=AttachFile&do=view&target=example_voxelgrid.cpp
在这个例子中,我们使用PCL里面提供的下采样类库对PointCloud2进行下采样,从而显著减少输入数据集中的点数。本例中使用了ROS消息:sensor_msgs::PointCloud2,sensor_msgs/PointCloud2格式是ROS应用程序的首选。
代码主要分为三部分:加载点云(第9~19行)、处理点云(第20~24行)、保存输出(第25~32行)。由于代码片段中使用了ROS订阅者和发布者,因此我们可以忽略使用PCD格式加载和保存点云数据。第20~24行处理云,它们创建PCL对象,传递输入数据并执行实际计算。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/35_02.jpg?sign=1739355679-SVfw58IYu33iooCxP6IcokksZcJDNiqK-0-ec73bfb9f361178bed82c7bfd60e98f3)
(4)编辑新创建的包中的CMakeLists.txt文件,添加下列语句。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/35_03.jpg?sign=1739355679-YPB3Ds6Wqa4kjJN6qYSY7hVVee4Ks49P-0-c9e30a4899ae71b25ec2b6d740bdbeb8)
编译运行程序包
记得事先source你的环境配置(setup)文件,在Ubuntu中的操作指令如下。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/35_04.jpg?sign=1739355679-MvcBRhGGH2GUhTwlcvTm9etapX65hU39-0-ee11a354b3da648310aa0b73c2e26b0f)
使用 catkin_make进行编译。catkin_make 是一个命令行工具,它简化了catkin的标准工作流程。你可以认为catkin_make是在CMake标准工作流程中依次调用了cmake 和 make。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/35_05.jpg?sign=1739355679-Q7xddVZSb3XgpFmEw0YTX36ys9YE8sU7-0-5e5999357dd8d6aad5bdcada05d1ca04)
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/35_06.jpg?sign=1739355679-ZdNBtWiTMoKPAyOe2nk8caI9M4OcIDrz-0-cb73d818c3bf0ee343ca9d328b91a916)
注意,使用catkin,一定要确保在调用catkin_make后,并且在运行自己的程序前,已经source了catkin工作空间下的setup.sh文件。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/36_01.jpg?sign=1739355679-DNMVE9X3ijBxYxojHrxH2Mt04Zdza9Xg-0-99f168fdd35ed3d408ae3cfaa046114e)
否则,会出现下面的问题,找不到刚刚创建的package。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/36_02.jpg?sign=1739355679-iD48QgNY9FTJEVgxwITid5qe9Qf3xYOm-0-03d02be567d3a442d8f11d6c3db31977)
在单独的终端里运行如下代码。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/36_03.jpg?sign=1739355679-MW3L4Kox81notwJ2xxhEnJa6I3kaIAKt-0-cec47e55258e2f77143cbf22d46404d4)
然后在两个终端中分别运行以下命令。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/36_04.jpg?sign=1739355679-IDgXmbTl37i3QOLjq33bwk0020s6adBH-0-4a6f834cfa9be57cb252dcb8ef56ccf1)
运行rviz来可视化结果。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/36_05.jpg?sign=1739355679-eFlIZPXD7mQuvlsjSWMfVsC1S3wXXUR9-0-7628f1ae45632fe308a6fb1aefe6eaa6)
在打开的rviz中,添加“PointCloud2”显示。将Fixed Frame选择为camera_depth_frame(或任何适合你的传感器的frame),首先将PointCloud2的Topic选为/output,这时你会看到下采样后的点云。为了进行比较,可以将Topic 选为/camera/depth/points,来查看它下采样的结果,如图2-26和图2-27所示。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/36_06.jpg?sign=1739355679-gEiDNUu1yxFBxYh7fyEoTrAD4KVF66FY-0-64246ac7bcc823ae6cedaa52660c9933)
图2-26 下采样输出结果(topic选为/output)
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/37_01.jpg?sign=1739355679-SVFjGqumRqREVicUMF02BDl60kd9ThNu-0-92d7ee2e726feee5c22fc87a9e5fcea7)
图2-27 原始点云输出结果(topic选为/camera/depth/points)
2.ROS下使用Qt Creator作为IDE来提高开发效率
为了在ROS下提高开发效率,推荐读者选用IDE来进行开发,此处选择Qt Creator 来说明。读者可以选择插件ros_qtc_plugins来提高效率,但该插件在安装时会遇到需要对标准C++ 库进行升级的问题。
安装Qt Creator
Qt Creator 是全新的跨平台 Qt IDE(集成开发环境),可单独使用,也可与 Qt 库和开发工具组成一套完整的 SDK(软件开发工具包)。其中包括:高级 C++代码编辑器,项目和生成管理工具,集成的上下文相关的帮助系统,图形化调试器,代码管理和浏览工具。
请注意,我们只需使用命令安装Qt Creator软件包。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/37_02.jpg?sign=1739355679-sE4ruqY95JLTMwjJDZ6YHFh1wuVYopyZ-0-545b3d5224a3b85d1ef0ef5af7b5914e)
在安装过程中可能遇到Reading package lists...Error!问题,可以通过运行sudo rm/var/lib/apt/lists/*-vf命令来解决。
然后在终端运行如下代码。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/37_03.jpg?sign=1739355679-evdkpa20zxM63gJC8vuSZtuTsD1aY8LL-0-0569aee0d5ede22f2b2bd8ad51cdcf6b)
启动的Qt Creator如图2-28所示。
注意:Qt Creator应该在终端中启动,而不是双击软件图标。这是因为终端会提供.bashrc,其中包含ROS的环境设置。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/38_01.jpg?sign=1739355679-LQ8b4WTwkYS4UAexROTDK3x9q9VxOuml-0-9f40dcc2fb737a6483367a85c8909f48)
图2-28 命令行启动Qt Creator
用Qt Creator来管理catkin_make的项目
catkin_make是ROS项目管理的一个新的推荐的内置工具。正如我们所知,单个包文件被放在工作区目录的/src目录中。使用Qt Creator配置catkin工作区的关键步骤是打开/src根目录下的CMakeLists.txt文件。这里棘手的是,初始化的工作空间包含一个名为CMakeLists.txt的链接,它链接到ROS安装目录中的文件。为了避免Qt Creator打开该文件时出问题,我们必须将catkin_ws/src中的符号链接的 CMakeLists.txt 替换为实际文件,使用下面的命令,如图2-29所示。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/38_02.jpg?sign=1739355679-XKtv3ek7yFZD9XuK3JLurtDnRP0oZ0jO-0-df70f09e61d95404767686d56c4a35c9)
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/38_03.jpg?sign=1739355679-8DPZMH9Myyox0EKdtdrDiI9hV9aBxRji-0-b4979f6ea59664b20016582e51f5f19a)
图2-29 工作空间下的CMakeLists链接文件
下面就可以直接将一个catkin工作空间下的所有项目打开,使用Qt Creator的打开文件或项目命令,并选择 catkin 工作区的顶层 CMakeLists.txt(例如“catkin_ws/src/CMakeLists.txt”)。打开CMakeLists文件后,将工程build 目录配置为catkin_ws/build/,如图2-30所示。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/39_01.jpg?sign=1739355679-8JJU52uonimJ21jQYgMOT2DmkoiKFMFR-0-2d6c9f4a20b7167c64cc9fa2a977686e)
图2-30 配置工程build目录
在building settings中,将CMake参数声明如下,如图2-31所示。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/39_02.jpg?sign=1739355679-fynwdZC7hOH09CRvxf3MVvXsMKpOI7JP-0-caa625ac08541631d927783ceb11f0c8)
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/39_03.jpg?sign=1739355679-6Bp4AHMfTaLUIcTRLfDZP1yZFAjflnxc-0-e0fdba6fc6758ad8456062621b057906)
图2-31 CMake声明
右击项目目录并运行CMake,然后可以看到正在解析并列在项目管理面板中的所有源文件如图2-32所示。Qt Creator 无论以哪种方式创建工程文件,都会在工程文件所在目录自动生成后缀为.user 的用户配置文件,该文件主要保存此工程的配置信息(如:工程所在路径,编译代码时的一些错误信息)。单击Qt Creator侧边栏中的Build Project图标,编译程序。然后单击Qt Creator侧边栏中的绿色三角形图标,即可运行程序。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/39_04.jpg?sign=1739355679-mrQj6LP2dQZ7eaMJLV1BX7tvplebrIUG-0-ee9afb7b5793bd8017759f4c537e091f)
图2-32 成功用Qt Creator进行工程开发
至此,大家就可以使用IDE在ROS下面进行快速开发了。