Ubuntu14.04下编译PCL/KinFu

Kinfu是什么?

pcl团队实现的kinectfusion,并且开放其源代码。我觉得kinectfusion严格意义上应该属于动态场景重建。因为kinectfusion更加在意的是场景的模型,而不是相机的位姿。kinectfusion充分发挥了显卡的计算优势,所以对显卡要求很高,显存应该在1G以上,计算核在512以上。工程上一种直观的感觉,kinectfusion在用资源来换取计算速度和计算精度。
kinectfusion只使用了的深度图, 大致过程是:对于一个深度帧现进行双边滤波,之后假设一致相机的位姿,将深度数据转换为3D的点,并计算局部的法向量。将这些点对应到3D栅格中去,3D栅格的纵向一列对应一个GPU线程,用这些线程去处理深度数据的相应融合和计算,在此先计算TSDF值。之后进行两帧的融合,最后根据场景模型计算相机的位姿。就这样相机的位姿和场景模型相辅相成。

编译的pcl/kinfu的大致过程是:安装nvidia显卡对应的驱动,安装cuda官方教程,编译pcl-trunk(kinfu就在其中,pcl-trunk编译好了,kinfu也就编译好了)

NOTE
由于牵扯显卡驱动,以防进不了图像界面。建议准备两台电脑,一台为目标机器(安装驱动的机器),一台为专门上网的机器。

安装NVIDIA驱动

1.查看自己电脑的显卡型号,并在NVIDIA官网下载相应的显卡驱动。驱动下载链接:http://www.nvidia.com/page/drivers.html

$ lspci | grep -i nvidia
$ uname -m && cat /etc/*release
01:00.0 VGA compatible controller: NVIDIA Corporation GF119 [GeForce GT 620 OEM] (rev a1)
01:00.1 Audio device: NVIDIA Corporation GF119 HDMI Audio Controller (rev a1)

可以看出我的显卡为nvidia GeForce GT620
2.卸载已有驱动(如果没有安装nvidia的驱动,这一步可以省)

$ sudo apt-get remove --purge nvidia*

3.然后点Ctrl + Alt +F1到tty1.输入用户密码,然后关闭Xserver.

$ sudo stop lightdm

4.切换到安装文件所在目录并运行驱动的安装文件

$ sudo sh *.run

5.根据提示进行安装全部选yes/ok即可,主要是注意“是否需要修改xorg.conf”项要选yes, 完成安装。重新启动机器使得新安装的显卡驱动起作用。

$ sudo reboot

安装CUDA toolkit

1.根据自己的系统选择cuda安装文件,下载链接:https://developer.nvidia.com/cuda-downloads
2. 然后点Ctrl + Alt +F1到tty1.输入用户密码,然后关闭Xserver.

$ sudo stop lightdm

3.切换到安装文件所在目录并运行CUDA的安装文件

$ sudo sh *.run

4.凡是询问是否的全部键入yes(但是,不安装cuda自带的驱动), 询问安装路径的采用默认值,直接enter即可。
5.重新启动XServer

$ sudo start lightdm

6.切换到图形界面(点Ctrl + Alt +F7), check device nodes : Check if /dev/nvidia* files exist。如果没有的话sudo modprobe nvidia

重启桌面服务sudo service lightdm start, 可以解决login-loop问题(即输入密码后系统有回到了用户输入密码的界面)。

设置环境变量

在/etc/ld.so.conf.d/建立cuda.conf的文件,写入
/usr/local/cuda-7.0/lib64
然后sudo ldconfig
添加PATH,为了长久添加,在/etc/profile加入
export PATH=/usr/local/cuda-7.0/bin:$PATH
立即生效,source /etc/profile
注意:直接在终端export PATH=/usr/local/cuda-7.0/bin:$PATH是暂时的

7.验证驱动版本和CUDA版本:
cat /proc/driver/nvidia/version
nvcc -V
Create CUDA Samples. 运行 make时间较长…
进入NVIDIA_CUDA-7.5_Samples/bin/x86_64/linux/release/ 做一下两个标准检测:
./deviceQuery:查看显卡信息
./bandwidthTest:检查是否工作正常
都能够PASS
Reboot. Everything should be ok.

安装必要的软件包

1.安装pcl依赖的软件包,需要注意的是,boost的版本号需要大于等于1.47,否则编译过程中会出现版本号太旧的错误提示。

$ sudo apt-get install libboost1.48-dev libboost1.48-all-dev libeigen3-dev libflann-dev libvtk5-dev libqhull-dev

2.安装openni相关,这一步很重要,如果没有安装openni的话, 最后编译后虽然不会报错,但是没有编译出PCL/KinFu相关的可执行文件。

$ sudo add-apt-repository ppa:v-launchpad-jochen-sprickerhof-de/pcl
$ sudo apt-get update
$ sudo apt-get install openni-dev libusb-1.0-0-dev

下载并编译pcl-trunk

$ sudo apt-get install git-gui cmake-gui
$ git clone https://github.com/PointCloudLibrary/pcl.git pcl-trunk
$ cd pcl-trunk

配置编译选项

$ 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键产生makefiles

编译pcl-trunk

$ make
$ make install(如果你并不想安装pcl,这一步可以省略)

在编译过程中,你可能会遇到以下问题:
1.错误像”Error: no such instruction: vfmadd312ss”,这个错误是因为你使用到是corei7处理器
解决办法:
cd ..
cd cmake
sudo gedit pcl_find_sse.cmake
将 “-march=native” 替换为 “-march=corei7”
2.No rule to make target `/usr/lib/x86_64-linux-gnu/libGL.so’
解决办法:http://techtidings.blogspot.com/2012/01/problem-with-libglso-on-64-bit-ubuntu.html

 Problem with libGL.so on 64-bit Ubuntu

I have an Nvidia card and as expected I installed Nvidia drivers for my ubuntu. But, whenever I compiled programs that used OpenGL ( libGL.so ) I ran into compile errors similar to:

No rule to make target `/usr/lib/x86_64-linux-gnu/libGL.so'

I was sure there was some problem with my libGL.so file so I ended up looking at it properties and found out that it was a broken link pointing to 'mesa/libGL.so' which in turn was pointing to 'libGL.so.1' which never existed.

bpaluri3@bpaluri3:~/libfreenect/build$ ls -l /usr/lib/x86_64-linux-gnu/libGL.so 
lrwxrwxrwx 1 root root 13 2011-08-10 04:20 /usr/lib/x86_64-linux-gnu/libGL.so -> mesa/libGL.so

bpaluri3@bpaluri3:~/libfreenect/build$ ls -l /usr/lib/x86_64-linux-gnu/mesa/libGL.so 
lrwxrwxrwx 1 root root 10 2011-08-10 04:20 /usr/lib/x86_64-linux-gnu/mesa/libGL.so -> libGL.so.1


Then I verified the libGL.so.1 in my /usr/lib directory and found out that it pointed to libGL.so.290.10 which is the file provided by the nvidia driver.

bpaluri3@bpaluri3:~/libfreenect/build$ ls -l /usr/lib/libGL.so.1 
lrwxrwxrwx 1 root root 15 2012-01-09 13:53 /usr/lib/libGL.so.1 -> libGL.so.290.10

I just overwrote the symbolic link in `/usr/lib/x86_64-linux-gnu/libGL.so' with the nvidia openGL library i.e. `/usr/lib/libGL.so' ( I had to delete the old symbolic link before I do this ).

bpaluri3@bpaluri3:~/libfreenect/build$ sudo rm /usr/lib/x86_64-linux-gnu/libGL.so 
bpaluri3@bpaluri3:~/libfreenect/build$ sudo ln -s /usr/lib/libGL.so.1 /usr/lib/x86_64-linux-gnu/libGL.so 

The final two statements are the fixes for the libGL error and I hope anyone who runs into a similar issue will find this information useful.

至此,PCL/KinFu在Ubuntu下编译完成。你可以按照http://pointclouds.org/documentation/tutorials/using_kinfu_large_scale.php#using-kinfu-large-scale所述进行测试。更进一步,你可以修改其源码,提高其性能。

注意:在运行kinfu程序时如果出现类似于下面的提示:
$ ./bin/pcl_kinfu_largeScale -r -et
[pcl::gpu::printShortCudaDeviceInfo] : Device 0: “GeForce GTX 680” 2048Mb, sm_30, 1536 cores, Driver/Runtime ver.6.0/6.0
Can’t open depth source
在排除kinect连接线没有接好的情况下,可以通过下面方式解决:
命令:
sudo apt-get install libopenni-dev

kinect2的情况

如果你使用的是kinect2(kinect的第二个版本),那么就需要将代码进行修改让其可以从kinect2中获取数据。

1.安装libfreenect2驱动,安装教程
2.将~/pcl-trunk/gpu/kinfu_large_scale/tools/kinfuLS_app.cpp 的1312行的

capture.reset( new pcl::OpenNIGrabber() );
改为
capture.reset( new pcl::io::OpenNI2Grabber() );

3.引用相应的头文件

#include <pcl/io/openni2_grabber.h>

Now, it is your show time!

参考

  1. http://blog.csdn.net/l_h2010/article/details/38239709
  2. http://www.th7.cn/system/lin/201602/154122.shtml
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值