![点云库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=1738840140-j1wntLu38vymA3Zzt3fbsU3jw22uMPzg-0-728072d39fd03e9cffcfc8fb3865612f)
强烈建议通过openni_launch使用此软件包,该软件为openni_node生成的数据提供额外的RGB-D处理能力。安装openni_launch(如图2-24所示)。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/32_02.jpg?sign=1738840140-CgmALdTeBTxiSbR7JdXNLsnkuUHqHo7l-0-d46c40a6a6621ed0b4f2d21f3a082e04)
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/33_01.jpg?sign=1738840140-pD3kt41F5CM8xNykQRTQNUOYjFW0nEpU-0-7c30bc613cab3c34a5baa662ec5cdb78)
图2-23 安装openni camera 驱动模块
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/33_02.jpg?sign=1738840140-1nDkWiNUPtgXmLJiAMQ23OXpH1EoQRsN-0-23aa4b290e0962f8e86fd5830a2e80f8)
图2-24 安装openni launch模块
安装完毕后,在运行roslaunch openni_launch openni.launch命令启动OpenNI驱动程序时可能会出现以下错误。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/33_03.jpg?sign=1738840140-HRc92yGiX9xbw8875RVPq4TsKsrsoUuV-0-f89b218af9714abca3c375e50a0f7fc3)
这时需要对/etc/openni/GlobalDefaults.int文件进行修改,将UsbInterface的值改为0、1或者2。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/33_04.jpg?sign=1738840140-TqF9EfqElR6mZEXC2yqVBSgfCZmbquip-0-afc32e3c46e197b1eb951bda1584936c)
运行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=1738840140-pCaIO1xCg12ctzYYhL0i6p9wj0j7HzTk-0-e53561b4aeb80f678574f0597d579671)
图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=1738840140-cGmpQLSHh741JvUQD1Jv5gZlhrjBVK76-0-244a29709fee1efd5174a04118991dda)
使用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=1738840140-0sOuCbKd4JB6T00jkdLvodNShTGQACvj-0-1adc77d20ad1e44e6ac3bc890bd0890d)
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/34_04.jpg?sign=1738840140-AgEIuthOLA5gJebC5MAu5kh8JLsc8Y36-0-33faf0a52e8c4be4c39313058a5e6984)
(2)修改package.xml文件,添加下列语句,这里使用Gedit编辑器进行编辑。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/34_05.jpg?sign=1738840140-cQRMuukgykbdt1yVwgEUeAjRfZk1He16-0-77ab5741a6b3031354b6b3faa31b4f7b)
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/34_06.jpg?sign=1738840140-f4UecNqQmigHBRWRlsttK47MmQDflsX3-0-7643d7d4c42b3077df3592c1be87097e)
使用<run_depend>标签,在后面的编译中可能出现以下错误,这时只需将标签改为<exec_depend>,就能成功编译。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/35_01.jpg?sign=1738840140-GHpXurxHPZlbTCVKy9Fr0W8BcHFQTsJH-0-5c525b3663686dc5aee87d03560026ce)
(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=1738840140-C4ltPUfIgPY5CHffgaAqD6Feq3maE3lE-0-812b942211b5b768f0ada1d3fc449f99)
(4)编辑新创建的包中的CMakeLists.txt文件,添加下列语句。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/35_03.jpg?sign=1738840140-REKhY0R4Wpb8eeuZdhxjgsBWrBJiX6gD-0-5de7f5536900df337ef08bd4fbb02c36)
编译运行程序包
记得事先source你的环境配置(setup)文件,在Ubuntu中的操作指令如下。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/35_04.jpg?sign=1738840140-bQgvZcTg9pcBw4cSXDWaVIdpEnK1p4Wq-0-cc141f045479b533996fcac8e8cd8fdb)
使用 catkin_make进行编译。catkin_make 是一个命令行工具,它简化了catkin的标准工作流程。你可以认为catkin_make是在CMake标准工作流程中依次调用了cmake 和 make。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/35_05.jpg?sign=1738840140-WgTHvcCrVwWRKfauPSz0oMve44atfX1c-0-d694f1be2d2fcc181b95243f4b32baa2)
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/35_06.jpg?sign=1738840140-u161sVrNtccmBkN9LdSXVFaIVkcFyplK-0-d5ff39290b7aa2065671cd13c181ae49)
注意,使用catkin,一定要确保在调用catkin_make后,并且在运行自己的程序前,已经source了catkin工作空间下的setup.sh文件。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/36_01.jpg?sign=1738840140-7BFE1c6lM7SQTIE1y2TmcvZhlQlgwpHu-0-b80485bf94cc525e7b4d64c2dc43ae16)
否则,会出现下面的问题,找不到刚刚创建的package。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/36_02.jpg?sign=1738840140-LPHtaNDK6fJCSJGAUg1O7ULDG1RJiY9r-0-8278d1d473e3c29e1d5af412568271da)
在单独的终端里运行如下代码。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/36_03.jpg?sign=1738840140-7pLqEdoJxLIP9uiujXgxIYRHq7EhnhTP-0-56f3a55fc8049f47d6cb25aabd1b7b86)
然后在两个终端中分别运行以下命令。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/36_04.jpg?sign=1738840140-K29GfdbMjAJ4i4AD9BKgkdrMPNNYsRbi-0-1eb70a44cff456b2a7ecbb0bd96e6ea1)
运行rviz来可视化结果。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/36_05.jpg?sign=1738840140-ZFn9lj43IESYlX5LCAN1HiKbrqTDtWmK-0-fd53aa8c738e01c7385626de389ecc91)
在打开的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=1738840140-C8Sz7HUVa3Vd9CvlkKUQKghmSXG4qO1V-0-a99f9fdce81382bfb7e74c30f0f0942f)
图2-26 下采样输出结果(topic选为/output)
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/37_01.jpg?sign=1738840140-Rh4bpXq8mlRFvZANlCZgtJ7Famh1iDOv-0-54b0d4a40d62205b5cf9b46b1d5b2dfa)
图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=1738840140-jJgKRJPRYOuq3W5jJb7SXaW9qWdf8tkw-0-688aa90d9d9ed883514b59d7205b6d5b)
在安装过程中可能遇到Reading package lists...Error!问题,可以通过运行sudo rm/var/lib/apt/lists/*-vf命令来解决。
然后在终端运行如下代码。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/37_03.jpg?sign=1738840140-SqXWBYpA7HAaZMWQhIJMZ7X2P78ZRzVG-0-789f820a9d1954767e4608acca5d29e9)
启动的Qt Creator如图2-28所示。
注意:Qt Creator应该在终端中启动,而不是双击软件图标。这是因为终端会提供.bashrc,其中包含ROS的环境设置。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/38_01.jpg?sign=1738840140-obYRZDNljSMMUvW3NuacFd0QoKLuXJ5G-0-f3879ef077608f0089e37b530df39f4a)
图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=1738840140-W62HN79exJnjX7KDmBpRAcBjmuXrccIW-0-75ca286835566322e492797ff141fe39)
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/38_03.jpg?sign=1738840140-ai6BEk9jE9wJPhM03puueXO5yFtzppaL-0-5edc2aae7eedb5aaaea5b52e72fbbf2d)
图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=1738840140-28DTnRWiuPUopzGXoYAD6GZzECaJHiVr-0-4dbf3598697585f1974a3f431d974d61)
图2-30 配置工程build目录
在building settings中,将CMake参数声明如下,如图2-31所示。
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/39_02.jpg?sign=1738840140-uauxSqBfuyY3LuZxJq1B7PntvK0PLTtQ-0-c2ae7c6c7e96b2eb6b33deb43e6c7700)
![](https://epubservercos.yuewen.com/606CEF/16923816805017206/epubprivate/OEBPS/Images/39_03.jpg?sign=1738840140-inEDqE8uWK2xiCDWkrKGXPwk4Hs9tGVE-0-7aea5ee6c6f07c9c52d11fd3c355de33)
图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=1738840140-EriYZicOqDhpYallrmVm5tGoVqXJQFwT-0-13f4326bf29861873e6bff2daa83f6eb)
图2-32 成功用Qt Creator进行工程开发
至此,大家就可以使用IDE在ROS下面进行快速开发了。