ESVIO编译运行调试记录

本文最后更新于 2024年4月11日 下午

本文主要分享了自己在编译和运行论文《ESVIO: Event-based Stereo Visual Inertial Odometry》(下面简称为ESVIO)的代码时的调试记录。

ESVIO

概述

GitHub地址

ESVIO是第一个基于双目事件的视觉惯性里程计框架,包括ESIO(纯粹基于事件)和ESVIO(事件加图像辅助)。双目事件角特征通过具有时空和指数衰减内核的基于事件的表示在时间和空间上关联。然后,双目事件跟踪器紧密耦合到基于滑动窗口图的优化框架中,以估计自我运动。

ESVIO 已在 IEEE RA-L 中发布,并带有 IROS2023 演示选项。 (IEEE RA-L pdf 可在此处获取,arxiv pdf 可在此处获取)。

如果您觉得ESVIO确实对您当前的研究或工作有所帮助,一个简单的星标或对我们作品的引用应该是对我们最好的肯定。 😊

1
2
3
4
5
6
7
8
9
10
@article{ESVIO,
title={ESVIO: Event-based Stereo Visual Inertial Odometry},
author={Chen, Peiyu and Guan, Weipeng and Lu, Peng},
journal={IEEE Robotics and Automation Letters},
year={2023},
volume={8},
number={6},
pages={3661-3668},
publisher={IEEE}
}
1
2
3
4
5
6
7
8
@inproceedings{EIO,
title={Monocular Event Visual Inertial Odometry based on Event-corner using Sliding Windows Graph-based Optimization},
author={Guan, Weipeng and Lu, Peng},
booktitle={2022 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)},
pages={2438-2445},
year={2022},
organization={IEEE}
}

演示

我们的视频演示可在 Bilibili 和 YouTube 上观看。

各种数据集的性能评估视频(包括与ORB-SLAM3VINS-FusionUltimate-SLAM的对比)以及户外大型和机载无人机飞行的测试也可以在 Bilibili 上找到。

编译

系统配置

ESVIO使用的是 Ubuntu 20.04 与 ROS Noetic。

本人使用的是 Ubuntu 18.04 与 ROS Melodic。

ROS的安装与卸载

新建工作区

1
2
3
4
5
6
7
8
9
10
11
cd youfolder/
mkdir -p catkin_ws/src # catkin_ws可改名

cd catkin_ws
catkin config --init --mkdirs --extend /opt/ros/melodic --merge-devel --cmake-args -DCMAKE_BUILD_TYPE=Release

cd src
catkin_init_workspace # 创建顶层CMakeLists.txt文件,CLion利用此文件打开项目

cd ..
catkin build # 编译生成完整工作区

此时,./catkin_ws文件夹下有builddevellogssrc四个文件夹。

配置依赖

1
2
3
cd src
# 把代码总放在src文件夹下
git clone git@github.com:arclab-hku/ESVIO.git --recursive

VINS-Mono需要的依赖

ESVIO是在VINS-Mono框架下引入双目事件相机,因此需要配置VINS-Mono需要的依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看版本
# gcc g++
gcc -v
g++ -v
# cmake
cmake --version
# Eigen
gedit /usr/include/eigen3/Eigen/src/Core/util/Macros.h
# Opencv
pkg-config --modversion opencv # 查询版本
pkg-config --cflags opencv # 得到opencv的安装路径
# -> -I/usr/local/include/opencv -I/usr/local/include
pkg-config --cflags opencv4 # 附加:得到opencv4的安装路径

ESVIO需要的依赖

ESVIO所有依赖文件都存储在文件夹 ./catkin_ws/src/ESVIO/dependences 中。(可选)这里,我将整个dependences文件夹移动到了上级文件夹/src中,因为分析代码时一般用不到这些第三方库。

编译第三方开源软件需要下载的问题

  • gflags_catkinCmakelists.txt会指定编译时联网下载文件v2.2.1.zip./catkin_ws/build/gflags_catkin/gflags_src-prefix/src目录下,并在该目录下解压为gflags_src

    而编译时使用外网代理、网络不稳定时会下载失败,编译报错。为防止网路下载不稳定的情况,可以将下载链接替换为本地路径。下载v2.2.1.zipyourfolder/并重命名为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"

    注:URL可以直接使用本地绝对地址,但是文件必需为压缩文件,编译时会自动解压。官方文档中文解读1中文解读2

  • 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_catkingflags_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.xceres-solver-1.14.0对应应该没有问题。

  • suitesparse。根据./catkin_ws/src/dependences/ceres_catkin/package.xmlceres_catkin的编译还需要suitesparse

    1. 下载suitesparse

      1
      2
      cd /yourfloder/catkin_ws/src/dependences
      git clone https://github.com/ethz-asl/suitesparse.git
    2. 下载SuiteSparse-4.2.1.tar.gzyourfolder/

    3. 这里我没有找到好的使用本地文件替换掉编译时下载的方法,只能:打开./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 ""
    4. 在编译项目前,打开终端,执行命令:

      1
      2
      3
      cd /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_buildtoolnumpy_eigen(使用终端编译时不会报错)。猜测是CLion会自动编译工作区内所有的包,而使用终端编译时只指定了特定的包。

    解决方法:下载catkin_boost_python_buildtoolnumpy_eigen后解压放到./catkin_ws/src/dependences/文件夹下重新编译。

(可选)指定项目编译使用的OpenCV版本

OpenCV的安装与版本管理

检查项目中所有的CmakeList.txt文件,新增语句:

1
2
3
4
5
6
7
8
9
set(OpenCV_DIR /usr/local/opencv/opencv345/share/OpenCV)  # 新增
find_package(OpenCV REQUIRED)
# find_package(cv_bridge) # 如果find_package(OpenCV REQUIRED)报错
include_directories(${OpenCV_INCLUDE_DIRS}) # 新增
# 新增
message(STATUS "opencv version: ${OpenCV_VERSION}")
message(STATUS "opencv lib: ${OpenCV_LIBS}")
message(STATUS "opencv include dir: ${OpenCV_INCLUDE_DIRS}")
message(STATUS "opencv config path: ${openCV_CONFIG_PATH}")

涉及到的项目有:

  • 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
2
3
cd /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

编译项目:

1
2
3
4
5
6
cd /yourfloder/catkin_ws/
# catkin build esvio_estimator feature_tracker pose_graph -DCMAKE_BUILD_TYPE=Release -j8
catkin build camera_model # 不提前编译好camera_model,编译esvio_estimator的时候会报错。
catkin build # 或 catkin_make。相当于cmake+make
# 编译完成后,在代码运行前,须使用source命令刷新一下工作空间的环境。否则会出现找不到“package XXX not found” 的问题。
source ./catkin_ws/devel/setup.bash

加速编译:

  1. catkin build命令会自动执行多线程,使用最快的编译速度。

  2. 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
# -*- coding: UTF-8 -*-

小技巧

编写shell脚本

你可以通过创建一个shell脚本来自动执行这个编译过程,而不需要依次在终端输入命令:

  1. 在ROS工作空间(例如,catkin_ws文件夹)下创建一个脚本文件,例如buildESVIO.sh

  2. 写入内容,例如:

    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
  3. 给脚本文件授予权限:

    1
    sudo chmod 755 runROS.sh

    设置文件权限

  4. 运行脚本文件:

    1
    2
    cd catkin_ws
    ./buildESVIO.sh
  5. 完成。

添加环境变量(可选)

代码编译完成,后面需要运行ros命令,为了避免每次打开新的shell都需要source,我们将其添加到bash配置文件中。

1
2
3
4
5
6
7
8
9
# 方法一,使用gedit
echosource youfolder/catkin_ws/devel/setup.bash” >> ~/.bashrc
gedit ~/.bashrc # 注:用gedit打开文件,查看是否加入

# 方法二,使用vim
sudo vi ~/.bashrc # 注:打开.bashrc文件
# 最后一行添加:
source youfolder/catkin_ws/devel/setup.bash
# 注:点击键盘“E”,进入编辑(edit)模式,用“delete”键删除添加的路径

注,vim按键:

1
2
3
4
5
6
7
8
按Esc。输入 :wq!,保存并退出。
注:ESC”键退出编辑模式,并输入以下命令:
:wq 保存后退出vi,若为:wq!则为强制存储后退出
:w 保存但不退出
:w! 若文件属性为【只读】,强制写入该档案
:q 离开vi
:q! 若曾经修改过档案,又不想存储,使用!为强制离开不存储档案
:e! 将档案还原到最原始状态!

运行

rpg_dvs_ros

事件数据可视化:

1
2
source ./devel/setup.zsh && roslaunch dvs_renderer stereo_davis.launch
rosbag play -l /media/lll25655/Data/LLL25655/Documents/Dataset/ESVIO/StereoEVIO/VICON/hku_hdr_tran_rota.bag

在HKU数据集上运行

下载我们的rosbag文件(HKU数据集

我们的评估数据集可以从我们的One-drive或百度网盘下载。我们总共发布了9个用于评估ESVIO的rosbag文件,这些数据集的介绍可以在这个页面找到。

为了方便社区,我们还以 rosbag 的形式发布了我们方法的原始结果

运行举例

下载我们的bag文件后,您现在可以运行我们的示例:

1
2
3
4
5
6
7
8
9
10
11
# 对于ESIO(事件+imu)版本:
source ./devel/setup.zsh && roslaunch esvio_estimator esio.launch
rosbag play YOUR_DOWNLOADED.bag

# 对于ESVIO(事件+图像+imu)版本:
source ./devel/setup.zsh && roslaunch esvio_estimator esvio.launch
# rosbag play YOUR_DOWNLOADED.bag
rosbag play --clock --pause -r 1.0 /Dataset/ESVIO/StereoEVIO/VICON/hku_hdr_tran_rota.bag
--clock: 使用仿真时间(bag包录制时的时间)而不是系统时间(现实时间)。但实际上,没有设置过`rosparam set use_sim_time true`,所以在实际运行过程中并没有使用仿真时间。使用的还是系统时间?
--pause: 按下空格后才会开始播放bag包。
-r: 控制bag包播放的速率。

其它数据集的运行大同小异,详见ESVIO/script/run.sh

1
2
3
4
5
# DSEC
source ./devel/setup.zsh && roslaunch esvio_estimator esio_DSEC.launch
source ./devel/setup.zsh && roslaunch esvio_estimator esvio_DSEC.launch

rosbag play --clock --pause -r 1.0 /media/lll25655/Data/LLL25655/Documents/Dataset/ESVIO/DSEC/dsec_zurich_city_04_a.bag

.sh脚本一次性启动多个程序(对应多个终端)

对于运行 VECtor 和 DSEC 数据集时警告“Not enough features or parallax; Move device around”:

  1. 可以修改stereo_estimator_node.cpp中的IMU读入部分,从flight version切换到normal version(参见代码)。
  2. 在配置文件中调整相机和 IMU 之间的外部参数。有关修改的指导,请参阅esvio/esvio.yaml文件中与flight version相关的注释。

在事件相机上运行

暂无需求,略。


ESVIO编译运行调试记录
http://zeyulong.com/posts/c3a050a5/
作者
龙泽雨
发布于
2024年3月26日
许可协议