一.代码下载
本机环境为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行是新添加的链接库)
找到问题后,需要解决,例如这个问题需要添加链接库到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
$ 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.实际运行
大功告成!