• 【SLAM】SVO2.0编译运行和论文代码解读


    SVO2是我遇到的最难编译的代码了,毕竟公开版本怎么能放最好的代码呢,搞了快一个星期,终于跑起来了。

    github:GitHub - uzh-rpg/rpg_svo_pro_open

    论文:https://rpg.ifi.uzh.ch/docs/TRO17_Forster-SVO.pdf

    1.安装和运行eurocDemo

    主要参考这一篇博客进行操作的,作者写了2种编译方式,但是两种方式都需要执行的,先执行第一种,再执行第二种。此外作者介绍了一个挂梯子的办法,很不幸我复现失败。有几个地方需要补充一下:

    创建工作空间

    mkdir svo_ws && cd svo_ws

    catkin相关配置

    1. # see below for the reason for specifying the eigen path
    2. catkin config --init --mkdirs --extend /opt/ros/ --cmake-args -DCMAKE_BUILD_TYPE=Release -DEIGEN3_INCLUDE_DIR=/usr/include/eigen3

    将上面出现的替换成你ROS的名称(18为"melodic",20为"noetic")。

    下载原码

    1. cd src
    2. git clone git@github.com:uzh-rpg/rpg_svo_pro_open.git
    3. vcs-import < ./rpg_svo_pro_open/dependencies.yaml

    把上面的git@github.com: 替换成https://github.com/,同样dependencies.yaml里面依赖的库地址也写上同样的修改。

    但是非常的不幸,哪怕是这样,我的控制台也下不下来这些代码...我用了google浏览器+ghelper,只能沙比地在网页下载这些代码的.zip文件再解压缩的方法下这些代码了。注意的是这些依赖的库和svo2的代码都是平级的关系,都放在src路径里。

    后来看到这篇博客,发现是我的配置佩错了,可以在上面每一个git clone后面加上:

    git clone https://XXXXXX.git --config http.proxy= --config http.sslVerify=false

    有一个叫做dbow2_catkin的库,它的CmakeList.txt也需要下载代码:

    1. ExternalProject_Add(dbow2_src
    2. #GIT_REPOSITORY git@github.com:dorian3d/DBoW2.git
    3. GIT_REPOSITORY https://github.com/dorian3d/DBoW2.git
    4. CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CATKIN_DEVEL_PREFIX}
    5. BUILD_COMMAND CXXFLAGS=-i${CATKIN_DEVEL_PREFIX}/include make
    6. INSTALL_COMMAND make install
    7. )

    同样下不下来一时陷入了僵局,我还是通过google浏览器下载了这个代码,然后解压到svo_ws/build/dbow2_catkin/dbow2_src-prefix/src路径下,就实现了对上面这个指令的人工替换。放进去后,注释掉GIT_REPOSITORY这一行就可以编译了。

    这个代码和一般catkin_make不一样,要进入到src下catkin build,这样就可以看出来哪些编译成功,哪些没编译成功。然后按照上面博客链接的做,最后终于编译成功了,然后跑一个euroc的demo试试,马上又被教做人。

    运行:

    roslaunch svo_ros euroc_vio_mono.launch

    马上报了个这个错误,幸运的是挂掉的时候会告诉你是哪个程序挂掉的。根据上面的指示,是在回环检测模块初始化加载词袋的时候挂的,在官方readme里,他说是因为没有把词袋下载下来,要执行这个命令:

    cd rpg_svo_pro_open/svo_online_loopclosing/vocabularies && ./download_voc.sh

    但是,问题的关键是,我下了词袋,这些都有,还是会报错..

    还有在svo_ws/src/rpg_svo_pro_open/svo_cmake/cmake/Modules/SvoSetup.cmake的6-7行,这两个都要设为true。

    1. SET(USE_LOOP_CLOSING TRUE)
    2. SET(USE_GLOBAL_MAP TRUE)

    怎么办?那就只能,在哪里摔倒,就从哪里绕过去,你的回环检测很牛,我不用总行吧?把上面的USE_LOOP_CLOSING设为false,svo_ws/src/rpg_svo_pro_open/svo_ros/param/vio_mono.yaml的runlc设为false,再运行,还是报错...

    既然这样,那就在工程里,全局搜索#ifdef SVO_LOOP_CLOSING出现的所有位置,把变量lc_出现的位置统统注释掉,报错的位置是在svo::loadVoc(),只把这里注释掉是不够的,之后运行的时候调用回环检测模块lc_的时候还是会挂,所以要把lc_执行的地方统统注释掉,

    运行,终于OK了:

     如果有大佬成功运行官方回环检测的欢迎下方评论区留言。

    2.论文解读

    参考博客1博客2

    虽然这是半直接法的VO/VIO,但是读这篇代码就像是走迷宫一样间接,找了半天发现核心函数是FrameHandlerBase::addFrameBundle(),我主要关注mono模式,所以找到它调用了FrameHandlerMono::processFrameBundle()函数。

    TODO

  • 相关阅读:
    计算机毕业设计ssm基于协同过滤推荐算法的新闻推荐系统43149系统+程序+源码+lw+远程部署
    驱动开发:内核取ntoskrnl模块基地址
    spring-boot-admin-starter-server监控springboot项目
    2022款华硕灵耀pro16和华硕proart创16区别哪个好哪个更值得入手
    Linux shell编程学习笔记2:我是谁 | who am i ?
    CSS-clamp 函数说明
    多模型知识图谱
    2.MongoDB 用户管理
    SiC MOSFET的短路特性及保护
    每日学一个设计模式22——命令模式
  • 原文地址:https://blog.csdn.net/iwanderu/article/details/126557733