Ubuntu16.04下编译libfreenect2和PCL以支持KinectV2点云处理

原因就是由于OpenNI2.2不支持Kinect V2,导致我没法在PCL中调用Kinect设备。
在Windows上的尝试失败了,来一波Linux下的尝试。
话不多说,下面是实实在在的解题步骤。

第一步:libfreenect2的编译

注意:libfreenect2是Kinect v2的开源驱动。如果用的是Kinect v1,出门右转git搜索libfreenect1。
项目地址:libfreenect2
参照的官网Linux编译指导:Linux
注意:我的作业本是Ubuntu16.04的,其他作业本请点进去仔细查看指导Linux,有很多不同之处

以下是16.04下的编译步骤:

下载libfreenect2源码

1
2
git clone https://github.com/OpenKinect/libfreenect2.git
cd libfreenect2

安装编译工具

1
sudo apt-get install build-essential cmake pkg-config

安装linusb

1
sudo apt-get install libusb-1.0-0-dev

安装TurboJPEG

1
sudo apt-get install libturbojpeg libjpeg-turbo8-dev

安装OpenGL

1
sudo apt-get install libglfw3-dev

安装OpenCL(可选,我没选,选择安装的同学查看 Install OpenCL 这一小节)

安装CUDA(可选,我没选,选择安装的同学查看 Install CUDA 这一小节)

安装VAAPI(可选,我没选,选择安装的同学查看 Install VAAPI 这一小节)

安装OpenNI2(必选啊,有了这个PCL才能调用Kinect)

1
sudo apt-get install libopenni2-dev

编译

1
2
3
4
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/freenect2
make
make install

安装路径CMAKE_INSTALL_PREFIX自己定义。
当第三方的应用CMake需要libfreenect2路径时,你要用cmake -Dfreenect2_DIR=$HOME/freenect2/lib/cmake/freenect2来指定。

设定设备访问规则

1
sudo cp ../platform/linux/udev/90-kinect2.rules /etc/udev/rules.d/

然后重新插拔一下Kinect V2设备。

运行测试程序

1
./bin/Protonect

运行OpenNI2测试(重要)

1
2
3
sudo apt-get install openni2-utils
sudo make install-openni2
NiViewer2

如果遇到设备找不到,不要着急,试试重新插拔一下Kinect设备。

第二步:PCL的编译

参考链接:ubuntu16.04 安装PCL库

安装依赖项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sudo apt-get update
sudo apt-get install git build-essential linux-libc-dev
sudo apt-get install cmake cmake-gui
sudo apt-get install libusb-1.0-0-dev libusb-dev libudev-dev
sudo apt-get install mpi-default-dev openmpi-bin openmpi-common
sudo apt-get install libflann1.8 libflann-dev
sudo apt-get install libeigen3-dev
sudo apt-get install libboost-all-dev
sudo apt-get install libvtk5.10-qt4 libvtk5.10 libvtk5-dev
sudo apt-get install libqhull* libgtest-dev
sudo apt-get install freeglut3-dev pkg-config
sudo apt-get install libxmu-dev libxi-dev
sudo apt-get install mono-complete
sudo apt-get install qt-sdk openjdk-8-jdk openjdk-8-jre

下载源码

1
2
3
4
git clone https://github.com/PointCloudLibrary/pcl.git
cd pcl
mkdir build
cd build

编译及安装

我是使用CCMake进行的自定义编译,因为默认的编译没有把文档doc编译出来(文档和tutorial代码很重要)。

1
2
3
4
5
sudo apt-get install cmake-curses-gui # 安装ccmake
ccmake .. # 进入cmake配置界面,根据自己需求进行修改,基本不用动,把WITH_DOC=OFF改为WITH_DOC=ON即可

sudo make -j4 #多核处理,编译有点久,耐心等待
sudo make install

安装之后,doc文件夹在/usr/local/share,可以拷出来,随用随查。

第三步:测试

源码:

++ openni_grabber.cppview raw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/io/openni2_grabber.h>
#include <pcl/common/time.h>

class SimpleOpenNIProcessor
{
public:
void cloud_cb_ (const pcl::PointCloud<pcl::PointXYZRGBA>::ConstPtr &cloud)
{
static unsigned count = 0;
static double last = pcl::getTime ();
if (++count == 30)
{
double now = pcl::getTime ();
std::cout << "distance of center pixel :" << cloud->points [(cloud->width >> 1) * (cloud->height + 1)].z << " mm. Average framerate: " << double(count)/double(now - last) << " Hz" << std::endl;
count = 0;
last = now;
}
}

void run ()
{
// create a new grabber for OpenNI devices
pcl::Grabber* interface = new pcl::io::OpenNI2Grabber();

// make callback function from member function
boost::function<void (const pcl::PointCloud<pcl::PointXYZRGBA>::ConstPtr&)> f =
boost::bind (&SimpleOpenNIProcessor::cloud_cb_, this, _1);

// connect callback function for desired signal. In this case its a point cloud with color values
boost::signals2::connection c = interface->registerCallback (f);

// start receiving point clouds
interface->start ();

// wait until user quits program with Ctrl-C, but no busy-waiting -> sleep (1);
while (true)
boost::this_thread::sleep (boost::posix_time::seconds (1));

// stop the grabber
interface->stop ();
}
};

int main ()
{
SimpleOpenNIProcessor v;
v.run ();
return (0);
}

CMake文件:

CMakeLists.txtview raw
1
2
3
4
5
6
7
8
9
10
11
12
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

project(OpenNIGrabber)

find_package(PCL 1.2 REQUIRED)

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

add_executable (openni_grabber openni_grabber.cpp)
target_link_libraries (openni_grabber ${PCL_LIBRARIES})

运行成功,即能够获取到数据流和帧率信息
OpenNIGrabber

提示设备找不到的话,记得插拔一下Kinect啊