ubuntu 20.04配置Elasticfusion及问题解决(Kinect V2实测数据、TUM数据)
文本详细描述了在Ubuntu系统上安装和配置ElasticFusion、Pangolin、OpenCV、libfreenect2、OpenNI2等软件的过程,并在Kinect V2和TUM离线数据集上进行了测试。安装过程中需要配置依赖项,包括NVIDIA显卡驱动、CUDA、libfreenect2、OpenCV、Python、Boost、Zlib等。文本还描述了在ElasticFusion主体部分(Core、GPUTest、GUI)的编译和执行过程。用户在测试过程中遇到了多个错误,如gcc版本过高、GPU不支持、Catch2库找不到、OpenGL问题、pthread函数错误以及std库错误,并通过调整gcc版本、配置GPU信息、安装Catch2、设置OpenGL偏好、添加头文件和调整C++标准等方法解决了这些问题。此外,文本还描述了在Kinect V2和TUM离线数据集上的测试过程,用户在使用ElasticFusion处理实时数据时遇到了效果不佳的问题,尤其是在扫描复杂场景时遇到了很多问题。文本还提到了TUM数据集的下载、预处理和使用ElasticFusion运行数据的结果,并计划后续进行误差测评。
测试数据集与Kinect V2实时数据已实现有效对接,在多台电脑上进行了测试,问题分析较为完善。Tips:编译过程中请认真阅读readme文件,检查是否有遗漏之处,通常能够解决大部分问题。
源码
参考
参考
参考文献
ubuntu 20.04/16.04配置Elasticfusion及问题解决
一
一
1.1
1.2
1.3
1.4
1.5
1.6
1.7
-
二、Elasticfusion 主体
-
- 2.1 编译Core
- 2.2 编译GPUTest
- 2.3 编译GUI
- 2.4 执行及效果
-
三、遇到的 Error
- 3.1 error:该种方式仅适用于gcc版本8.x及以下,后续版本将不再兼容。
- 3.2 error:您的NVIDIA GeForce GTX 1060 6GB GPU未被ICP Step数据库收录,建议先添加该设备。
- 3.3 error:检测到构建测试时需要Catch2库,但该库未被正确配置。
- 3.4 error:OpenGL支持多线程渲染,需明确配置。
- 3.5 error:发现无法调用pthread_detach和pthread_create函数,这可能与线程管理配置有关。
- 3.6 error:发现类型decay_t未被std库包含,这可能与C++标准库的版本不兼容有关。
- 3.1 error:该种方式仅适用于gcc版本8.x及以下,后续版本将不再兼容。
Kinect V2
4.2 TUM离线数据
* 4.2.1 安装依赖项及数据包
* 4.2.2 TUM数据的下载和预处理过程
* 4.2.3 数据格式转换操作,具体为png_to_klg类型
* 4.2.4 通过Elasticfusion平台执行TUM数据的分析和处理
* 4.2.5 误差评估过程
在Ubuntu16.04和20.04都配了一遍,问题总结梳理。
友情提示,一定注意
必须是基于NVIDIA架构的显卡。CUDA的运行依赖于NVIDIA架构的显卡,而采用AMD架构的显卡,其配置环境在运行ElasticFusion时会遇到重大问题。必须配备10系列或更高版本的显卡,否则无法正常运行Elasticfusion。
一、安装依赖项
1.1 Ubuntu 系统
首先是Ubuntu系统,这个不必多说。
我是从16.04最近才升级到了20.04,真香。
1.2 NVIDIA 驱动及 cuda
先确认下自己是够安装了NVIDIA驱动及其版本。
我之前是装过NVIDIA驱动的,可能因为
在Ubuntu 20.04系统中,用户可能遇到无法找到NVIDIA相关命令的问题。这通常是因为系统版本或驱动程序配置问题导致的。建议用户检查并安装NVIDIA显卡驱动程序,以确保图形界面中的显卡被正确识别。如果问题依旧存在,可以尝试更新系统至最新版本,或者重新安装NVIDIA驱动程序。遇到此类问题时,用户可以参考官方文档或社区资源获取详细解决方案。
1.3 更新大法
sudo apt-get update
sudo apt-get upgrade
1.4 安装依赖包
sudo apt-get install cmake cmake-qt-gui git build-essential libusb-1.0-0-dev libudev-dev
sudo apt-get install freeglut3-dev libglew-dev libsuitesparse-dev libeigen3-dev
sudo apt-get install zlib1g-dev libjpeg-dev doxygen graphviz
1.5 安装 Pangolin
源码:https://github.com/stevenlovegrove/Pangolin
git clone https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
mkdir build && cd build
cmake ..
make -j4
sudo make install
sudo ldconfig
#测试
ctest
cd ../.. #文件夹回退两层
在另一台电脑上,我采用了旧版本代码库https://github.com/zzx2GH/Pangolin,但无论怎么操作都会出现错误信息。经过搜索,发现许多用户也遇到了类似问题,最终我发现更换回旧版本代码库就可以解决问题。
1.6 安装 Openjdk
Elasticfusion 源码的 readme 文件中对依赖项的版本说明较低,因此我选择了更高版本的 openjdk8,但可能会出现版本不兼容的问题。后来改用 openjdk7,经过测试,openjdk7 与其他依赖项的兼容性较好。
sudo apt install openjdk-8-jdk-headless
java -version
1.7 安装 OpenNi2
在编译过程中,直接下载的源码必须配置必要的变量;一个非常便捷的安装途径是《Ubuntu16.04安装OpenNI2(最简单)》。
#安装依赖项
sudo apt-get install -y g++ python libusb-1.0-0-dev freeglut3-dev doxygen graphviz
sudo apt-get install libudev-dev
#安装openni2
sudo apt-cache search openni2
sudo apt-get install libopenni2-dev
#测试是否安装成功及版本
pkg-config --modversion libopenni2
二、Elasticfusion 主体
2.1 编译Core
cd Core
mkdir build && cd build
cmake ../src
make -j4
cd ../.. #文件夹回退两层
2.2 编译GPUTest
cd GPUTest
mkdir build && cd build
cmake ../src
make -j4
cd ../.. #文件夹回退两层
2.3 编译GUI
cd GUI
mkdir build && cd build
cmake ../src
make -j4
cd ../.. #文件夹回退两层
2.4 执行及效果
演示离线数据集下载
进入到 GUI/build 下,执行
./ElasticFusion -l dyson_lab.klg
效果如下图所示,可在左侧导航栏中切换需要的表现形式。


三、遇到的 Error
3.1错误提示:不可用的GNU版本!版本号大于8的GCC版本因不支持而被排除。
问题:gcc版本号过高,建议安装主版本信息为8及以下的软件。迁移:g++同样适用,只需将下面步骤中的gcc替换为g++即可。
#1.安装依赖项
sudo apt-get install build-essential
#2.安装gcc-8
sudo apt-get install gcc-8
#(因为不想安装太低的版本,就可着边缘装了8,如果想安装更低版本的,甚至是主版本为4或者5的,只需要把数字改一下即可)
#3.查看当前gcc版本
gcc -v
# 还是gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04),所以得切换一下【下面有截图】。
#4.查看已安装的gcc版本
ls /usr/bin/gcc*
# gcc -8已经安装成功【截图可知】
#5.手动设置两个版本的优先级并选择
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 50
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 40
sudo update-alternatives --config gcc
# 直接enter了,也可以选数字。已改为默认gcc-8版本【截图可知】
再次使用gcc -v查看当前gcc版本,发现已经变成了gcc version 8.4.0 (Ubuntu 8.4.0-3ubuntu2)

此时继续make -j4 编译,成功。
您的显卡型号“NVIDIA GeForce GTX 1060 6GB”未被包含在ICP Step性能数据库中,请确保将其添加到数据库中。
Your GPU of type NVIDIA GeForce GTX 1060 6GB isn’t present in the ICP Step database; please make sure it’s added to the database.
Your GPU of type NVIDIA GeForce GTX 1060 6GB isn’t present in the RGB Step database; please ensure it’s included.
Your GPU of type NVIDIA GeForce GTX 1060 6GB isn’t present in the RGB Res database; please make sure it’s added.
Your GPU of type NVIDIA GeForce GTX 1060 6GB isn’t present in the SO3 Step database; please ensure it’s included.
在处理数据过程中,未充分利用本机显卡。虽然不影响S程序主体运行,但这些提示令人感到不满,必须找出问题所在。在GUI/build目录中运行./GUITest,以获取电脑相关信息。将这些信息复制至/Core/src/Utils/GPUConfig.h,完成显卡配置。
3.3 Pangolin error:Building Tests requested, but Catch2 library not found.
在工程项目的CMake列表文件中,定位并更改为find_package(Catch2 REQUIRED)。



需要注意的是,这里的配置文件路径为Catch2Config.cmake.in,而非Catch2Config.cmake。因此,在执行命令cmake .. -DMAKE_PREFIX_PATH=/home/dell/Downloads/Catch2-2.13.7/CMake/Catch2Config.cmake.in后,仍然出现错误。建议尝试重新编译源码并安装Catch2。
#Catch2
cd Catch2-2.13.7
mkdir build && cd build
cmake ..
make
sudo make install
3.4 error:OpenGL有两个,需要指定
在 CMakeLists.txt 添加
if (POLICY CMP0072)
set(OpenGL_GL_PREFERENCE LEGACY)
endif()
3.5 error:undefined reference to ‘pthread_detach’/‘pthread_create’
头文件添加 #include "pthread.h"
3.6 error:‘decay_t’ is not a member of ‘std’;
在 CMakeLists.txt 添加 set(CMAKE_CXX_STANDARD 14)
四、实采数据测试
4.1 实时数据【Kinect V2】
4.1.1 准备工作——配置openni2和libfreenect2
libfreenect2之前已经配置过,并且获取过数据。
ElasticFusion编译成功后运行测试数据集未发现问题,但在GUI/build目录中运行ElasticFusion程序时出现错误提示,于是开始排查问题。
Creating live capture... failed!
DeviceOpen using default:no devices found!
对可能出问题最多的几个地方进行了测试,包括pangolin、libfreenect2、openni2。测试顺序依次为pangolin、libfreenect2、openni2。其中,pangolin运行正常;libfreenect2运行Protonect测试,窗口显示正常;而openni2在测试NiViewer时出现错误,与运行ElasticFusion时的错误相同。
openDevice failed:
DeviceOpen using default:no devices found!
press any key to continue...
为了确认openni2的安装状态(使用的是他人的电脑,之前尝试过多个slam框架,安装依赖项时都较为顺利,这次想再次确认安装情况)
#安装依赖项
sudo apt-get install git g++ python libusb-1.0-0-dev libudev-dev openjdk-8-jdk freeglut3-dev graphviz doxygen
#下载源码
git clone https://github.com/occipital/OpenNI2
cd OpenNI2
make
sudo make install
#测试
请注意,ElasticFusion平台基于openni2框架实现,而kinect2系列设备则通过libfreenect2框架进行驱动。在编译过程中,需要对openni2平台和libfreenect2框架进行相应的配置设置。
重新编译libfreenect2
cd libfreenect2
mkdir build && cd build
cmake .. -DBUILD_OPENNI2_DRIVER=ON
make
sudo make install
sudo cp ../platform/linux/udev/90-kinect2.rules /etc/udev/rules.d/
验证Protonect程序的可执行性,观察其运行状态。在libfreenect2的构建目录./build/lib中,确保将两个动态链接库文件libfreenect2-openni2.so和libfreenect2-openni2.so.0复制至指定路径OpenNi2/Bin/x64-Release/OpenNi2/Drivers下。随后,在OpenNi2的Bin文件夹中,执行可执行文件./Bin/x64-Release/NiViewer,观察其运行结果。整个操作过程中,确保所有复制和执行步骤均已完成,最终观察到成功显示图像窗口的状态。
当设备无法定位时,建议在 libfreenect2/build 目录内运行相应的命令序列,以启动摄像头窗口。
sudo apt-get install openni2-utils
sudo make install openni2
NiViewer
重新编译openni2和libfreenect2完成后,同时需要重新编译ElasticFusion,并相应地,需要重新执行第二部分的流程。然而,随后又出现了新的问题,具体报错信息如下。
OpenNI2Interface::OpenNI2Interface(int, int, int): Assertion `findMode(width, height, fps) && "Sorry, mode not supported!"‘ failed.
我检查了OpenNI2Interface.cpp文件,未发现相关问题。查阅后得知,解决方法是将MainController.cpp第37行的Resolution::getInstance(640, 480)改为Resolution::getInstance(512, 424)。
4.1.2 使用Elasticfusion运行实时数据
在 ElasticFusion/GUI/build 目录下,执行./ElasticFusion 即可,即可完成生成 .ply 文件和 .freiburg 文件的任务。这些文件将自动地被保存在 ElasticFusion/GUI/build/CMakeFiles 目录中。
我使用手持式设备进行扫描,但效果却不尽如人意。我尝试在一个由两间完全打通的房间构成的复杂场景中进行扫描,经过一上午的持续扫描,特别是在拐角、竖梁和半隔断等复杂结构处,扫描结果出现了严重的混乱,许多扫描点未能准确匹配,甚至出现横七倒八的现象。为了提高扫描质量,我已尽力以等距、慢速的方式扫描墙面。但目前尚不清楚具体的测试方法,是使用固定支架、机器人或小型移动设备进行操作?如果有相关经验或建议,恳请您不吝赐教!
4.2 TUM离线数据
4.2.1 安装依赖项及数据包
需要CMake、Boost、zlib、libjpeg、OpenCV,及numpy(Python包)
sudo apt-get install g++ cmake cmake-gui libboost-all-dev build-essential
OpenCV:访问https://opencv.org/releases/,根据需求选择版本下载后进行编译安装。也可通过命令行方式安装。numpy:通过sudo pip安装numpy,具体安装路径和包管理可参考官方文档。
4.2.2 TUM数据下载及预处理
我成功获取了“freiburg2_desk”和“freiburg2_pioneer_slam2”两个场景数据集。每个数据集都附有详细的说明文档,建议根据个人需求下载。
数据转换 png_to_klg可从GitHub仓库 https://github.com/HTLife/png_to_klg 获得。操作步骤包括:将associate.py文件复制至数据集文件夹,并将深度数据与对应的RGB数据配对生成associations.txt文件。代码示例如下:
./associate.py depth.txt rgb.txt > associations.txt
说明:这里默认使用Python2,如果需要运行Python3,则需要进行一些调整和配置。为了简化操作,我选择运行Python2环境,同时确保安装路径正确,避免出现无法加载的问题。
4.2.3 数据格式转换(png_to_klg)
cd png_to_klg
mkdir build && cd build
cmake ..
make
./pngtoklg -w '/数据集存储路径/' -o '/生成的.klg文件存储路径' -t #生成.klg文件
4.2.4 使用Elasticfusion运行TUM数据结果
cd Elasticfusion/GUI/build
./ElasticFusion -l (path to 生成的.klg文件)
4.2.5 误差测评
【未完待续】
TUM数据集平台: https://vision.in.tum.de/data/datasets/rgbd-dataset/tools
可访问的评估工具下载页面:evo早先版,基于ROS构建框架
可访问的评估工具下载页面:https://svncvpr.in.tum.de/cvpr-ros-pkg/trunk/rgbd_benchmark/rgbd_benchmark_tools/src/rgbd_benchmark_tools/
