此文档为编译ORB_SLAM3时的参考内容,因每个人电脑环境不完全相同,故请根据自己实际情况判断
Ubuntu 20.04编译ORB_SLAM3时的小Tips和LoopClosing.cc.o和Optimizer.cc.o报错解决方案
一、环境
Ubuntu 20.04,OpenCV 3.4.12 ,eigen 3.3.8
二、一些你可能需要和注意的小Tips
在编译OpenCV 3.4.12时,有几个和往常(基于Ubuntu 16.04/18.04 + opencv 3.2/较旧版本的3.4.x)不同的小细节:
1.可能需要在Cmake-gui里勾选 WITH_GTK_2_X
之前未勾选,在编译SLAM时有相关报错,具体报错已无法呈现,印象中会有类似“Not Found GTK_2.X”的错误(没错,报的是GTK_2.X,不是gui界面里的GTK_2_X)。查阅各种资料无果,突然在gui界面里看到了一个类似选项,默认未打勾,勾选后重新编译问题解决
2.可能并不需要安装第三方的opencv_contrib
之前在Ubuntu16.04 + opencv3.2 环境中编译SLAM3,是需要安装opencv_contrib的 ,否则虽然可以通过opencv的编译,但在SLAM3路径中./build.sh是不能通过编译的,会提示缺少很多包(甚至需要再去装一下Boost库才行)。
但在Ubuntu 20.04 + opencv 3.4.12中,添加了opencv_contrib/modules 额外包后,反而无法正常编译 opencv 3.4.12。gui界面报错内容大致为:检测到opencv 3.4.12 已包含包XX,与opencv_contrib冲突。解决方法也很简单了,移除添加的opencv_contrib/modules 路径即可(默认路径就是空的,所以如果是第一次安装,不填即可)
许多教程会强调在安装opencv时,请顺手安装opencv_contrib,这点在老版本上非常有必要,但在opencv 3.4.12 中可能会适得其反,应该是随着opencv 3.4.x的不断更新,已经将之前的第三方包纳入了opencv的大包中,所以无需重新安装了。
但如果你和我采用了相同环境,不安装opencv_contrib会出现问题,那还是请你乖乖再装一次opencv_contrib吧。不过这个过程应该会有一堆坑(我开始时是继续用的opencv 3.2 ,因为这是ORB_SLAM3项目所用的版本,但在安装opencv_contrib时,一会是这个包不能下载,一会是那个目录不可重复build,总之就是一堆大坑……)
3.LoopClosing.cc.o和Optimizer.cc.o报错的解决方案
参考的报错代码如下(仅为示例,具体报错内容可能略有区别):
CMakeFiles/ORB_SLAM2.dir/src/LoopClosing.cc.o’ failed
make[2]: *** [CMakeFiles/ORB_SLAM2.dir/src/LoopClosing.cc.o] Error 1
CMakeFiles/ORB_SLAM2.dir/src/Optimizer.cc.o’ failed
make[1]: *** [CMakeFiles/ORB_SLAM2.dir/src/Optimizer.cc.o] Error 2
解决方法:
你需要先往前看看报错内容,应该会有红字error出现,部分报错内容如下:
static assertion failed: std::map must have the same value_type as its allocator
指向的是一个叫LoopClosing.h的文件,对这个文件进行如下修改,就可以解决LoopClosing.cc.o报错了。
在47行找到public:,
修改
const KeyFrame*
为
KeyFrame *const
public:
typedef pair<set<KeyFrame*>,int> ConsistentGroup;
typedef map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,
//Eigen::aligned_allocator<std::pair<const KeyFrame*, g2o::Sim3> > > KeyFrameAndPose;这一行是未修改的代码,下方是修改后的
Eigen::aligned_allocator<std::pair<KeyFrame *const , g2o::Sim3> > > KeyFrameAndPose;
修改后就可以正常编译了,bug解决。
似乎Optimizer.cc依赖LoopClosing.cc的正常运行,在修复了LoopClosing.h文件后,两者都可以通过编译了,SLAM3编译成功。
总结
很感谢ORB_SLAM3项目的开源,虽然配置环境的过程有无数的大坑,但成功后还是有点小开心的。希望这篇博客可以帮助到需要编译ORB_SLAM3的同学,尤其是使用Ubuntu 20.04的同学,少走一点弯路。