Advertisement

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++标准库的版本不兼容有关。

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.solibfreenect2-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数据下载及预处理

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/

全部评论 (0)

还没有任何评论哟~