当前位置: 代码迷 >> 综合 >> ElasticFusion: 用kinect-v2在Ubuntu16.04下跑Elasticfusion 编译运行过程实验记录
  详细解决方案

ElasticFusion: 用kinect-v2在Ubuntu16.04下跑Elasticfusion 编译运行过程实验记录

热度:1   发布时间:2023-10-11 18:37:00.0

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 参考了其他人如图找不到类似包的解决办法。

ElasticFusion: 用kinect-v2在Ubuntu16.04下跑Elasticfusion 编译运行过程实验记录

想到解决办法: sudo apt-get install libtiff5-dev

ElasticFusion: 用kinect-v2在Ubuntu16.04下跑Elasticfusion 编译运行过程实验记录

Core编译成功:

ElasticFusion: 用kinect-v2在Ubuntu16.04下跑Elasticfusion 编译运行过程实验记录

 继续编译GPUTest和GUI遇到Pangolin的问题

ElasticFusion: 用kinect-v2在Ubuntu16.04下跑Elasticfusion 编译运行过程实验记录 ElasticFusion: 用kinect-v2在Ubuntu16.04下跑Elasticfusion 编译运行过程实验记录

 避免此问题或解决办法 : 在安装Pangolin时已强调过 加入  sudo make install 最后此报错消失,又来一个新的错误(哭得心都有了,哈哈,不过还好,更曲折的在用kinect2的部分,一个BUG找一天啊,网上的答案都是说的模糊凌乱,所以、、、你懂的。)

ElasticFusion: 用kinect-v2在Ubuntu16.04下跑Elasticfusion 编译运行过程实验记录

 参到作者源码github上的issuse部分,有人遇到类似的问题:

ElasticFusion: 用kinect-v2在Ubuntu16.04下跑Elasticfusion 编译运行过程实验记录

OK,终于编译通过,下载数据集,运行:

ElasticFusion: 用kinect-v2在Ubuntu16.04下跑Elasticfusion 编译运行过程实验记录

二、(重点来了)安装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 

如我的编译结果:

ElasticFusion: 用kinect-v2在Ubuntu16.04下跑Elasticfusion 编译运行过程实验记录

此解释参考来自: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过程、、、

ElasticFusion: 用kinect-v2在Ubuntu16.04下跑Elasticfusion 编译运行过程实验记录

 看了github等别人的解决办法,也没起作用,不过分辨率还是要改的吧,依据Kienct2的分辨率:

ElasticFusion: 用kinect-v2在Ubuntu16.04下跑Elasticfusion 编译运行过程实验记录
Caption

 

重点:用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: 用kinect-v2在Ubuntu16.04下跑Elasticfusion 编译运行过程实验记录

至此ElasticFusion的Kinect2编译运行完全结束,接下来的工作就是看源码了~~

补充:删除相关软件和依赖的指令(大神绕过):

解决此类问题时用到。

 

ElasticFusion: 用kinect-v2在Ubuntu16.04下跑Elasticfusion 编译运行过程实验记录

 

ElasticFusion: 用kinect-v2在Ubuntu16.04下跑Elasticfusion 编译运行过程实验记录

解决办法: 删除 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 (这句慎用!!!)

 

  相关解决方案