采用Ubuntu 20.04 + OpenCV 3.4.12,编译ORB_SLAM3的小Tips和LoopClosing.cc.o与Optimizer.cc.o报错的解决方案

此文档为编译ORB_SLAM3时的参考内容,因每个人电脑环境不完全相同,故请根据自己实际情况判断

一、环境

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的同学,少走一点弯路。

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值