【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相关配置

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

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

下载原码

   cd src
   git clone [email protected]:uzh-rpg/rpg_svo_pro_open.git
    vcs-import < ./rpg_svo_pro_open/dependencies.yaml

把上面的[email protected]: 替换成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也需要下载代码:

ExternalProject_Add(dbow2_src
  #GIT_REPOSITORY [email protected]:dorian3d/DBoW2.git
	GIT_REPOSITORY https://github.com/dorian3d/DBoW2.git
  CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CATKIN_DEVEL_PREFIX}
  BUILD_COMMAND CXXFLAGS=-i${CATKIN_DEVEL_PREFIX}/include make
  INSTALL_COMMAND make install
)

同样下不下来一时陷入了僵局,我还是通过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。

SET(USE_LOOP_CLOSING TRUE)
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了:【SLAM】SVO2.0编译运行和论文代码解读_第1张图片

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

2.论文解读

参考博客1,博客2。

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

TODO

你可能感兴趣的:(SLAM,人工智能,自动驾驶,c++)