[三维重建] PCL KinectFusion ubuntu16.04下的配置

Ubuntu16.04 + PCL+ kinectv2 实现KinectFusion

Date: 2018-11-24
Author: liqisa
E-Mail: [email protected]

最近在研究三维重建项目,拿最经典的 KinectFusion 来练手,遇到了很多问题,网上大多数教程是在Windows下实现的,且多数是kinect1版本的,坑比较多,这次就写写自己配置成功的经验,希望可以帮助到有需要的人。

什么是KinectFusion

网上已经有很多介绍了,KinectFusion官网上也有详细的论文介绍
CSDN博客:

https://blog.csdn.net/xiaohu50/article/details/51592503
https://blog.csdn.net/baidu_17313961/article/details/52862416

微软的官方介绍:

https://www.microsoft.com/en-us/research/project/kinectfusion-project-page

首先要强调的是微软的KinectFusion并不开源,相反, PCL(PointCloud Library) 开源了这个算法的代码,名为 Kinfu ,所以,这个算法实际上是基于PCL的

实现KinectFusion

这里先给出项目需要安装的依赖项

  • pcl (pcl-trunk版本)
  • libfreenect2 (Kinectv2的驱动)
  • OpenNI2 (PCL使用的获取相机数据的驱动)
  • Nvidia显卡驱动
  • CUDA
  • eigen3
  • libboost
  • 等等,这里就不一一列举了,待会统一安装

我的笔记本是 1050Ti ,装的是nvidia-384的驱动,CUDA8.0
个人觉得版本问题不大,适合自己的显卡就好

安装Nvidia显卡驱动

网上有很多显卡安装的教程,大多数是禁用nouveau以后再手动执行 .run文件
我个人装过几次,觉得一方面是麻烦,另外一点是时常会遇到重启之后又自动换回默认驱动的问题,重启后执行nvidia-smi又没有输出了。
所以这里给大家推荐一个最简单的安装合适的Nividia显卡驱动的方法:
首先点击这里查询适合自己的显卡驱动:
[三维重建] PCL KinectFusion ubuntu16.04下的配置_第1张图片
其实用老一点版本的驱动问题不大,只要能适配到合适的CUDA版本都可以。
然后执行:

  1. 更新下源 :
    sudo apt-get upgrade
    sudo apt-get update
  2. 查询nvidia驱动可用版本,运行:
    sudo apt-cache search nvidia-*
    查询ppa安装支持的版本驱动,如果有384
  3. 安装nvidia驱动,
    sudo apt-get install nvidia-384

在设置的软件中心里选择Additional Driver可以看到可选的几个显卡驱动,选择我们已经安装的384(已安装会显示propriety)然后应用就可以完成显卡驱动的安装和切换了
[三维重建] PCL KinectFusion ubuntu16.04下的配置_第2张图片

安装CUDA Tookit

  • 首先点击这里:下载CUDA
  • 下载好以后,切到下载的文件目录
    cd Downloads/
    执行:
    sudo sh cuda_8.0.27_linux.run
    就开始安装CUDA了,因为已经有了显卡驱动这里提示的时候选择 No 就好了
    可以选择安装Nvidia-Samples,这样也方便检查安装是否成功
  • 安装好以后,需要增加环境变量
    sudo gedit /etc/profile
    在文件最后添加上
    export PATH=/usr/local/cuda-8.0/bin:$PATH
    export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64$LD_LIBRARY_PATH
  • 然后重启电脑 sudo reboot
  • 可以编译Nvidia-Sample测试下是否安装成功了

编译并测试设备 deviceQuery:
cd /usr/local/cuda-8.0/samples/1_Utilities/deviceQuery
sudo make
./deviceQuery
编译并测试带宽 bandwidthTest:
cd ../bandwidthTest
sudo make
./bandwidthTest

安装依赖项

sudo apt-get install libboost1.48-dev libboost1.48-all-dev libeigen3-dev libflann-dev libvtk5-dev libqhull-dev
sudo apt-get install -y g++ python libusb-1.0-0-dev freeglut3-dev doxygen graphviz libudev-dev 
sudo apt-get install openni2-dev #安装openni2
sudo apt-get install openni2-utils

关于OpenNI

ubuntu16.04是可以通过sudo apt-get来安装OpenNI的,14.04的话只能自己去下载源码编译安装了
OpenNI的地址:https://github.com/OpenNI
Kinect2 使用的是OpenNI2,因为只有OpenNI2才能和libfreenect2配套使用

这里最好装一下ccmakecmake-gui,可以用来检查cmake的配置项是否开启,不过一般都是默认开启的。

sudo apt-get install cmake-gui
sudo apt-get install cmake-curses-gui

运行 pkg-config --modversion libopenni2查看libopenni2是否安装成功,如果输出版本号就说明安装成功

安装libfreenect2

libfreenect2 是kinect2 使用的版本,和OpenNI2 配套使用,千万不要搞错了

安装和教程和源码:https://github.com/OpenKinect/libfreenect2
不想看英文安装教程也可以继续看下文:

1.首先下载源码

git clone https://github.com/OpenKinect/libfreenect2.git

2.安装一些依赖

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

3.编译libfreenect2

mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/freenect2
make
sudo make install

复制一下规则

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

4.测试libfreenect2与OpenNI2

这个时候连上 kinect2 (注意要用 USB3.0 的接口),然后执行:

./bin/Protonect

如果没有图像输出的话,就给kinect断电重连一下,一般来说就会:
[三维重建] PCL KinectFusion ubuntu16.04下的配置_第3张图片接下来测试OpenNI2是否链接到libfreenect2了

sudo apt-get install openni2-utils && sudo make install-openni2 && NiViewer2.

如果成功了的话,会出现如图
[三维重建] PCL KinectFusion ubuntu16.04下的配置_第4张图片如果没有出现图像,就需要检查一下OpenNI2库中有没有libfreenect的库文件了
[三维重建] PCL KinectFusion ubuntu16.04下的配置_第5张图片如果没有的话就去libfreenect/build/lib/目录下把库文件拷贝过来

编译PCL

到这里,千里之行已经始于足下了,所有的准备都做好了,接下来就是编译pcl了

1.首先下载源码

 git clone https://github.com/PointCloudLibrary/pcl.git pcl-trunk
 cd pcl-trunk

2.改源码!!!!

这一步是本博文最为重要的一个步骤!

这也是为什么大家都不愿意在ubuntu16.04下使用kinect2的原因,

因为PCL中的的Kinfu算法是使用OpenNI获取相机数据的,而Kinect2的驱动是libfreenect2,libfreenect2是无法和OpenNI适配的,只能使用OpenNI2

pcl-trunk/gpu/kinfu/tools/kinfu_app.cpp,做如下改动

  1. 头文件增加
    #include pcl/openni2_grabber.h
  2. main函数中
    capture.reset(new pcl::OpenNIGrabber())替换成capture.reset(new pcl::io::OpenNI2Grabber())
  3. 整个文档中
    openni_wrapper替换成pcl::io
  4. startMainLoop函数中
    pcl::ONIGrabber替换成pcl::io::OpenNI2Grabber

pcl-trunk/gpu/kinfu_large_scale/tools/kinfuLS_app.cpp中也做同样改动

参考链接:https://blog.csdn.net/u011426016/article/details/81395795?utm_source=blogxgwz2

3.配置并编译

先检查一下CMake配置

mkdir build && cd build
ccmake ..

之后开始配置编译选项,按t键进入高级模式设置,按c键进行配置,确保:

BUILD_GPU ON
BUILD_CUDA ON
BUILD_OPENNI ON
BUILD_gpu_kinfu ON
BUILD_gpu_kinfu_large_scale ON

g生成 makefile, 然后就可以编译了

make -j8
sudo make install

编译需要蛮长时间的,耐心等待…

在编译过程中,你可能会遇到以下问题:
1.错误像”Error: no such instruction: vfmadd312ss”,这个错误是因为你使用到是corei7处理器
解决办法:
cd …
cd cmake
sudo gedit pcl_find_sse.cmake
将 “-march=native” 替换为 “-march=corei7”

测试kinfu

官方测试文档: http://pointclouds.org/documentation/tutorials/using_kinfu_large_scale.php#using-kinfu-large-scale
[三维重建] PCL KinectFusion ubuntu16.04下的配置_第6张图片
文章开头是我的邮箱,有什么问题欢迎与我交流~

参考资料

[1] https://blog.csdn.net/xiaocainiaodeboke/article/details/52388110
[2] https://blog.csdn.net/u011426016/article/details/81395795?utm_source=blogxgwz2
[3] https://blog.csdn.net/billbliss/article/details/56489674
[4] https://blog.csdn.net/xiaocainiaodeboke/article/details/52353191

你可能感兴趣的:(SLAM)