orb-slam2编译、安装等问题汇总大全(ubuntu20.04、eigen3、pangolin0.5、opencv4.5.5)_ww是头猪哇的博客-爱代码爱编程
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有许多改进版本、注释版本等,我安装的是初始版本。
另外还有大佬在博客整理了许多改进版本的下载地址: 超全汇总 | 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 <opencv/cv.h>的错误
这个问题主要是opencv4更换了一些定义,需要替换为:
#include<opencv2/imgproc/imgproc_c.h> #include <opencv2/highgui/highgui_c.h>
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
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 <unistd.h>
#include <stdio.h>
#include <stdlib.h>
3.4 value标红
(https://img-blog.csdnimg.cn/2cfbf883e1714a25846a763ec31a10a7.png)
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的官方文档里也写得很清楚。