更多SLAM相关文章请参阅 SLAM专栏
这篇文章的目的是为了在Ubuntu 16.04下使用 Kinect V2。 Kinect V2的使用需要配准的彩色图像和深度图。彩色图像和深度图的注册是一个计算力要求很高的过程,一般需要GPU。一般的笔记本电脑会有集成的Intel显卡和Nvidia显卡两个显卡。使用Intel显卡并不能支撑这么高的计算力,因此必须使用Nvidia显卡。这就要求必须安装Nvidia显卡驱动和Nvidia显卡的OpenCL。Nvidia的CUDA驱动中带有OpenCL,因此只需要安装CUDA驱动即可,但是这个安装过程有一些事项必须注意,否则就会导致循环登录等一些糟心问题。
1. CUDA 安装
1.1 下载cuda驱动
在这个网址下载".run"的cuda驱动:https://developer.nvidia.com/cuda-90-download-archive?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1604&target_type=runfilelocal
1.2 安装cuda
STEP1 停掉Nouveau
新建一个黑名单:
sudo gedit /etc/modprobe.d/blacklist-nouveau.conf
在里面添加
blacklist nouveau
options nouveau modeset=0
然后执行:
sudo update-initramfs -u
STEP2 退出图像化界面,同时按:CTRL+ALT+F1
STEP4 停掉服务
sudo /etc/init.d/lightdm stop
STEP5 安装CUDA
首先进入到“cuda_9.0.176_384.81_linux.run”文件所在的地址,然后执行:
sudo sh cuda_9.0.176_384.81_linux.run
这里需要特别注意,一定不要安装OpenGL,否则就会出现循环登录的情况。除了OpenGL以外的其他选项都可以进行安装。
STEP6 启动服务
sudo /etc/init.d/lightdm start
这时,就自动切换到了图形登录界面,输入密码进入系统。<这里可能会出现分辨率变化的问题,下面有解决方案>
STEP7 添加程序相关索引
首先打开 .barshrc文件
$ sudo gedit ~/.bashrc
添加如下信息:
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:${LD_LIBRARY_PATH}"
export PATH="/usr/local/cuda/bin:${PATH}"
然后执行
source ~/.bashrc
echo "/usr/local/cuda/lib64" | sudo tee /etc/ld.so.conf.d/cuda.conf
sudo ldconfig
STEP8 验证是否安装正确
验证驱动版本,保证驱动程序已经安装正常
cat /proc/driver/nvidia/version
查看NVCC版本
nvcc -V
分辨率错误处理
错误的原因是错误的xorg.conf配置,做法是将备份的conf重新设置回xorg.conf。
sudo mv /etc/X11/xorg.conf /etc/X11/xorg.conf.backup
sudo touch /etc/X11/xorg.conf
sudo reboot
2. 安装Kinect V2驱动
这里使用开源ROS驱动 IAI Kinect2: https://github.com/code-iai/iai_kinect2
安装IAI Kinect2之前还需要安装单独的驱动:https://github.com/OpenKinect/libfreenect2
两个驱动的安装都比较简单,而且官方的说明写的都很详细,直接看官方安装说明即可。
需要特别注意的是,安装 libfreenect2 的时候可以选择编译cuda:
cmake .. -DENABLE_CXX11=ON -DCUDA_PROPAGATE_HOST_FLAGS=off
如果安装libfreenect2的位置不是home的话,再编译IAI Kinect2的时候需要注意加上:
-Dfreenect2_DIR=path_to_freenect2/lib/cmake/freenect2 to catkin_make
3. 使用 Kinect V2
如果需要发布点云,需要运行launch文件
kinect2_bridge kinect2_bridge.launch
我们还可以手动设置kinect2_bridge.launch一些参数:
建议把depth_method 设为opencl,reg_method也设为opencl,这样处理的速度会比较快。
我们还可以设置图像发布的频率:设置fpb_limit 为自己想要发布的频率数值,比如20。
<arg name="base_name" default="kinect2"/>
<arg name="sensor" default=""/>
<arg name="publish_tf" default="false"/>
<arg name="base_name_tf" default="$(arg base_name)"/>
<arg name="fps_limit" default="-1.0"/>
<arg name="calib_path" default="$(find kinect2_bridge)/data/"/>
<arg name="use_png" default="false"/>
<arg name="jpeg_quality" default="90"/>
<arg name="png_level" default="1"/>
<arg name="depth_method" default="default"/>
<arg name="depth_device" default="-1"/>
<arg name="reg_method" default="default"/>
<arg name="reg_device" default="-1"/>
<arg name="max_depth" default="12.0"/>
<arg name="min_depth" default="0.1"/>
<arg name="queue_size" default="5"/>
<arg name="bilateral_filter" default="true"/>
<arg name="edge_aware_filter" default="true"/>
<arg name="worker_threads" default="4"/>
<arg name="machine" default="localhost"/>
<arg name="nodelet_manager" default="$(arg base_name)"/>
<arg name="start_manager" default="true"/>
<arg name="use_machine" default="true"/>
<arg name="respawn" default="true"/>
<arg name="use_nodelet" default="true"/>
<arg name="output" default="screen"/>
最后需要说的是IAI Kinect2是一个自适应的程序,只有订阅相关topic时,才生产数据,生产数据的频率设定的发布帧率而改变。