ESVIO编译运行调试记录
本文最后更新于 2024年4月11日 下午
本文主要分享了自己在编译和运行论文《ESVIO: Event-based Stereo Visual Inertial Odometry》(下面简称为ESVIO)的代码时的调试记录。
ESVIO
概述
ESVIO是第一个基于双目事件的视觉惯性里程计框架,包括ESIO(纯粹基于事件)和ESVIO(事件加图像辅助)。双目事件角特征通过具有时空和指数衰减内核的基于事件的表示在时间和空间上关联。然后,双目事件跟踪器紧密耦合到基于滑动窗口图的优化框架中,以估计自我运动。
ESVIO 已在 IEEE RA-L 中发布,并带有 IROS2023 演示选项。 (IEEE RA-L pdf 可在此处获取,arxiv pdf 可在此处获取)。
如果您觉得ESVIO确实对您当前的研究或工作有所帮助,一个简单的星标或对我们作品的引用应该是对我们最好的肯定。 😊
1 |
|
1 |
|
演示
我们的视频演示可在 Bilibili 和 YouTube 上观看。
各种数据集的性能评估视频(包括与ORB-SLAM3、VINS-Fusion和 Ultimate-SLAM的对比)以及户外大型和机载无人机飞行的测试也可以在 Bilibili 上找到。
- https://www.bilibili.com/video/BV168411778U/
- https://www.bilibili.com/video/BV13G411T7eY/
- https://www.bilibili.com/video/BV1pg411H7Yo/
编译
系统配置
ESVIO使用的是 Ubuntu 20.04 与 ROS Noetic。
本人使用的是 Ubuntu 18.04 与 ROS Melodic。
新建工作区
1 |
|
此时,./catkin_ws
文件夹下有build
、devel
、logs
和src
四个文件夹。
配置依赖
1 |
|
VINS-Mono需要的依赖
ESVIO是在VINS-Mono框架下引入双目事件相机,因此需要配置VINS-Mono需要的依赖:
1 |
|
ESVIO需要的依赖
ESVIO所有依赖文件都存储在文件夹 ./catkin_ws/src/ESVIO/dependences
中。(可选)这里,我将整个dependences
文件夹移动到了上级文件夹/src
中,因为分析代码时一般用不到这些第三方库。
-
gflags_catkin
的Cmakelists.txt
会指定编译时联网下载文件v2.2.1.zip
到./catkin_ws/build/gflags_catkin/gflags_src-prefix/src
目录下,并在该目录下解压为gflags_src
。而编译时使用外网代理、网络不稳定时会下载失败,编译报错。为防止网路下载不稳定的情况,可以将下载链接替换为本地路径。下载v2.2.1.zip到
yourfolder/
并重命名为gflags-2.2.1.zip
。打开./catkin_ws/src/dependences/gflags_catkin
目录下的Cmakelists.txt
文件,修改URL
:1
2# URL https://github.com/gflags/gflags/archive/v2.2.1.zip
URL "/yourfolder/gflags-2.2.1.zip" -
glog_catkin
。与gflags_catkin
同理,下载eigen-3.3.4.tar.bz2,后:1
2
3# ./catkin_ws/src/dependences/glog_catkin/Cmakelists.txt
# URL https://github.com/google/glog/archive/v${VERSION}.zip
URL "/yourfolder/glog-0.3.5.zip"你可能需要
autoreconf
来编译glog_catkin,使用以下命令安装autoreconf
:1
2
3
4
5# https://askubuntu.com/questions/265471/autoreconf-not-found-error-during-making-qemu-1-4-0/269423#269423
# 查询可安装的版本
apt-cache search autoreconf
sudo apt-get install autoconf # 13.04/14.04/16.04/18.04
sudo apt install dh-autoreconf # 20.04 -
eigen_catkin
。与gflags_catkin
同理,下载glog-0.3.5,后:1
2
3# ./catkin_ws/src/dependences/eigen_catkin/CMakeLists.txt
# URL https://gitlab.com/libeigen/eigen/-/archive/3.3.4/eigen-3.3.4.tar.bz2
URL "/yourfolder/eigen-3.3.4.tar.bz2" -
yaml-cpp
用于从*.yaml
文件加载校准参数。yaml_cpp_catkin
与gflags_catkin
同理,下载yaml-cpp-11607eb5bf1258641d80f7051e7cf09e317b4746.zip,后:1
2
3
4
5
6# ./catkin_ws/src/dependences/yaml_cpp_catkin/Cmakelists.txt
# GIT_REPOSITORY https://github.com/jbeder/yaml-cpp
# GIT_TAG ${YAML_CPP_TAG}
URL "/yourfolder/yaml-cpp-11607eb5bf1258641d80f7051e7cf09e317b4746.zip"
URL_MD5 f2847f928634303a8ee305a3f28ebbcc
UPDATE_COMMAND "" -
ceres_catkin
。同理,下载ceres-solver-1.14.0.tar.gz,后:1
2
3
4
5# ./catkin_ws/src/dependences/cere_catkin/Cmakelists.txt
# GIT_REPOSITORY https://github.com/ceres-solver/ceres-solver.git
# GIT_TAG ${VERSION}
URL "/yourfolder/ceres-solver-1.14.0.tar.gz"
UPDATE_COMMAND ""由于
ceres
库和Eigen
库有一定的版本对应关系,因此很容易在编译期间报错。实测Eigen3.3.x
与ceres-solver-1.14.0
对应应该没有问题。 -
suitesparse
。根据./catkin_ws/src/dependences/ceres_catkin/package.xml
,ceres_catkin
的编译还需要suitesparse
。-
下载suitesparse:
1
2cd /yourfloder/catkin_ws/src/dependences
git clone https://github.com/ethz-asl/suitesparse.git -
下载SuiteSparse-4.2.1.tar.gz到
yourfolder/
。 -
这里我没有找到好的使用本地文件替换掉编译时下载的方法,只能:打开
./catkin_ws/src/dependences/suitesparse/suitesparse
目录下的Cmakelists.txt
文件,注释掉DOWNLOAD_COMMAND
:1
2# DOWNLOAD_COMMAND rm -f SuiteSparse-${VERSION}.tar.gz && wget --retry-connrefused --waitretry=1 --timeout=40 --tries 3 https://github.com/ethz-asl/thirdparty_library_binaries/raw/master/SuiteSparse-${VERSION}.tar.gz
DOWNLOAD_COMMAND "" -
在编译项目前,打开终端,执行命令:
1
2
3cd /yourfloder/catkin_ws/
mkdir -p build/suitesparse/suitesparse_src-prefix/src && cp /yourfloder/SuiteSparse-4.2.1.tar.gz ./build/suitesparse/suitesparse_src-prefix/src
# find -name SuiteSparse-4.2.1.tar.gz
-
-
(可选)使用CLion编译项目时
./catkin_ws/src/dependences/minkindr/minkindr_python
会报错找不到文件catkin_boost_python_buildtool
和numpy_eigen
(使用终端编译时不会报错)。猜测是CLion会自动编译工作区内所有的包,而使用终端编译时只指定了特定的包。解决方法:下载catkin_boost_python_buildtool和numpy_eigen后解压放到
./catkin_ws/src/dependences/
文件夹下重新编译。
(可选)指定项目编译使用的OpenCV版本
检查项目中所有的CmakeList.txt
文件,新增语句:
1 |
|
涉及到的项目有:
dependences/rpg_dvs_ros/dvs_calibration/CMakeLists.txt
dependences/rpg_dvs_ros/dvs_renderer/CMakeLists.txt
ESVIO/camera_model/CMakeLists.txt
ESVIO/esvio_estimator/CMakeLists.txt
ESVIO/feature_tracker/CMakeLists.txt
ESVIO/pose_graph/CMakeLists.txt
ROS编译
基本流程
(可选)如果使用本地下载的suitesparse
:
1 |
|
编译项目:
1 |
|
加速编译:
catkin build
命令会自动执行多线程,使用最快的编译速度。
catkin_make -j2 -l2
:
- -j2,j 是 job 的意思,代表允许 2 个编译命令同时进行,一般是以 CPU的核心数目的两倍为。
- -l2,l 是 load-average 的意思,代表系统加载的任务数,数目一般与-j的数目保持一致。
注意,此处不仅限于2,可以是2,4,8,这取决于你是几核CPU。
完整编译一次花费了
Runtime: 4 minutes and 47.9 seconds total
,在这期间你可以去泡一杯咖啡。
如果编译报错:
catkin clean
相当于rm -r ${build} ${devel}
,但是避免了rm -r
这种危险的操作!
报错及解决
报错:SyntaxError: Non-ASCII character '\xe5' in file /catkin_ws/src/dependences/rpg_dvs_ros/dvxplorer_ros_driver/cfg/DVXplorer_ROS_Driver.cfg on line 71, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
原因:Python默认是以ASCII作为编码方式的,如果在自己的Python源码中包含了中文(或者其他非英语系的语言),此时即使你把自己编写的Python源文件以UTF-8格式保存了,但实际上,这依然是不行的。
解决:在./catkin_ws/src/dependences/rpg_dvs_ros/dvxplorer_ros_driver/cfg/DVXplorer_ROS_Driver.cfg
的第一行加入:
1 |
|
小技巧
你可以通过创建一个shell
脚本来自动执行这个编译过程,而不需要依次在终端输入命令:
-
在ROS工作空间(例如,
catkin_ws
文件夹)下创建一个脚本文件,例如buildESVIO.sh
。 -
写入内容,例如:
1
2
3
4
5
6
7
8
9
10#!/bin/bash
set -e
# catkin clean - y
mkdir -p build/suitesparse/suitesparse_src-prefix/src && cp /yourfloder/SuiteSparse-4.2.1.tar.gz ./build/suitesparse/suitesparse_src-prefix/src
sleep 3s
catkin build camera_model
sleep 3s
catkin build -
给脚本文件授予权限:
1
sudo chmod 755 runROS.sh
-
运行脚本文件:
1
2cd catkin_ws
./buildESVIO.sh -
完成。
添加环境变量(可选)
代码编译完成,后面需要运行ros命令,为了避免每次打开新的shell都需要source,我们将其添加到bash配置文件中。
1 |
|
注,vim按键:
1 |
|
运行
rpg_dvs_ros
事件数据可视化:
1 |
|
在HKU数据集上运行
下载我们的rosbag文件(HKU数据集)
我们的评估数据集可以从我们的One-drive或百度网盘下载。我们总共发布了9个用于评估ESVIO的rosbag文件,这些数据集的介绍可以在这个页面找到。
为了方便社区,我们还以 rosbag 的形式发布了我们方法的原始结果。
运行举例
下载我们的bag文件后,您现在可以运行我们的示例:
1 |
|
其它数据集的运行大同小异,详见ESVIO/script/run.sh
。
1 |
|
对于运行 VECtor 和 DSEC 数据集时警告“Not enough features or parallax; Move device around”:
- 可以修改
stereo_estimator_node.cpp
中的IMU读入部分,从flight version切换到normal version(参见代码)。- 在配置文件中调整相机和 IMU 之间的外部参数。有关修改的指导,请参阅
esvio/esvio.yaml
文件中与flight version相关的注释。
在事件相机上运行
暂无需求,略。