在自己的工程文件中使用 PCL

在上一篇文章中我们介绍了如何在 Ubuntu16.04 安装 PCL 点云库,本期我们接着学习如何在自己的工程代码中使用点云库吧。

由于 PCL 本身就是用 CMake 构建的,所以小编在这里推荐大家也使用 CMake 来构建自己的PCL 项目。


示例代码

如下是一个代码文件示例,展示了如何使用 PCL 里被广泛使用的 Voxel Grid 滤波器。

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>

int main (int argc, char** argv)
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);

    // 加载点云文件,这里用的是 pcd 格式。你也可以用别的点云格式文件,但要记得修改头文件哦
    pcl::io::loadPCDFile<pcl::PointXYZ> ("XXX.pcd", *cloud);

    // 打印输出在滤波之前点云里有多少个点
    std::cout << "PointCloud before filtering: " << cloud->width * cloud->height << " data points " << std::endl;

    pcl::VoxelGrid<pcl::PointXYZ> vg;      // 创建滤波器对象 vg
    vg.setInputCloud (cloud);              // 输入点云
    vg.setLeafSize (0.01f, 0.01f, 0.01f);  // 设置 voxel 的尺寸,这里 voxel 的长宽高都是 1cm
    vg.filter (*cloud_filtered);           // 把滤波之后的点云保存到 cloud_filtered

    // 打印输出在滤波之后点云里有多少个点
    std::cout << "PointCloud after filtering: " << cloud_filtered->width * cloud_filtered->height << " data points " << std::endl;

    return 0;
}

把这个 cpp 文件单独放到一个文件夹里,然后在这个文件夹里再创建一个文件,文件名称为 CMakeLists.txt(注意哦~这个文件名称不可以随意更改,少一个字母都不行)


CMake 设置

在 CMakeLists 文件里写进如下内容

cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
project(MY_PCL_PROJECT)
find_package(PCL REQUIRED COMPONENTS common io)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
add_executable(voxel_grid_test main.cpp)
target_link_libraries(voxel_grid_test ${PCL_LIBRARIES})

接下来解释 CMakeLists 文件里的内容

cmake_minimum_required(VERSION 2.6 FATAL_ERROR)

这一句话对于 CMake 来说是必须的,表明了本工程所需的 CMake 最低版本是 2.6

project(MY_PCL_PROJECT)

这一句话设置了工程的名字为 MY_PCL_PROJECT(工程名字随便取,但最好做到见名知意)

find_package(PCL REQUIRED COMPONENTS common io)

这一句寻找 PCL 相关的包

REQUIRED 意味着如果 CMake 找不到 PCL 相关的包,那么构建将会失败,即表明 PCL 相关的包是一个必须项

COMPONENTS 表示只需要 PCL 里 common 和 io 这两个子模块

如果你想把 PCL 里所有的模块都找到,那就这样写

find_package(PCL REQUIRED)

为了让 CMake 寻找到 PCL 的头文件,需要以下三句

include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

然后,让 CMake 生成一个可执行的二进制文件,需要以下这一句

add_executable(voxel_grid_test main.cpp)

意思是,生成的可执行二进制文件名字叫做 voxel_grid_test(在 Windows 系统下会有个 exe 的后缀,在 Ubuntu 等Linux 系统下是没有后缀名的),后面跟着 c++ 源代码文件

最后一句

target_link_libraries(voxel_grid_test ${PCL_LIBRARIES})

把我们生成的可执行二进制文件链接到 PCL 的库。还记得前面已经把 PCL 的头文件包含进工程里了吗,但是光有头文件是不够的。就好像你写了一个类,类里头不仅要有函数的声明,还要有函数的实现。对于 PCL 来说也是一样的,头文件里只有函数的声明,而库就是函数的具体实现

总算解释完了~


编译和运行

最后就用 CMake 编译吧

在该文件夹里创建一个新的文件夹,叫做 build

然后进入到 build 目录,在 build 目录里打开终端

只需依次敲两个命令

cmake ..
make

成功之后你会在 build 目录里看见一个刚刚生成的可执行二进制文件,叫做 voxel_grid_test 没错,就是我们在 CMakeLists 文件里 add_executable 这句里写的名字

在终端里敲一个命令就可以运行这个可执行二进制文件了

./voxel_grid_test

OK

以上就是本篇的所有内容了,愉快地去玩耍 PCL 吧!