ElasticFusion简介: 略
硬件配置:
笔记本 i7-7700, 显卡 英伟达 1050TI Ubuntu16.04 ,摄像头 kinect2 , cuda9.0
一、下载源码,安装基本依赖,编译跑通数据集
编译准备:下载官方给出的的依赖如下
sudo apt-get install -y cmake-qt-gui git build-essential libusb-1.0-0-dev libudev-dev openjdk-7-jdk freeglut3-dev libglew-dev cuda-7-5 libsuitesparse-dev libeigen3-dev zlib1g-dev libjpeg-dev
以上一些库的科普如下(了解的跳过):
build-essential —— Linux下的C/C++编译环境及依赖,如gcc和g++
libudev-dev —— 用户空间的设备文件管理库
openjdk-7-jdk —— 开源的Java开发环境
freeglut3-dev —— 开源的OpenGL库
libglew-dev —— OpenGL库
libsuitesparse-dev —— 稀疏矩阵运算库
zlib1g-dev —— 数据压缩库
libjpeg-dev —— JPEG图像压缩库
以上的很多依赖,在我之前跑MaskFusion(刚开源)时已经大多已安装,可能与ElasticFusion作者要求的不同,毕竟ElasticFusion在前,时隔多年后的MaskFusion在后。好了,言归正传,如openjdk-8-jdk,cuda9.0,不同于作者的版本,我已经安装,也是可以用的。
首先通过git下载源码,命令如下:
git clone https://github.com/mp3guy/ElasticFusion.git
下载后解压,进入ElasticFusion 新建deps ,在deps下安装相关依赖
指令如下:
unzip ElasticFusion.zipcd ElasticFusionmkdir depscd deps
下载编译安装Pangolin,Pangolin是对OpenGL进行封装的轻量级的OpenGL输入/输出和视频显示的库。可以用于3D视觉和3D导航的视觉图,可以输入各种类型的视频、并且可以保留视频和输入数据用于debug。编译命令如下:
git clone https://github.com/stevenlovegrove/Pangolin.gitcd Pangolinmkdir buildcd buildcmake ../ -DAVFORMAT_INCLUDE_DIR="" -DCPP11_NO_BOOST=ONmake -j8
sudo make install (这句尽量加上,作者没有加,我一开始没有make install 导致后面编译ElasticFusion时提示为定义的相关Pangolin之类的函数。一直觉得明明安装了Pangolin为何找说有些函数没定义,最后重新install就解决了)
cd ../..
下载编译安装Openni2:OpenNI中文译为开放自然语言交互,用官方的表述来讲就是a standard framework for 3D sensing,用于3D感知的开发接口;OpenNI2是第二代版本,相对于第一代更加专注于对3D设备的支持和数据的获取,移除了手势识别等中间件的方式,代码更加的精简,简而言之OpenNI2就是一个RGBD相机的用户态驱动,对上提供统一的接口,方便用户获取RGBD的图像数据,对下提供统一的标准类,方便RGBD厂商进行适配;目前OpenNI2支持的设备包括PS1080、PSLink、orbbec、Kinect等设备
git clone https://github.com/occipital/OpenNI2.gitcd OpenNI2make -j8cd ..
若此时 ./NiViewer 执行OpenNi2/Bin/x64-Release 下的NiViewer是不能成功的,需要在按安装libfreenect2驱动后将libfreenect2/build/lib 下的libfreenect2-openni2.so ,libfreenect2-openni2.so.0 , libfreenect2.so.0.2 拷贝到OpenNi2/Bin/x64-Release/OpenNi2/Drivers下。在第(二)部分会有说明。
最后以此编译ElasticFusion中的模块:
核心API模块:
cd ../Coremkdir buildcd buildcmake ../srcmake -j8
GPUTest模块:
cd ../../GPUTestmkdir buildcd buildcmake ../srcmake -j8
GUI图形操作模块:
cd ../../GUImkdir build && cd buildcmake ../src && make -j8
Core 的编译过程中出现了找不到 libtiff.so 参考了其他人如图找不到类似包的解决办法。
想到解决办法: sudo apt-get install libtiff5-dev
Core编译成功:
继续编译GPUTest和GUI遇到Pangolin的问题
避免此问题或解决办法 : 在安装Pangolin时已强调过 加入 sudo make install 最后此报错消失,又来一个新的错误(哭得心都有了,哈哈,不过还好,更曲折的在用kinect2的部分,一个BUG找一天啊,网上的答案都是说的模糊凌乱,所以、、、你懂的。)
参到作者源码github上的issuse部分,有人遇到类似的问题:
OK,终于编译通过,下载数据集,运行:
二、(重点来了)安装libfreenect2和Openni2使得kinect2可以正常运行显示
1、libfreenect2驱动安装:
提前下下好openni2-dev
sudo apt-get install libopenni2-dev
下载libfreenect2 驱动
git clone https://github.com/OpenKinect/libfreenect2.gitcd libfreenect2
下载deb文件
cd depends./download_debs_trusty.shcd ..mkdir build && buildcmake .. -DCMAKE_INSTALL_PREFIX=$HOME/freenect2 -DBUILD_OPENNI2_DRIVER=ONmakemake install
尽量提前下下好openni2-dev,我的理解同下面的解释一样:ElasticFusion的驱动用的是openni2,但是kinect2用libfreenect2驱动,所以在编译的时候编译出来带openni2的libfreenect2,cmake .. -DBUILD_OPENNI2_DRIVER=ON,但是如果系统里面事先没装好openni2,是编译不出来的,所以先装好libopenni2-dev,这样就可以编译出来带openni2的libfreenect2的驱动,即能在build的lib中找到libfreenect2-openni2.so
如我的编译结果:
此解释参考来自:https://blog.csdn.net/D206_hero/article/details/78985859
获取设备udev权限
sudo cp ../platform/linux/udev/90-kinect2.rules /etc/udev/rules.d/
测试驱动安装好没:
sudo chmod +x ./bin/Protonect./bin/Protonect cpu./bin/Protonect gl./bin/Protonect cl
成功可以显示视频窗口!!!!
将libfreenect2/build/lib 下的libfreenect2-openni2.so ,libfreenect2-openni2.so.0 , libfreenect2.so.0.2 拷贝到OpenNi2/Bin/x64-Release/OpenNi2/Drivers下,此时./NiViewer 执行OpenNi2/Bin/x64-Release 下的NiViewer成功显示。
然而执行./ElasticFusion依然不能运行,提示NO device ,由此开始了漫长的摸BUG过程、、、
看了github等别人的解决办法,也没起作用,不过分辨率还是要改的吧,依据Kienct2的分辨率:
重点:用sudo安装openni2-utils (我当时没有安装,只在一里面的ElasticFusion的deps安装了相关的依赖,并且将驱动.so复制到openni2中,在openni2中可以执行./Niviewer 但是运行./ElasticFusion时依然提示找不到设备)
sudo apt-get install openni2-utils
//备注:虽然作者让在deps下安装了Openni2,但是却不奏效,这样安装后 //解决了找不到设备的问题。
sudo make install-openni2
NiViewer2 //如果显示则说明openni2安装成功
然后再运行,发现可以了:
至此ElasticFusion的Kinect2编译运行完全结束,接下来的工作就是看源码了~~
补充:删除相关软件和依赖的指令(大神绕过):
解决此类问题时用到。
解决办法: 删除 libjpkg9-dev , remove不成功,用了dpkg - p libjpkg9-dev 尝试了奏效。
在终端里 apt-get安装的软件:
方法一、如果你知道要删除软件的具体名称,可以使用
sudo apt-get remove --purge 软件名称
sudo apt-get autoremove --purge 软件名称
方法二、如果不知道要删除软件的具体名称,可以使用
dpkg --get-selections | grep ‘软件相关名称’
sudo apt-get purge 一个带core的package,如果没有带core的package,则是情况而定。
方法三、在无法卸载又无法安装的情况下。强制卸载
卸载时问题: package is in a very bad inconsistent state; you should reinstall it before attempting configuration, 而又无法重新安装
安装的deb包要用此方法:
安装deb软件包 dpkg -i xxx.deb
删除软件包 dpkg -r xxx.deb
连同配置文件一起删除 dpkg -r --purge xxx.deb
查看软件包信息 dpkg -info xxx.deb
查看文件拷贝详情 dpkg -L xxx.deb
查看系统中已安装软件包信息 dpkg -l
重新配置软件包 dpkg-reconfigure xxx
清理系统:
sudo apt-get autoclean
sudo apt-get clean
sudo apt-get autoremove (这句慎用!!!)