![点云库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=1739319679-RGuLqzpunuLBLqngMH8lH0A8PARBIeWm-0-01d86f12acd42e392ee7e4bdb8e0b8cc)
强烈建议通过openni_launch使用此软件包,该软件为openni_node生成的数据提供额外的RGB-D处理能力。安装openni_launch(如图2-24所示)。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/32_02.jpg?sign=1739319679-JG5p70SDreEuRQ3QLEeCL0ZXTE2QvxWq-0-70091f2adf574be19e1c4aba396ead7a)
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/33_01.jpg?sign=1739319679-n4dCRRtkRvAvEqqZgrp9AqAtdPSnedkK-0-cf32964d9dc57faf26091829fe3d336f)
图2-23 安装openni camera 驱动模块
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/33_02.jpg?sign=1739319679-Nh4fPbEdj5r3MRPgvjA8S3LIjIt30qC4-0-fb9a6cfc5db9894194cc518f7c0d2db7)
图2-24 安装openni launch模块
安装完毕后,在运行roslaunch openni_launch openni.launch命令启动OpenNI驱动程序时可能会出现以下错误。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/33_03.jpg?sign=1739319679-p7oQQGtpqpHSiZCkQETPKQIlmBWNNOUv-0-55863ff51d5776967209e66c8f0df2f7)
这时需要对/etc/openni/GlobalDefaults.int文件进行修改,将UsbInterface的值改为0、1或者2。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/33_04.jpg?sign=1739319679-KaJaTOTawYbIDwX2sD1IXWGkBdQLndP4-0-5ed8ab35dbe501b5c4d87d86210bfda0)
运行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=1739319679-WlGfptijhT6uU6EUbYbhxeCfZPpFJuam-0-2b3936a71a3ed7a46a7d478a5d460030)
图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=1739319679-VjWeVr9fUvoy66tH00rlFRWxF5dgVsNM-0-e69dfa0f6147ccf0c50516756d164745)
使用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=1739319679-jqWZG8Xs2mSMuMheh0T5fmwpPcS13iBe-0-48e0221f92ce8b018839b5a40a43901c)
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/34_04.jpg?sign=1739319679-aU9jFwCPFkVVP4NL1768DZqw2VZiswyx-0-f17a35c06b306646337257cd546c5a34)
(2)修改package.xml文件,添加下列语句,这里使用Gedit编辑器进行编辑。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/34_05.jpg?sign=1739319679-viIZmPgoZAzPLJE5kVTdCGfmG2pQvJza-0-981b44551811ccc1ea6d943b25c686cf)
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/34_06.jpg?sign=1739319679-96zvQsDgrLk97kwm94nUYEkKAU8LlEMK-0-99f523e55da793c1d7276b04bd670a7b)
使用<run_depend>标签,在后面的编译中可能出现以下错误,这时只需将标签改为<exec_depend>,就能成功编译。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/35_01.jpg?sign=1739319679-Qr24QOq4D0cmTtBNXzM0lPPRazCy1pbd-0-b03e8402539f9e4981f4fcf908781be7)
(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=1739319679-zj7SZxZ21yDtySxhraslSDvQImWzVuSi-0-a82819bac48df94043a441597f8c08d9)
(4)编辑新创建的包中的CMakeLists.txt文件,添加下列语句。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/35_03.jpg?sign=1739319679-qWJYvcnzlucoDcmboiRZ0FqmXLhMvQoB-0-69c3ce6f95389e236c20190a888cc8c6)
编译运行程序包
记得事先source你的环境配置(setup)文件,在Ubuntu中的操作指令如下。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/35_04.jpg?sign=1739319679-gKIUAgwtYXYrBWdcp5w8cYKfdgXz0wSG-0-dc314142ae0c7ce3eaddf34525337a37)
使用 catkin_make进行编译。catkin_make 是一个命令行工具,它简化了catkin的标准工作流程。你可以认为catkin_make是在CMake标准工作流程中依次调用了cmake 和 make。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/35_05.jpg?sign=1739319679-WZrTS3DrNxhoO6W9a4l12kchZhTrKXYQ-0-e48ef4a315d93859326a9e48e05bc80c)
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/35_06.jpg?sign=1739319679-bJrDNVz3zryhyoPSpCA4xrgbkD1YmDMy-0-6b8c9f287cb0b3910b70a016d34d267b)
注意,使用catkin,一定要确保在调用catkin_make后,并且在运行自己的程序前,已经source了catkin工作空间下的setup.sh文件。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/36_01.jpg?sign=1739319679-KRyKPE0k8BFW0McOZX4d674WaH28M8op-0-cf7b5745cee01be3527c58f0f3f22df6)
否则,会出现下面的问题,找不到刚刚创建的package。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/36_02.jpg?sign=1739319679-oqbZeo1mh8OaERD6yPOVCbz1GCxHk3IN-0-46a004a1c14a2bac55f1e224523c9b18)
在单独的终端里运行如下代码。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/36_03.jpg?sign=1739319679-srPbPd3Xft3PIivj1Xd5ZCqkFJQC3gqt-0-1c76375bf595a65c7d041adba88720a7)
然后在两个终端中分别运行以下命令。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/36_04.jpg?sign=1739319679-vWuIMGDC4xyPqVb89eWK7C7vmGCduXcA-0-e51cc36c4921a415beda4d438ac2bdf3)
运行rviz来可视化结果。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/36_05.jpg?sign=1739319679-xhp57C2ioaCGC7yjYzfqSh70a1Ou8iBc-0-dfa2d45db5ea548f9a9b65516311aa0b)
在打开的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=1739319679-OHVkaYvouoo5CYFokmZiPKNkx3L7zoeJ-0-2ecbc0c4e8a0cd1bf2f0a58a990d598b)
图2-26 下采样输出结果(topic选为/output)
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/37_01.jpg?sign=1739319679-Pd1feI0WyEenpiTPiFw7Dkk2fwbXFgpY-0-15978ec840be5477cf3f038b8515824f)
图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=1739319679-JqJyPRXE1fqmoc90geQGkhciaD9HJFIM-0-cbe6c808d45dcf7aede17f8c80b08dcb)
在安装过程中可能遇到Reading package lists...Error!问题,可以通过运行sudo rm/var/lib/apt/lists/*-vf命令来解决。
然后在终端运行如下代码。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/37_03.jpg?sign=1739319679-abFH0sbEclHsIqHAivCQeDPvMkGzGik8-0-9d97a35e56c800884b1c7080cc201ce2)
启动的Qt Creator如图2-28所示。
注意:Qt Creator应该在终端中启动,而不是双击软件图标。这是因为终端会提供.bashrc,其中包含ROS的环境设置。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/38_01.jpg?sign=1739319679-ZvfRvIEvGl6dI2pig4ZpCg2cEwhAlat9-0-cd14402b1d6d9150e5f814ad52b67f02)
图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=1739319679-s6WPCBBrkyztRTGJsiJfq1rMqhQcQZy2-0-72dddf86594264fa847ba6936b010369)
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/38_03.jpg?sign=1739319679-DYArNuBqe1pCqSAQ1w6hkUdD7OffjIfA-0-735008ffd552ebe693bf7386932acdf0)
图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=1739319679-TcztM8VryQxacEq4BOJn3HFg4A5ML26w-0-5e86c251b91bf25a9b96ffa825725f1d)
图2-30 配置工程build目录
在building settings中,将CMake参数声明如下,如图2-31所示。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/39_02.jpg?sign=1739319679-MQA899m24cwmIWY4UGJg7K5LutlnpXmv-0-b4e036a644f9d116eb00cff5af629679)
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/39_03.jpg?sign=1739319679-Tywh07IyX1iELh7RYS38SJO3HRFSUWF1-0-7c321a07e20ffdfdb9efaa332f1666e3)
图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=1739319679-7qj93TSI25Ig4hr07FyVtvuVCFHfTxeI-0-724556920942abf104f3d4aaa72da2d0)
图2-32 成功用Qt Creator进行工程开发
至此,大家就可以使用IDE在ROS下面进行快速开发了。