ORB-SLAM2编译、安装等问题汇总大全(Ubuntu20.04、eigen3、pangolin0.5、opencv4.5.5)

ORB-SLAM2编译、安装等问题汇总大全(Ubuntu20.04、eigen3、pangolin0.5、opencv4.5.5)

1. 环境说明

  • 使用的Linux发行版本为Ubuntu 20.04.
  • eigen版本为3.2.92,本来是3.3.7,为了避免与ceres的冲突降了版本。
  • pangolin版本为0.5,貌似高版本在编译ORB-SLAM2时会出现很多问题。
  • opencv版本为4.5.5,版本非常新,较opencv3有比较大的改动,还是建议opencv3.
  • Sophus使用的是非模板类的
  • G2O和DBoW2 都是使用第三方文件夹自带的。

2. 源码下载

ORB-SLAM2有许多改进版本、注释版本等,我安装的是初始版本。

地址为:raulmur/ORB_SLAM2: Real-Time SLAM for Monocular, Stereo and RGB-D Cameras, with Loop Detection and Relocalization Capabilities (github.com)

另外还有大佬在博客整理了许多改进版本的下载地址: 超全汇总 | ORB-SLAM2 / ORB-SLAM3 相关改进代码!_3D视觉工坊的博客-CSDN博客

还有一个比较推荐的注释版本:推荐的注释版地址

数据集及associate.py下载地址:Computer Vision Group - Dataset Download (tum.de)

3. 报错处理

3.1 Opencv相关报错

  • FATAL_ERROR "OpenCV > 2.4.3 not found."的错误

    • 修改cmakelist.txt,将opencv3.0改为4.5.5,我遇到两个地方,一个是orbslam2文件夹,另一个好像是DBoW2文件夹,可以根据错误信息查看。比如:
     find_package(OpenCV 4.5.5 QUIET)
     if(NOT OpenCV_FOUND)
        find_package(OpenCV 2.4.3 QUIET)
        if(NOT OpenCV_FOUND)
           message(FATAL_ERROR "OpenCV > 2.4.3 not found.")
        endif()
     endif()
    
  • 多个文件出现#include 的错误

    这个问题主要是opencv4更换了一些定义,需要替换为:

    #include
    #include 
    

    CV_LOAD_IMAGE_UNCHANGED的错误
    同样的,在opencv4中名称也改了不少,对应处替换为:

    cv::IMREAD_UNCHANGED
    
  • 这个错误我倒是没有遇到过:

    undefined reference to symbol '_ZN5boost6system15system_categoryEv’的报错
    需要在cmakelists.txt中增加-lboost_system,如下所示:

    set(LIBS
    ${OpenCV_LIBS}
    ${EIGEN3_LIBS}
    ${Pangolin_LIBRARIES}
    ${PROJECT_SOURCE_DIR}/../../../Thirdparty/DBoW2/lib/libDBoW2.so
    ${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so
    ${PROJECT_SOURCE_DIR}/../../../lib/libORB_SLAM2.so
    -lboost_system
    )
    
  • 这个也没有遇到:

    运行rosrun ORB_SLAM2 RGBD xxxxxxx时出现Failed to load module "canberra-gtk-module"的错误

    sudo apt-get install libcanberra-gtk-module
    

    参考:(15条消息) ORB-SLAM2在OpenCV4.1.1下的编译问题_K4762的博客-CSDN博客

3.2 Pangolin 环境配置

下载地址:Pangolin 0.5下载

  • error: ‘AV_PIX_FMT_XVMC_MPEG2_MC’ was not declared in this scope

    解决方法:在/Pangolin/CMakeModules/FindFFMPEG.cmake中63,64行,

            sizeof(AVFormatContext::max_analyze_duration2);
          }" HAVE_FFMPEG_MAX_ANALYZE_DURATION2
    

    换成:

            sizeof(AVFormatContext::max_analyze_duration);
          }" HAVE_FFMPEG_MAX_ANALYZE_DURATION
    

    /Pangolin/src/video/drivers/ffmpeg.cpp中第37行 namespace pangolin上面加上:

    #define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
    

    第78,79行

    TEST_PIX_FMT_RETURN(XVMC_MPEG2_MC); 
    TEST_PIX_FMT_RETURN(XVMC_MPEG2_IDCT);
    

    改为:

    #ifdef FF_API_XVMC
        TEST_PIX_FMT_RETURN(XVMC_MPEG2_MC);
        TEST_PIX_FMT_RETURN(XVMC_MPEG2_IDCT);
    #endif
    

    101-105行

        TEST_PIX_FMT_RETURN(VDPAU_H264);
        TEST_PIX_FMT_RETURN(VDPAU_MPEG1);
        TEST_PIX_FMT_RETURN(VDPAU_MPEG2);
        TEST_PIX_FMT_RETURN(VDPAU_WMV3);
        TEST_PIX_FMT_RETURN(VDPAU_VC1);
    

    改为:

    #ifdef FF_API_VDPAU
        TEST_PIX_FMT_RETURN(VDPAU_H264);
        TEST_PIX_FMT_RETURN(VDPAU_MPEG1);
        TEST_PIX_FMT_RETURN(VDPAU_MPEG2);
        TEST_PIX_FMT_RETURN(VDPAU_WMV3);
        TEST_PIX_FMT_RETURN(VDPAU_VC1);
    #endif
    

    127行

    	TEST_PIX_FMT_RETURN(VDPAU_MPEG4);
    

    改为:

    #ifdef FF_API_VDPAU
        TEST_PIX_FMT_RETURN(VDPAU_MPEG4);
    #endif
    
  • error: ‘AVFMT_RAWPICTURE’ was not declared in this scope

    解决办法,在Pangolin/include/pangolin/video/drivers/ffmpeg.h开头加上

    #define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
    #define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
    #define AVFMT_RAWPICTURE 0x0020
    
    • 如果报pangolin找不到eigen

      到Pagolin/src文件夹下,在CMakeList.txt中删去下面这段代码(屏蔽掉ffmpeg的影响):

      find_package(FFMPEG QUIET)
      if(BUILD_PANGOLIN_VIDEO AND FFMPEG_FOUND)
        set(HAVE_FFMPEG 1)
        list(APPEND INTERNAL_INC  ${FFMPEG_INCLUDE_DIRS} )
        list(APPEND LINK_LIBS ${FFMPEG_LIBRARIES} )
        list(APPEND HEADERS ${INCDIR}/video/drivers/ffmpeg.h)
        list(APPEND SOURCES video/drivers/ffmpeg.cpp)
        list(APPEND VIDEO_FACTORY_REG RegisterFfmpegVideoFactory )
        list(APPEND VIDEO_FACTORY_REG RegisterFfmpegVideoOutputFactory )
       
        if(_GCC_)
          # FFMPEG is a real pain for deprecating the API.
          set_source_files_properties(video/drivers/ffmpeg.cpp    PROPERTIES COMPILE_FLAGS "-Wno-deprecated-declarations")
        endif()
        message(STATUS "ffmpeg Found and Enabled")
      endif()
      

    参考:(15条消息) 视觉SLAM十四讲 Ubuntu20.04 Pangolin 环境配置_图南i的博客-CSDN博客_pangolin配置

3.3 usleep(3000)错误

在System.h中,加一下这些头文件:

#include 
#include 
#include 

3.4 value标红

(https://img-blog.csdnimg.cn/2cfbf883e1714a25846a763ec31a10a7.png)
ORB-SLAM2编译、安装等问题汇总大全(Ubuntu20.04、eigen3、pangolin0.5、opencv4.5.5)_第1张图片

3.5 ORB-SLAM2一直初始化

将src文件夹下的Initializer.cc 892行

if(cosParallax<0.99998){
	vbGood[vMatches12[i].first]=true;
}

改为:

if(cosParallax<0.99998){
	vbGood[vMatches12[i].first]=true;
	nGood++;
}

ORBmatcher.cc文件第478行

int bin = round(rot*factor);

改为:

int bin = round(rot/(360.0f*factor));

参考:https://github.com/raulmur/ORB_SLAM2/issues/59

3.6 associate.py 没安装numpy

在运行RGB-D时,需要利用associate.txt把深度图与颜色图结合起来:

缺少numpy库时:

sudo apt-get install python3-pip#安装pip
pip3 install numpy #或者其他包,注意这里需要用pip3

然后运行

python associate.py rgb.txt depth.txt > associate.txt

如果报错,那么由于Python2和python3语法的差别,需要将associate.py中第86行87行的:

    first_keys = first_list.keys()
    second_keys = second_list.keys()

改为:

    first_keys = list(first_list.keys())
    second_keys = list(second_list.keys())

参考:(16条消息) TUM数据集associate.py使用小坑_u012796629的博客-CSDN博客

3.7 测试数据集

参考:(15条消息) 视觉SLAM ——用TUM数据集测试orb-slam2_Zachary Yu的博客-CSDN博客

github的官方文档里也写得很清楚。

你可能感兴趣的:(SLAM,学习,机器学习入门,opencv,计算机视觉,人工智能,ubuntu,linux)