admin 管理员组

文章数量: 887021

PCL1.8 + Kinect 2.0的配置是一个比较麻烦的问题,网上很多资料都是针对Kinect 1.0,针对Kinect 2.0的寥寥无几,使用Kinect 2.0相对比较麻烦,需要重装驱动,甚至修改源代码,前前后后踩坑无数花了近一个月时间才配置成功。写下这篇博客一方面对基础配置工作做一简要总结,一方面希望对接触PCL的新手提供必要的帮助,尽量少走弯路。

  • 安装环境
    pcl 版本:pcl 1.8.1 (https://github/PointCloudLibrary/pcl)
    kinect 版本: kinect 2.0
    vs版本: visual studio 2010
    硬件环境:win10, 64bit, 16G内存, GTX1070, 8G显存

  • 配置过程

    1. 下载pcl 1.8.1源代码(pcl有两种安装方式,一是AllInOne,一是下载源码编译,为了使用更多的功能,一般下载最新源码编译)
    2. windows编译参考:http://www.pointclouds/downloads/windows.html,需要安装一些必要的第三方库,这里实际包含了openni 1.5.4,但实际上openni 1并不能驱动kinect 2.0,为了让调试尽可能少出错误,这里也安装openni1.5.4,下文会讲如何使用openni2驱动kinect 2.0
    3. 因为我主要使用kinect fusion,因此我需要用到并行计算,首先安装Nvidia驱动,进入官网:https://www.geforce/drivers,选择电脑配置系统会推荐给你相应的驱动程序,我这里安装的版本为:391.35
    4. 安装cuda toolkit,需要注意的是cuda官方对cuda和nvidia版本的依赖关系进行了具体的限定(https://docs.nvidia/cuda/cuda-toolkit-release-notes/index.html),如下图所示,根据实际情况,我这里选择了cuda 9.1
    5. 安装openni 2
      ibfreenet2是kinect v2的非官方驱动,如果要使用openni2调用kinect 2的话,需要先安装(编译)ibfreenet2。
      (1) 从github上下载源码:https://github/OpenKinect/libfreenect2
      (2) 安装libusbK驱动: http://zadig.akeo.ie/
      (3) 点击options,选择”List All Devices” , 取消选择 “Ignore Hubs or Composite Parents”


      点击安装即可
      (4) 编译libusb
      这里直接下载即可,下载地址:https://sourceforge/projects/libusb/files/libusb-1.0/libusb-1.0.21/libusb-1.0.21.7z/download),将压缩文件解压到libfreenect2/depends文件夹下,重命名为libusb。
      (5) 安装TurboJPEG
      从网址http://sourceforge/projects/libjpeg-turbo/files 下载压缩包,安装到c:/libjpeg-turbo64,然后设置环境变量:TurboJPEG_ROOT
      (6) 安装GLFW
      从http://www.glfw/download.html(64bit),解压到depends/glfw (重命名glfw-3.x.x.bin.WIN64 为glfw),然后设置环境变量:GLFW_ROOT
      (7) 编译libfreenect2
      使用cmake生成然后编译,编译后发现Protonect.exe程序根本打不开?到这里下载:https://github/OpenKinect/libfreenect2/issues/580
      将下载的预编译好的dll文件和exe文件替换libfreenect2下bin中的dll和exe即可
      (8) 安装OpenNI2
      下载 OpenNI 2.2.0.33 (x64) from http://structure.io/openni, 安装到默认路径 (C:\Program Files…).,安装后发现tools/Niviewer.exe依然无法运行? 就把tools/Openni2/Drivers下的dll文件(freenect2-openni2.dll, libusb-1.0.dll, glfw.dll, turbojpeg.dll等统一替换成libfreenect2/build/bin编译好的文件即可)
    6. 编译pcl-mater
      如下图所示,注意勾选BUILD_CUDA和 BUILD_GPU
    7. 运行pcl_openni2_viewer
      (1) 会告知缺乏QtCored4.dll 以及 QtGuid4.dll, 那就去Qt目录下拷贝过来
      (2) 会报错,No devices connected,这种时候先去把pcl_openni2_viewer调试通,如果不通,就把之前编译的freenect2d.dll、freenect2-openni2d.dll拷贝至 build/bin/Openni2/Drivers/下即可,你就可调试通了
    8. 运行pcl_kin_app
      还会给你一个错误: PCLEXCEPTION, 根本不知道该怎么调试。
      (1) 因为用openi2驱动kinect 2,因此首先在kinfu_app.cpp中增加头文件 pcl/io/openni2_grabber.h
      (2) mian函数中, capture.reset(new pcl::OpenNIGrabber()); 修改为capture.reset( new pcl::io::OpenNI2Grabber());
      (3) 整个文档将 openni_wrapper 替换为* pcl::io*
      (4) 将startMainLoop中** pcl::ONIGrabber 替换为 **pcl::io::OpenNI2Grabber
      (5) 然后大功告成

花了很多时间搞这个,但话说回来,现在很多人做研究和项目都不用这套框架,时间太久远,too old,但是如果要深入理解KinectFusion的话,还是可以读一下程序的。最后推荐大家使用InfiniTAM,代码更短、工程更小、更好调试、效果更好!

参考文献:
1. Win10安装OpenNI2并通过python接口调用Kinect.
2. Windows 环境下 libfreenect2的配置

本文标签: Kinect