Ubuntu20.04配置并运行LSD_SLAM,实测可行

一.代码下载

本机环境为Ubuntu20.04,opencv3.4.11,Qt5.12.8,其他库版本影响不大

我使用的开源代码为,这个是基于Ubuntu18.04实现的,本人在改的时候废了不少功夫,大概徘徊了4天,最后连续工作9小时解决了环境配置问题(建议刚接触的同学安装Ubuntu18.04,环境配起来会轻松许多,当然,在配置自己的环境时也学到了很多,作此纪录)。

我用的代码如下(和我的20.04并不适配,也需要进行修改,具体问题参考第二部分)

https://github.com/Rick0514/Ubuntu18.04-LSD-SLAM

二.BUG修复

新建一个工作空间catkin_ws,新建一个src文件夹,存放源码,代码下载好后,终端执行代码catkin_init_workspace,初始化工作空间,生成CMakeLists.txt文件,之后回到上一级目录,执行代码catkin_make编译代码

1. Eigen::aligned_allocator< std::pair<const Frame*,Sim3> > >中pair的问题

具体原因不详,应该是pair的问题,改成const就行了,在网上找到解决办法:打开Frame.h164行,将

std::unordered_multimap< Frame*, Sim3, std::hash<Frame*>, std::equal_to<Frame*>,
        Eigen::aligned_allocator< std::pair<const Frame*,Sim3> > > trackingFailed;

改为

std::unordered_multimap< Frame*, Sim3, std::hash<Frame*>, std::equal_to<Frame*>,
        Eigen::aligned_allocator< std::pair<Frame *const ,Sim3> > > trackingFailed;

2.同上一个问题

具体原因不详,在网上找到解决办法:打开SlamSystem.cpp1241行,将

std::map< Frame*, Sim3, std::less<Frame*>, Eigen::aligned_allocator<std::pair<Frame*, Sim3> > > candidateToFrame_initialEstimateMap;

改为

std::map< Frame*, Sim3, std::less<Frame*>, Eigen::aligned_allocator<std::pair<Frame *const, Sim3> > > candidateToFrame_initialEstimateMap;

3.又是一个涉及C++底层的问题,经查阅资料找到解决方法

具体原因不详,在网上找到解决办法:

IndexThreadReduce.h只需要加入即可:

using namespace std;

using namespace placeholders;(主要是这个)

4.看似和1、2问题相同

这里和1、2并不相同,没有使用pair,而是直接的std::vector,我在这卡了很长时间,因为发现代码里182行就不会报错,很纳闷,为什么183行就不行了。后来发现是作者代码写错了,前后不是一个类,这当然不行啊,遂改之。

打开KeyFrameGraph.h183行,将

std::vector< KFConstraintStruct*, Eigen::aligned_allocator<FramePoseStruct*> > newEdgeBuffer;

改为

std::vector< KFConstraintStruct*, Eigen::aligned_allocator<KFConstraintStruct*> > newEdgeBuffer;

5.又是一个没见过的问题

根据报错提示和查阅资料,找到问题是编译Qt时需要添加编译选项,根据网上各种千奇百怪的解决方案,找到了实测可行的方法;

在lsd_slam_viewer的cmakeliststxt中加入fpic编译选项,具体为

可以在12行添加代码

add_compile_options(-fPIC)

再把42行下修改为

set(CMAKE_C_FLAGS
   "${CMAKE_C_FLAGS} -fpic"
)
set(CMAKE_CXX_FLAGS
   "${CMAKE_CXX_FLAGS} -fpic"
)

6.这个也困扰了很长时间

根据报错提示和查阅资料,网上也并没有这方面的解决方法,网上右的说法是链接库出错,但是自己去了链接库的文件查看了属性,发现并没有链接失败,那就只有一种可能了;就是链接库没有链接到项目里,所以,在lsd_slam_viewer文件夹下的CMakeeists.txt里添加链接库,具体修改完如下(6-8行是新添加的链接库)

参考链接

参考链接2

找到问题后,需要解决,例如这个问题需要添加链接库到target_link_libraries,根据报错缺少libQt5OpenGL.so.5,则需要链接Qt5OpenGL库,一共需要添加如下链接库

target_link_libraries(viewer ${QGLViewer_LIBRARIES}
                 ${QGLVIEWER_LIBRARY} 
                 ${catkin_LIBRARIES}
                 ${Boost_LIBRARIES}
                 ${QT_LIBRARIES}
                 Qt5OpenGL
                 Qt5Widgets
                 Qt5Core
                 GL glut GLU
             )

7.编译通过

三.实测运行

  1. 下载LSD_room数据集

# 打开终端1
$ roscore

# 打开终端2
$ source ./devel/setup.bash
$ rosrun lsd_slam_viewer viewer

# 打开终端3
$ source ./devel/setup.bash
$ rosrun lsd_slam_core live_slam image:=/image_raw camera_info:=/camera_info

# 打开终端4
$ rosbag play ~/LSD_room.bag

出现报错

double free or corruption(out)

Aborted(core dumped)

网上很多说法是eigen版本问题,说应该换成eigen3.2.5,但是本人花了一天时间去尝试,各种方法都试过了,都没有成功,期间几度崩溃。

Eigen是一个非常常用的矩阵运算库,至少对于SLAM的研究者来说不可或缺。然而,向来乖巧的Eigen近来却频频闹脾气,把我的程序折腾得死去活来,但是在解决的过程中却越来越坚信是eigen的问题,但为什么会出现double free呢,后来去查这方面的资料。终于发现了解决方法,可以参考这位大哥写的,很详细解释了eigen有关的内存对齐问题,从Eigen向量化谈内存对齐

因此,本例中解决方法为,修改lsd_slam_core下的CMakeLists.txt有关的编译选项,把-march=native去掉。修改如下(把65行改为69行)

至此,问题解决,重新catkin_make编译不会出现问题

2.实际运行

大功告成!

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值