ESVO编译运行调试记录

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

本文主要分享了自己在编译和运行论文《Event-Based Stereo Visual Odometry》(下面简称为ESVO)的代码时的调试记录,另附基于ESVO的拓展代码SEVIO和ESVO_extension的编译运行过程。

ESVO简介

ESVO 是一种利用双目事件相机实现实时视觉里程计的新型策略。提出的建图方法和跟踪方法都利用了统一的事件表示(时间表面) ,因此,它可以看作是一种“直接”的,以原始事件为输入的几何方法。

有关更详细的信息和测试事件数据,请参考ESVO项目页

相关出版物:

Source Code

项目文件解读

  1. ./ESVO/esvo_core/include/
    • ./container: 包含数据结构和数据容器类。
    • ./core: 标识了它属于核心功能的一部分。
    • ./optimization: 定义了一个模板结构体 OptimizationFunctor,用作 Eigen 非线性优化工具箱的通用基类(functor)。
    • ./tools: 包含实用程序和算法工具。
  2. ./ESVO/dependencies.yaml
    • dependencies.yaml文件列出了一个源代码项目在构建和运行时所依赖的外部库。这些库通过catkin构建系统进行管理,通常用于ROS(Robot Operating System)项目。每一个依赖项提供了三个关键信息:类型、URL和版本。在这个文件中,所有依赖项都是从Git仓库中获取的,且均指定为master分支。
    • 这个文件主要用于配置项目的依赖管理系统,确保所有所需的外部库均能被正确拉取并集成到项目中。这对于确保代码的一致性和可复现性是非常重要的。
  3. .launch
    • 这是一个ROS(Robot Operating System)的启动配置文件,用于启动ROS节点。
    • ./ESVO/esvo_time_surface/launch/rosbag_launcher/xxx/(xxx_)calib_info.launch:相机的内参矩阵 K(焦距和主点坐标)、畸变系数 D、旋转矩阵 R 和投影矩阵 P
    • ./ESVO/esvo_time_surface/launch/stereo_time_surface.launch: 启动esvo_time_surfaceROS节点(用于构造时间表面)。
    • ./ESVO/esvo_time_surface/launch/rosbag_launcher/xxx/rosbag.launch: 启动esvo_time_surfaceROS节点(播放rosbag包)。
    • ./ESVO/esvo_core/launch/system/system_xxx.launch: 启动esvo_coreROS节点(用于跟踪)。
    • ./ESVO/esvo_core/launch/mvstereo/mvstereo_xxx.launch: 启动esvo_coreROS节点(用于MVS建图)。
  4. ./ESVO/xxx/package.xml
    • 此文件是一个ROS(Robot Operating System)软件包的清单文件,用于定义包的基本信息和依赖关系。
    • 这个文件主要被ROS用来理解如何构建和维护程序包,并且定义了必要的信息,使得包可以在ROS生态中被正确找到和编译。
  5. ./ESVO/esvo_core/calib/xxx/(left/right).yaml
    • 一个YAML格式的文件,它包含了特定相机的标定参数。
    • 这些参数包括图像尺寸、相机内参矩阵、畸变模型和畸变系数、校正矩阵、投影矩阵以及右相机相对于左相机的变换矩阵。
    • 这种文件通常用于机器视觉和机器人系统,用来纠正相机拍摄图像的畸变,并将图像坐标转换为实际世界坐标。
  6. ./ESVO/esvo_core/cfg/DVS_MappingStereo.cfg
    • 该程序文件名为 DVS_MappingStereo.cfg 是一个配置脚本,它属于一个名叫 esvo_core 的包,并且这个项目与源代码项目 ESVO(Event-based Stereo Visual Odometry)相关。这个脚本使用 dynamic_reconfigure 功能,来允许实时修改运行中ROS节点的参数。
    • 在最后,脚本执行 generate 函数来创建一个用于动态配置的服务,该服务可以在ROS运行时动态调整上述参数。
  7. ./ESVO/esvo_core/cfg/tracking/tracking_xxx.yaml
    • 该文件tracking_xxx.yaml是一个配置文件,用于设置ESVO(Event-based Stereo Visual Odometry,基于事件的双目视觉里程计)的核心跟踪算法参数。该文件以YAML(YAML Ain't Markup Language)格式组织,它包含一系列键值对,用于控制视觉里程计跟踪流程中的不同方面。
    • 需要注意的是,PATH_TO_SAVE_TRAJECTORY的值可能需要根据实际环境进行修改。
  8. ./ESVO/esvo_core/cfg/time_surface/ts_parameters.yaml
    • 这个ts_parameters.yaml文件是一个配置文件,用于设定时间表面(Time Surface)参数。在事件相机数据处理中,时间表面是一种将事件信息编码成易于分析的形式。
  9. ./ESVO/esvo_core/cfg/mvstereo/mvstereo_xxx.yaml
    • 配置文件包含各种参数设置,这些参数影响了多视角双目视觉系统(Multi-View Stereo, MVStereo)的行为和性能。
  10. ./ESVO/esvo_core/cfg/mapping/mapping_xxx.yaml
  • 此文件包含用于调整 ESVO (Event-based Stereo Visual Odometry) 系统建图部分参数的配置文件。
  1. ./ESVO/xxx/.perspective
    • 这是一个JSON格式的配置文件,用于定义一个名为ESVO的软件项目中的esvo_time_surface插件的窗口布局和行为。基于文档结构,这看起来像是为图形用户界面(GUI),如rqt插件制定的配置。rqt是一个基于Qt的软件框架,它使得为机器人操作系统(ROS)创建丰富的图形界面变得简单。
    • 总的来说,这个配置文件为ESVO项目中的esvo_time_surface.perspective插件提供了窗口布局、插件状态和用户界面元素的详细信息。
  2. ./ESVO/esvo_core/.rviz
    • .rviz文件是一个用于配置 ROS (Robot Operating System) 可视化工具 RViz 的视图配置文件。RViz 是一个用来对机器人传感器数据、导航状态以及其他信息进行三维可视化的工具。这个文件定义了RViz中的一系列面板、显示项、视图以及工具的属性和设置。

数据集下载

原始数据集

rpg (University of Zurich)

upenn (University of Pennsylvania)

为了方便起见,我们提供了文中使用的经过编辑的rosbag文件。建议的版本如./events_repacking_helper下的README.md文件所述。

edited rpg stereo dataset

edited upenn stereo dataset

hkust stereo dataset

环境配置

1. 配置ROS

  • Ubuntu 18.04.5 LTS + ROS melodic + gcc 5.5.0 + cmake (>=3.10) + OpenCV 3.2
  • Ubuntu 16.04 LTS + ROS kinetic + gcc 5.4.0 + cmake (>=3.10) + OpenCV 3.2
  • Ubuntu 20.04 LTS + ROS Noetic + OpenCV 4
1
2
3
4
5
6
7
8
9
10
11
12
# 查看版本
# gcc
gcc -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的安装路径

提示:

  1. 对于Eigen,安装配置、使用3.3.0的版本,使用3.4.0版本会报错。可以参考链接:Eigen的安装与版本管理

  2. 对于OpenCV,安装配置、使用大于等于3.2.0的版本。推荐使用OpenCV的安装与版本管理中版本管理的方法2,即通过修改cv_bridge的配置文件来指定OpenCV的版本。最好在编译前将各个项目中的CmakeList.txt中的:

    1
    find_package(OpenCV REQUIRED)

    改为:

    1
    find_package(cv_bridge)

    来防止cmake时使用没有cv_bridge的配置文件来指定OpenCV的版本,还是自行寻找使用的系统中其它的版本,从而产生报错。

  3. 如果自己之前有源码安装的PCL,最好检查一下,不要安装到系统根目录下,也就是默认的/usr/local/下。如果安装到了/usr/local/下,最后链接PCL的库的时候会默认链接到这个路径下的库。但是绝大部分搭建在ROS上的工程都是使用ROS自带的pcl-1.8的,这个时候虽然编译可以通过,但是运行的时候会出错,且报错信息不会有这方面的提示。血泪教训。具体说明见下文。

  4. 如果终端是在conda环境下的话,最好提前退出conda环境,因为conda和ros有冲突:

    1
    conda deactivate
  5. 如果在编译运行过程中遇到了关于gcc、g++的版本问题,可以参考链接:gcc、g++的安装与版本管理

2. 配置事件相机驱动器

项目地址

ROS DVS 包为动态视觉传感器(DVS/DAVIS)提供 C++ 驱动程序。即使您没有 DAVS 或 DAVIS 设备,您仍然可以使用此驱动程序读取预先录制的事件数据文件。该软件包还提供了一个校准工具,为本征intrinsic和双目stereo校准。

将下面提到的ROS版本替换为你自己的版本。

  1. 安装ROS依赖项:

    1
    2
    3
    # melodic/kinetic/Noetic
    sudo apt-get install ros-melodic-camera-info-manager
    sudo apt-get install ros-melodic-image-view
  2. 安装libcaer

    1. 首先根据下面的网站iniVation documentation添加存储库:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      # Bionic (18.04 LTS) on the x86_64, x86, arm64 and armhf architectures
      sudo add-apt-repository ppa:ubuntu-toolchain-r/test
      sudo add-apt-repository ppa:inivation-ppa/inivation-bionic
      sudo apt-get update
      sudo apt-get install dv-gui

      # Focal (20.04 LTS) and Jammy (22.04 LTS) on the x86_64, arm64 and armhf architectures
      sudo add-apt-repository ppa:inivation-ppa/inivation
      sudo apt-get update
      sudo apt-get install dv-gui

      如果您计划开发自己的模块,请安装以下附加软件包:

      1
      sudo apt-get install dv-runtime-dev

      在 ARM 上,你可能需要使用以下环境变量来启动 dv 运行时:

      UNW_ARM_UNWIND_METHOD=4

    2. 安装libcaer:

      1
      sudo apt-get install libcaer-dev
  3. 安装catkin tools:

    1
    sudo apt-get install python-catkin-tools
  4. 创建一个catkin工作区:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    cd yourfolder
    mkdir -p catkin_ws/src
    cd catkin_ws
    catkin config --init --mkdirs --extend /opt/ros/melodic --merge-devel --cmake-args -DCMAKE_BUILD_TYPE=Release

    cd catkin_ws/src
    catkin_init_workspace
    cd ..
    catkin build
  5. 克隆catkin_simple包,它将用于构建 DVS/DAVIS 驱动程序包:

    1
    2
    cd yourfolder/catkin_ws/src
    git clone https://github.com/catkin/catkin_simple.git
  6. 克隆 rpg_dvs_ros 的存储库:

    1
    2
    cd yourfolder/catkin_ws/src
    git clone https://github.com/uzh-rpg/rpg_dvs_ros.git
  7. 构建软件包:

    1
    2
    3
    4
    5
    # 根据第9步的示例,运行DAVIS
    cd yourfolder/catkin_ws
    catkin build dvs_ros_driver # if you are using the DVS128
    catkin build davis_ros_driver # if you are using the DAVIS
    catkin build dvxplorer_ros_driver # if you are using the DVXplorer
  8. 您可以通过运行提供的启动文件来测试安装。它启动驱动程序(DVS 或 DAVIS)和渲染器(图像查看器)。

    1. 首先,构建渲染器:

      1
      2
      cd yourfolder/catkin_ws
      catkin build dvs_renderer

      如果编译报错:

      终端运行catkin clean命令相当于rm -r ${build} ${devel},但是避免了rm -r这种危险的操作!

      如果编译过程中OpenCV报错:

      • 20240109更新:编译catkin build dvs_renderer,在./catkin_ws/src/rpg_dvs_ros/dvs_renderer/CMakeLists.txt里使用OpenCV的安装与版本管理中版本管理的方法2失败,使用方法1成功。
      • 20240104更新:使用OpenCV的安装与版本管理中版本管理的方法2进行修改,即可。
    2. 建立环境:

      1
      2
      3
      4
      5
      6
      7
      8
      source yourfolder/catkin_ws/devel/setup.bash 
      # or if you use the zsh shell instead
      source yourfolder/catkin_ws/devel/setup.zsh
      # or
      source ./devel/setup.zsh
      # 如果不想每次都要刷新环境变量
      echo “yourfolder/catkin_ws/devel/setup.zsh” >> ~/.zshrc
      sudo gedit ~/.zshrc # 用gedit打开文件,查看是否加入
    3. 然后,启动示例(无示例,略):

      1
      2
      3
      roslaunch dvs_renderer dvs_mono.launch  # if you are using the DVS128
      roslaunch dvs_renderer davis_mono.launch # if you are using the DAVIS
      roslaunch dvs_renderer dvxplorer_mono.launch # if you are using the DVXplorer
    4. 得到运行结果。

  9. 如果您没有DAVIS,您仍然可以使用此驱动程序读取记录的文件。示例:

    1. 下载数据集的序列,如slider_deep.bag

    2. 打开第一个终端,启动roscore:

      1
      roscore
    3. 在第二个终端,播放bag包:

      1
      rosbag play -l path-to-file/slider_depth.bag 

      如果遇到报错:

      /opt/ros/melodic/lib/rosbag/play: error while loading shared libraries: librosbag.so: cannot open shared object file: No such file or directory

      1
      2
      3
      # 解决方法
      sudo gedit ~/.zshrc
      export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/ros/melodic/lib
    4. 在第三个终端中,启动 DVS/DAVIS 渲染器:

      1
      2
      source ./devel/setup.zsh && roslaunch dvs_renderer renderer_mono.launch
      # 如果没有刷新环境变量,会报错 RLException: [xx.launch] is neither a launch file in package [x] nor is [x] a launch file name

      如果要播放其他的rosbag数据集.bag文件,注意提前使用rosbag info BagFileName.bag命令,查看.bag文件的topics,修改./catkin_ws/src/rpg_dvs_ros/dvs_renderer/launch文件夹里,.launch文件里,eventsimage等参数指向的路径。

    5. 你可以看到连续图像的播放。

  10. (可选)对于来自 DAVIS 的实时数据流(即,不是记录的文件) ,您可以使用动态重新配置 GUI 根据需要调整 DVS/DAVIS 参数。运行

    1
    2
    3
    4
    5
    # 第一个终端
    roscore
    # 第二个终端
    source ./devel/setup.zsh
    rosrun rqt_reconfigure rqt_reconfigure

    一个窗口将会出现。

    选择 davis_ros_Driver(在左侧面板中),您应该会得到 GUI,它允许您修改传感器的参数。

3. 安装依赖

  1. 您应该已经在第2节创建了一个catkin工作区。如果没有,请返回并创建一个。

  2. 将此存储库克隆到catkin工作区的文件夹中。

    1
    2
    cd yourfolder/catkin_ws/src
    git clone https://github.com/HKUST-Aerial-Robotics/ESVO.git
  3. 依赖关系在 ./ESVO/dependencies.yaml 文件中指定。它们可以通过以下命令从您的 catkin 工作区的 src 文件夹中安装:

    1
    2
    3
    cd yourfolder/catkin_ws/src
    sudo apt-get install python3-vcstool
    vcs-import < ESVO/dependencies.yaml

    上面的命令应该将存储库克隆到 catkin_simpleglog_catkingflag_catkinminkindr 等文件夹中,这些文件夹位于 catking 工作区的 src 文件夹中,与这个存储库(ESVO)处于同一级别。

    提示:

    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/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

  4. 你可能需要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
  5. yaml-cpp 只用于从 yaml 文件加载校准参数:

    1
    2
    3
    4
    5
    cd yourfolder/catkin_ws/src
    git clone https://github.com/jbeder/yaml-cpp.git
    cd yaml-cpp
    mkdir build && cd build && cmake -DYAML_BUILD_SHARED_LIBS=ON ..
    make -j8
  6. 你应该安装好了有 OpenCV(>=3.2)和 Eigen 3。

    1
    2
    3
    4
    # Eigen
    gedit /usr/include/eigen3/Eigen/src/Core/util/Macros.h
    # Opencv
    pkg-config opencv --modversion
  7. 其他 ROS 依赖项应该已经在第2节中安装。如果有问题,安装相应缺失的依赖项。

  8. (可选)使用CLion编译项目时./catkin_ws/src/minkindr/minkindr_python会报错找不到文件catkin_boost_python_buildtoolnumpy_eigen(使用终端编译时不会报错)。猜测是CLion会自动编译工作区内所有的包,而使用终端编译时只指定了特定的包。

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

4. 安装 ESVO

  1. 编译

    1
    2
    3
    4
    5
    6
    7
    8
    cd yourfolder/catkin_ws
    # catkin list可以查看工作空间中有哪些ros包。

    # catkin build dvs_ros_driver davis_ros_driver dvxplorer_ros_driver dvs_renderer
    # build文件夹内容:catkin_simple、davis_ros_driver、dvs_msgs、dvs renderer、dvs_ros_driver、dvxplorer_ros_driver。

    catkin build esvo_time_surface esvo_core
    # build文件夹新增内容:eigen_catkin、eigen_checks、esvo_core、esvo_time_surface、gflags_catkin、glog_catkin、minkindr、minkindr conversions。

    如果编译报错:

    终端运行catkin clean命令相当于rm -r ${build} ${devel},但是避免了rm -r这种危险的操作!

    可能遇到的报错及处理:

    报错1:

    • 报错信息:/usr/lib/libgdal.so.20:对‘TIFFReadRGBATileExt@LIBTIFF_4.0’未定义的引用。

    • 报错原因:TIFF的库和conda的TIFF库发生了冲突(对于我解决了问题)

    • 解决方法:

      1
      2
      3
      # https://blog.csdn.net/weixin_44368449/article/details/126110009
      # https://blog.csdn.net/weixin_44362628/article/details/129238795
      conda remove libtiff

    报错2:

    • 报错信息:CMake Error at gflags_src-stamp/download-gflags_src.cmake:159 (message)。
    • 解决办法:如上文所述,断掉外网代理或本地下载和引用.zip文件。

    报错3:

    • 报错信息:CMake Error at /opt/ros/melodic/share/cv_bridge/cmake/cv_bridgeConfig.cmake:113 (message):Project ‘cv_bridge’ specifies ‘/usr/include/opencv’ as an include dir,which is not found.

      或:

      CMake Error at /opt/ros/melodic/share/image_geometry/cmake/image_geometryConfig.cmake:113 (message):Project ‘image_geometry’ specifies ‘/usr/include/opencv’ as an include dir,which is not found.

    • 解决方法:

      1
      2
      3
      4
      5
      # https://blog.csdn.net/qq_43310597/article/details/109256838
      # https://blog.csdn.net/zsq122021821/article/details/128316043
      # 只需修改上述路径中的cv_bridgeconfig.cmke和image_geometryConfig.cmake文件,将100行附近的两个opencv改成opencv4即可(注意,只需要改动单独一个的opencv,前面有连字符的opencv不需要改动)
      # 或
      sudo ln -s /usr/include/opencv4 /usr/include/opencv # 这个还适用其他需要opencv库的情况,推荐。

    报错4:

    报错5:

    • 报错信息:./ESVO/esvo_core/src/esvo_Mapping.cpp: 对‘cv::Mat::updateContinuityFlag()’未定义的引用

      或:./ESVO/esvo_core/src/esvo_Tracking.cpp:(.text+0x76e):对‘cv::error(int, std::__cxx11::basic_string<char, std::char_traits, std::allocator > const&, char const*, char const*, int)’未定义的引用

    • 解决办法:

      1
      2
      3
      4
      5
      6
      # 猜测:虽然使用OpenCV的版本管理的第二种方法对cv_bridge进行了版本指定,指定为3.2.0版本,但是,在CmakeLists.txt中使用find_package(OpenCV REQUIRED)或find_package(OpenCV 3.2.0 REQUIRED)实际上都没有找到/使用3.2.0版本,使用还是低版本3.1.0。甚至寻找使用OpenCV时都没有从ROS的cv_bridge中指定的路径中进行寻找,还是从系统路径自行寻找的。其他项目可能用3.1.0也可以,所以就没有报错。但是,esvo_core项目尤其会报错,需要版本大于等于3.2.0。
      # 所以。将./ESVO/esvo_core/CmakeLists.txt中的
      find_package(OpenCV REQUIRED)
      # 修改为
      find_package(cv_bridge)
      # 来强制指定使用cv_bridge中指定的OpenCV版本。
  2. 刷新环境变量

    1
    2
    3
    4
    5
    6
    7
    8
    # 刷新环境变量
    source yourfolder/catkin_ws/devel/setup.bash
    # or if you use the zsh shell instead
    source yourfolder/catkin_ws/devel/setup.zsh
    source ./devel/setup.zsh
    # 如果不想每次都要刷新环境变量
    echo “yourfolder/catkin_ws/devel/setup.zsh” >> ~/.zshrc
    sudo gedit ~/.zshrc # 用gedit打开文件,查看是否加入

运行使用

注意事项

在 Razor Blade 15笔记本电脑(Intel® Core™ i7-8750H CPU @ 2.20GHz × 12)上可以看到实时性能。

  • 为了获得实时性能,您需要一台功能强大的 PC,它具有至少支持6个线程的现代 CPU。记住让你的电脑保持凉爽!

  • 建图和跟踪是松散耦合的,这表明任何一个模块的失败都会导致其它模块的不良结果,从而导致整个系统的不良结果。

  • 如果初始化看起来不太好,可以通过单击动态重新配置中的复选框resetButton来重置系统。此复选框用作按钮。

  • 如果您使用的是计算资源有限的PC,那么您可以将rosbag的播放速度降低一个级别,例如修改ESVO/esvo_time_surface/launch/rosbag_launcher/upenn/upenn_indoor_flying1.launch

    1
    rosbag play xxx.bag -r 0.5 --clock

    并相应地修改外部时钟的速率(用于同步双目时间表面) ,例如修改ESVO/esvo_core/launch/system/system_upenn.launch

    1
    `<node name="global_timer" pkg="rostopic" type="rostopic" args="pub -s -r 50 /sync std_msgs/Time 'now' ">`

    在这个例子中,bag包文件以0.5的速率播放,因此,同步信号被相应地设置为50Hz。这些修改必须相应地进行,以便在模拟时间内以100Hz的频率更新(刷新)时间表面。你可以通过运行下面的命令来检查:

    1
    2
    rostopic hz /TS_left
    rostopic hz /TS_right

    它们都应该是大约100Hz。

  • esvo_core是使用超线程技术实现的。请根据您的PC的能力修改用于映射和跟踪的线程数。参数可以在include/esvo_core/tools/utils.h中找到。

  • esvo_time_surface支持超线程计算。我们发现,当处理分辨率高于DAVIS346 (346 x 260)的传感器时,这可能是必要的。单线程实现在DAVIS240C (240 x 180)上花费<=5 ms,在DAVIS346 (346 x 260)上花费<=10 ms。我们在上述PC平台上评估了双线程版本,在240 × 180分辨率下<=3ms,在<= 346 × 260分辨率下<=6ms。

  • 请注意,ESVO是不确定的,即每次在同一个rosbag文件上运行它时,结果可能不同。这是由于跟踪过程中涉及的随机操作,以及系统的并行性。性能根据你的个人电脑的情况而不同,例如,如果你关闭所有其他正在运行的程序,你会得到更好的效率。

  • 提供给ESVO的事件数据需要以比rpg_dvs_ros驱动程序的默认配置(30 Hz)高得多的流速率记录。这是由于esvo_time_surface的工作频率为100Hz。为了最大限度地用最新事件刷新时间面,需要明显更高的流速率(例如1000hz)。流速率既可以在硬件中简单地设置,也可以通过重写bag包来修改。我们在./rosbag_editor中提供了一个简单的示例来演示如何操作。

  • 如果终端是在conda环境下的话,运行时最好退出conda环境,因为conda和ros有冲突:

    1
    conda deactivate

esvo_time_surface

运行

1
2
# conda deactivate && source ./devel/setup.zsh
# roscore # 不必运行

这个包实现了一个不断更新双目时间图(即时间表面)的节点。要单独启动它,打开一个终端并运行命令:

1
source ./devel/setup.zsh && roslaunch esvo_time_surface stereo_time_surface.launch

要播放一个bag包,请转到esvo_time_surface/launch/rosbag_launcher,并根据您的bag包文件下载的位置修改[bag_name].launch中的路径。然后执行:

1
2
3
4
5
6
7
8
9
10
source ./devel/setup.zsh && roslaunch esvo_time_surface [bag_name].launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface upenn_indoor_flying1.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface upenn_indoor_flying3.launch

# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_bin.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_boxes.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_desk.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_monitor.launch

# source ./devel/setup.zsh && roslaunch esvo_time_surface hkust_lab.launch

报错

  1. ROS:ModuleNotFoundError: No module named 'rospkg'

    1
    2
    3
    4
    5
    6
    # 安装了anaconda 导致的
    # https://blog.csdn.net/qq_42995327/article/details/119357775
    which pip
    pip install catkin-tools rospkg pyyaml empy numpy # 不能彻底解决问题
    # 或
    conda deactivate # 可以解决报错
  2. ROS:ModuleNotFoundError: No module named 'PySide2'

    1
    2
    3
    4
    5
    # 安装了anaconda 导致的
    which pip
    pip install PySide2 # 不能彻底解决问题
    # 或
    conda deactivate # 可以解决报错

esvo_core

运行

1
2
# conda deactivate && source ./devel/setup.zsh
# roscore # 不必运行

这个包实现了提出的建图和跟踪方法。初始化在建图部分内部实现。要启动它,打开一个终端并运行命令:

1
2
3
4
5
6
7
source ./devel/setup.zsh && roslaunch esvo_core system_xxx.launch

# source ./devel/setup.zsh && roslaunch esvo_core system_upenn.launch

# source ./devel/setup.zsh && roslaunch esvo_core system_rpg.launch

# source ./devel/setup.zsh && roslaunch esvo_core system_hkust.launch

这将同时启动两个esvo_time_surface节点(分别用于左右事件相机)、建图节点和跟踪节点。然后播放运行输入的包文件:

1
2
3
4
5
6
7
8
9
10
11
source ./devel/setup.zsh && roslaunch esvo_time_surface [bag_name].launch

# source ./devel/setup.zsh && roslaunch esvo_time_surface upenn_indoor_flying1.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface upenn_indoor_flying3.launch

# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_bin.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_boxes.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_desk.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_monitor.launch

# source ./devel/setup.zsh && roslaunch esvo_time_surface hkust_lab.launch

若要在任何时候保存轨迹,请转到另一个终端并通过以下方式终止系统:

1
source ./devel/setup.zsh && rosparam set /ESVO_SYSTEM_STATUS "TERMINATE"

您需要在ESCO/esvo_core/cfg/trace_xxx.yaml中设置将保存结果文件的路径。

1
PATH_TO_SAVE_TRAJECTORY: "./ESVO/output/" # CHANGE THIS PATH

报错

    • QObject::connect: Cannot queue arguments of type 'QVector'
      (Make sure 'QVector' is registered using qRegisterMetaType().)

      运行esvo_core/mvstereo时也会报这个错,所以不是这里的问题。

    • REQUIRED process [esvo_Tracking-6] has died!
      process has died [pid 13057, exit code -6, cmd /catkin_ws/devel/lib/esvo_core/esvo_Tracking time_surface_left:=/TS_left time_surface_right:=/TS_right stamped_pose:=/esvo_tracking/pose_pub gt_pose:=/optitrack/davis_stereo events_left:=/davis/left/events pointcloud:=/esvo_mapping/pointcloud_local __name:=esvo_Tracking __log:=/home/lll25655/.ros/log/91ef2428-ac63-11ee-a412-10f60abacaed/esvo_Tracking-6.log].
      log file: /home/lll25655/.ros/log/91ef2428-ac63-11ee-a412-10f60abacaed/esvo_Tracking-6*.log
      Initiating shutdown!

    先说结论:

    我是因为PCL库的问题。具体来说,自己源码安装的PCL最好不要安装到系统根目录下,也就是默认的/usr/local/下,如果安装到了/usr/local/下,最后链接PCL的库的时候会默认链接到这个路径下的库。但是绝大部分搭建在ROS上的工程都是使用ROS自带的pcl-1.8的,这个时候虽然编译可以通过,但是运行的时候会出错,且报错信息不会有这方面的提示

    再说过程:

    报错信息根本没有PCL这方面的提示,自己根本就不会往这方面想。为了解决这个报错,我花了3天时间,就是解决不了这一个报错。心太累了,昨天已经决定今天重装系统了。天可怜见,还好今天不死心,想再最后挣扎一下。想到有一个代码库指定自己源码安装的OpenCV会报错,使用find_package(cv_bridge)就不会报错。其他代码库就没有这没问题。要不用ROS自带的OpenCV试试?那其他库ROS有没有自带的?都用ROS自带的试试?PCL的话ROS有没有自带?然后就刷到了这篇博客:Ubuntu18安装新版本PCL-1.13,并和ROS自带PCL-1.8共存。完美解决!

    具体步骤:

    1. 找到当时源码安装PCL的文件夹(我是源码安装了PCL1.8),进入build文件夹,找到sudo make install之后产生的这个文件install_manifest.txt,里面有安装的所有东西的路径,删除它们:

      1
      2
      3
      4
      # 参考命令:
      cat install_manifest.txt | sudo xargs rm
      # 或者
      sudo xargs rm < install_manifest.txt
    2. 上述命令只会删除掉文件夹里的文件,会留下空文件夹。所以可以继续对照install_manifest.txt文件,手动删掉多余的空文件夹。我这里是:

      1
      2
      sudo rm -r /usr/local/include/pcl-1.8/
      sudo rm -r /usr/local/share/pcl-1.8/
    3. 如果该方法不行。尝试其它方法也不行的话。可以尝试卸载重装ROS:ROS的安装与卸载

    附:

    ESVO的GitHub Issues上关于这个报错的讨论(没有看到通用的解决办法):

esvo_core/mvstereo

1
2
# conda deactivate && source ./devel/setup.zsh
# roscore # 不必运行

该模块实现了ESVO的建图器和其他一些基于事件的建图方法(如[26],[45])。作为一个多视图双目(MVS)管道,它假设姿势是已知的先验。要启动建图器,请运行:

1
2
3
source ./devel/setup.zsh && roslaunch esvo_core mvstereo_xxx.launch
# source ./devel/setup.zsh && roslaunch esvo_core mvstereo_upenn.launch
# source ./devel/setup.zsh && roslaunch esvo_core mvstereo_rpg.launch

这将同时启动两个esvo_time_surface节点(分别用于左右事件相机)、建图节点和跟踪节点。然后播放运行输入的包文件:

1
2
3
4
5
6
7
8
source ./devel/setup.zsh && roslaunch esvo_time_surface [bag_name].launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface upenn_indoor_flying1.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface upenn_indoor_flying3.launch

# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_bin.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_boxes.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_desk.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_monitor.launch

请注意,只有rpgupenn数据集适用于这个模块,因为它们含有地面真值。

其他

conda环境安装

自己曾尝试在激活conda环境的情况下运行ESVO(ROS),主要是为了解决PCL库问题的一种尝试,当时以为是本地Qt的问题,所以想使用conda的Qt尝试解决问题。

当然,最后不了了之,也是conda deactivate运行起来更简单直接。

下面的配置自建conda环境的步骤供参考:

1
2
3
4
5
6
7
8
9
10
11
conda create -n ESVO python=3.6
conda activate ESVO
conda search qt
conda install qt=5.9.7 # 替换为实际可用的版本
# conda install pyqt=5.9.* # 确保版本与Qt版本相匹配
pip index versions pyqt5
pip install pyqt5==5.9.2
# conda list
# conda deactivate
# conda remove -n env_name --all # 删除环境
# conda info -e # 查看所有的环境

指定此时系统使用conda环境里的Qt:

1
2
3
4
5
6
7
8
sudo gedit /etc/profile
# 注释掉本地的Qt
source /etc/profile
sudo gedit ~/.zshrc
# 注释掉本地的Qt
source ~/.zshrc
conda activate ESVO
qmake -v # 测试当前路径和版本是否正确

验证安装: 安装完成后,你可以通过运行简单的测试来验证Qt是否正确安装和配置。

1
2
3
4
5
6
7
8
9
10
11
12
# test.py
import sys
from PyQt5.QtWidgets import QApplication, QWidget

app = QApplication(sys.argv)
w = QWidget()
w.resize(250, 150)
w.move(300, 300)
w.setWindowTitle('Simple')
w.show()

sys.exit(app.exec_())

运行这个Python脚本,如果一切正常,你应该会看到一个简单的窗口。

1
2
cd yourfolder/
python test.py

后续安装:

1
2
3
4
pip install catkin-tools rospkg pyyaml numpy
pip install pydot
pip install PyQt5-tools
pip install empy==3.3.4

(往下没有继续踩坑)

评估

https://github.com/HKUST-Aerial-Robotics/ESVO/issues/29

[待更新……]

参数动态配置

提供了用于时间表面,建图和跟踪的参数配置说明,借助(dynamic reconfigure)动态配置进行调整。

时间表面

  • use_sim_time :将此设置为True用于所有离线实验,这些实验使用模拟时间。
  • ignore_polarity :将此设置为True因为在所提出方法中不使用极性信息。
  • time_surface_mode :时间表面渲染方式(0:向后;1:向前)。0表示使用标准方式刷新时间表面。有关更多详细信息,请参阅实现。
  • decay_ms :恒定指数衰减参数(单位:毫秒)。
  • median_blur_kernel_size :决定用于降噪时间表面的内核大小。
  • max_event_queue_len :决定在每个坐标下维护的事件队列长度。

建图

事件匹配

  • EM_Slice_Thickness:决定时间切片的厚度(单位:秒)。
  • EM_Time_THRESHOLD:时间同时性阈值。
  • EM_EPIPOLAR_THRESHOLD:极线约束阈值。
  • EM_TS_NCC_THRESHOLD:运动一致性阈值。
  • EM_NUM_EVENT_MATCHING:事件匹配的最大事件数。

块匹配

  • BM_half_slice_thickness:决定时间切片的厚度(单位:秒)。
  • BM_min_disparity:极线匹配的最小搜索距离。
  • BM_max_disparity:极线匹配的最大搜索距离。
  • BM_step:极线搜索间隔。
  • BM_ZNCC_Threshold:基于ZNCC的匹配阈值。
  • BM_bUpDownConfiguration:一个标志,指示立体基线的方向(True:上下;False:左右)。
  • bSmoothTimeSurface:是否平滑时间表面。

非线性优化参数

  • invDepth_min_range:结果反深度的下限。
  • invDepth_max_range:结果反深度的上限。
  • residual_vis_threshold:反深度估计的时间残差阈值。
  • stdVar_vis_threshold:反深度估计的不确定性阈值。
  • age_vis_threshold:融合操作次数(反深度估计)的阈值。
  • age_max_range:年龄的上限(仅用于可视化)。
  • fusion_radius:决定参与深度融合的像素数。
  • FUSION_STRATEGY:融合策略。(使用CONST_FRAMES或CONST_POINTS)
  • maxNumFusionFrames:决定有多少帧(观测值)融合到当前时间。(在CONST_FRAMES模式下使用)
  • maxNumFusionPoints:决定有多少点融合到当前时间。(在CONST_POINTS模式下使用)
  • Denoising:此操作有助于去除由VICON反射引起的事件噪声。设置为True以使用。
  • Regularization:对结果反深度图进行正则化处理。
  • PROCESS_EVENT_NUM:每次观察时执行的最大深度估计数量。
  • TS_HISTORY_LENGTH:维持的时间表面数量。
  • INIT_SGM_DP_NUM_THRESHOLD:SGM初始化需要的最小深度点数。
  • mapping_rate_hz:映射节点的更新率。
  • patch_size_X:时间表面上补丁的大小(x维度)。
  • patch_size_Y:时间表面上补丁的大小(y维度)。
  • LSnorm:最小二乘法选择(使用l2或Tdist)。
  • Tdist_nu:应用学生t分布的参数。
  • Tdist_scale:应用学生t分布的参数。
  • Tdist_stdvar:应用学生t分布的参数。
  • bVisualizeGlobalPC:设置为True以可视化全局点云。
  • visualizeGPC_interval:将新点推送到全局点云的时间间隔。
  • NumGPC_added_oper_refresh:推送到全局点云的点数。

跟踪

  • invDepth_min_range:输入点云的深度下界。(仅用于可视化)。
  • invDepth_max_range:输入点云的深度上界。(仅用于可视化)。
  • TS_HISTORY_LENGTH:保持的时间表面数量。
  • REF_HISTORY_LENGTH:维护的参考局部地图数量。
  • tracking_rate_hz:追踪节点的更新率。
  • patch_size_X:时间表面上补丁的尺寸(x维度)。
  • patch_size_Y:时间表面上补丁的尺寸(y维度)。
  • kernelSize:用于平滑负时间表面的内核大小。
  • MAX_REGISTRATION_POINTS:参与3D-2D配准的最大3D点数。
  • BATCH_SIZE:每次迭代中使用的3D点的数量。
  • MAX_ITERATION:最大迭代次数。
  • LSnorm:最小二乘法的选择。(使用Huber或l2)
  • huber_threshold:Huber范数参数。
  • MIN_NUM_EVENTS:自上次观测以来发生的事件数量门槛。这个用于检查事件相机是否感知到足够的刺激。
  • RegProblemType:雅克比计算方式(0 数值; 1 分析)。
  • SAVE_TRAJECTORY:设置True保存轨迹。
  • SEQUENCE_NAME:保存轨迹时分配。
  • VISUALIZE_TRAJECTORY:设置True以可视化路径。

SEVIO

概览

SEVIO 是一种用于双目事件相机的新型视觉惯性里程计。我们的可视化模块遵循工作ESVO,融合模块基于ESKF。

Video

Paper

Source Code

数据集下载

我们测试的数据集可以从sequences中下载。

编译

我们已经使用以下配置在机器上测试了 SEVIO:

  • Ubuntu 18.04.5 LTS + ROS melodic + OpenCV 3.2

编译过程与ESVO一致。这里只提供关键步骤:

1
2
3
4
5
6
7
8
9
10
11
cd yourfolder/catkin_ws/src
git clone https://github.com/jbeder/yaml-cpp.git
cd yaml-cpp
mkdir build && cd build && cmake -DYAML_BUILD_SHARED_LIBS=ON ..
make -j8

catkin build dvs_ros_driver davis_ros_driver dvxplorer_ros_driver dvs_renderer

catkin build esvo_time_surface esvo_core

source ./devel/setup.zsh

运行

time_surface

这个包实现了一个不断更新立体时间图(即时间表面)的节点。要单独启动它,打开一个终端并运行命令:

1
2
3
source ./devel/setup.zsh && roslaunch esvo_time_surface stereo_time_surface.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface stereo_time_surface_VECtor.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface stereo_time_surface_mvsec.launch

要播放一个bag包,请转到sevio_time_surface/launch/rosbag_launcher,并根据您的bag包文件下载的位置修改[bag_name].launch中的路径。然后执行:

1
2
3
4
5
6
7
8
9
source ./devel/setup.zsh && roslaunch esvo_time_surface [bag_name].launch
# VECtor
# source ./devel/setup.zsh && roslaunch esvo_time_surface corridors_dolly.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface school_dolly.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface school_scooter.launch

# mvsec
# source ./devel/setup.zsh && roslaunch esvo_time_surface indoor_flying1.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface indoor_flying3.launch

full system

启动系统:

1
2
3
4
source ./devel/setup.zsh && roslaunch esvo_core system_xxx.launch
# source ./devel/setup.zsh && roslaunch esvo_core system_VECtor.launch
# source ./devel/setup.zsh && roslaunch esvo_core system_mvsec.launch
# source ./devel/setup.zsh && roslaunch esvo_core system_upenn.launch

这将同时启动两个esvo_time_surface节点(分别用于左右事件相机)。然后播放运行输入的包文件:

1
2
3
4
5
6
7
8
9
source ./devel/setup.zsh && roslaunch esvo_time_surface [bag_name].launch
# VECtor
# source ./devel/setup.zsh && roslaunch esvo_time_surface corridors_dolly.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface school_dolly.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface school_scooter.launch

# mvsec
# source ./devel/setup.zsh && roslaunch esvo_time_surface indoor_flying1.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface indoor_flying3.launch

ESVO_extension

概览

我们将ESVO框架扩展到其他三个模块:

  • 基于多视角单目事件相机的建图(给定地面真值) ;
  • 基于单目事件相机的跟踪与建图;
  • 基于多事件表示的事件相机跟踪。

论文:

  • Jiao J, Huang H, Li L, et al. Comparing representations in tracking for event camera-based slam[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2021: 1369-1376.

Source Code

仿真数据集

我们使用基于事件相机的模拟器:ESIM来收集几个模拟的双目事件相机序列。双目事件相机在具有不同背景的墙壁前执行平面或6DoF运动:简单形状、棋盘和办公室。这些序列可用于算法验证。可以在这里下载(无需连接外网下载)。

编译

编译过程与ESVO一致。这里只提供关键步骤:

  1. 使用的代码文件为ESVO_extension-multi_rep_tracking-default.zip

  2. 下载链接下载cnpy_catkin./catkin_ws/src文件夹。

  3. (可选)从下载链接下载并重命名文件为cnpy.zip,修改./catkin_ws/src/cnpy_catkin/CMakeLists.txt

    1
    2
    # URL https://github.com/rogersce/cnpy/archive/4e8810b1a8637695171ed346ce68f6984e585ef4.zip
    URL "/yourfolder/cnpy.zip"
  4. 编译运行。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    cd yourfolder/catkin_ws/src
    git clone https://github.com/jbeder/yaml-cpp.git
    cd yaml-cpp
    mkdir build && cd build && cmake -DYAML_BUILD_SHARED_LIBS=ON ..
    make -j8

    catkin build dvs_ros_driver davis_ros_driver dvxplorer_ros_driver dvs_renderer

    catkin build esvo_time_surface esvo_core

    source ./devel/setup.zsh

    报错:/usr/include/pcl-1.8/pcl/kdtree/kdtree_flann.h:230:29: error: field ‘param_k_’ has incomplete type ‘flann::SearchParams’

    原因:同时使用PCL和OpenCV时发生冲突,在PCL和OpenCV中都有一个叫:flann的namespace。

    解决方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sudo gedit /usr/include/pcl-1.8/pcl/kdtree/kdtree_flann.h
    # 230行
    ::flann::SearchParams param_k_;
    # 改为
    ::flann::SearchParams *param_k_;

    # 233行
    ::flann::SearchParams param_radius_;
    # 改为
    ::flann::SearchParams *param_radius_;

    参考链接:

    pcl和opencv冲突问题

    GitHub Issues

    PCL-OpenCV冲突的解决方案

    同时使用PCL和OpenCV时的种种坑爹的情况及其解决办法

运行

问:如何运行这个代码与我自己的单目事件相机数据集?因为我看到的system_rpg.launchsystem_sim.launch都需要两个相机topic(left&right) ,但我自己的数据集只有一个相机topic。

答:请检查这个launch文件,它只需要一个相机topic:

./ESVO_extension/blob/multi_rep_tracking/esvo_core/launch/monosystem/monosystem_simu.launch

问:当我运行monosystem_simu.launch时,出现了一个错误。但是我catkin build成功,可以成功地运行system_rpg_stereo.launch

1
ERROR: cannot launch node of type [esvo_core/esvo_MonoTracking]: Cannot locate node of type [esvo_MonoTracking] in package [esvo_core]. Make sure file exists in package path and permission is set to executable (chmod +x)

答:请运行这个launch文件,您可以检查README.md来使用1.1 esvo_MVSMono.cpp

./ESVO_extension/blob/multi_rep_tracking/esvo_core/launch/mvsmono/mvsmono_rpg_mono.launch

问:但是esvo_MVSMono.cpp只是单目建图,没有单目跟踪。如何使用单目事件相机运行esvo_Tracking.cpp?如果我想运行单目事件相机SLAM (有单目建图和单目跟踪) ,我应该运行哪个launch文件?

答:单目跟踪没有很好地完成和支持。

esvo_MVSMono.cpp

提前修改好.launch文件中数据集的路径。

我们在ESVO框架下修改了EMVS单目多视单目映射(给定地面真值),要启动建图器,请运行:

1
2
3
4
5
source ./devel/setup.zsh && roslaunch esvo_core mvsmono_xxx.launch

# source ./devel/setup.zsh && roslaunch esvo_core mvsmono_rpg_mono.launch
# source ./devel/setup.zsh && roslaunch esvo_core mvsmono_rpg_slider.launch
# source ./devel/setup.zsh && roslaunch esvo_core mvsmono_simu.launch

(取消掉.lanuch文件<!-- Visualization -->模块的注释来在程序运行时进行可视化)

这将同时启动一个esvo_time_surface节点(用于左事件摄像头)和建图节点。建图器中不使用时间曲面,而是用于与原始ESVO兼容的API。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
source ./devel/setup.zsh && roslaunch esvo_time_surface xxx.launch
# rpg_stereo
# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_stereo_bin.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_stereo_boxes.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_stereo_desk.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_stereo_monitor.launch

# rpg_simu
# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_checkerboard_6dof.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_office_6dof.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_shapes_poster_6dof.launch

# upenn
# source ./devel/setup.zsh && roslaunch esvo_time_surface upenn_indoor_flying1.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface upenn_indoor_flying3.launch

按下空格开始播放.bag文件。

需要注意的是esvo_time_surface里*.launch文件里对应本地rosbag包的路径,esvo_core里*.launch文件里对应rosbag包里的主题(使用rosbag info命令查看),应该就可以运行了。也就是类似<remap from="events" to="/dvs/events" />这些地方要对应好。

保存轨迹的逻辑可以参考ESVO

esvo_MonoMapping.cpp and esvo_MonoTracking.cpp

我们遵循EVO将单目建图器与基于时间表面的跟踪器集成在一起,用于基于单目事件的视觉里程计。给出了初步结果。要启动建图器,请运行:

1
2
3
4
5
6
source ./devel/setup.zsh && roslaunch esvo_core monosystem_xxx.launch

# source ./devel/setup.zsh && roslaunch esvo_core monosystem_rpg_stereo.launch
# source ./devel/setup.zsh && roslaunch esvo_core monosystem_simu.launch

# 报错缺失文件:./catkin_ws/src/ESVO_extension-multi_rep_tracking/esvo_core/cfg/time_surface/ts_parameters_rpg_simu.yaml]

启动esvo_time_surface节点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
source ./devel/setup.zsh && roslaunch esvo_time_surface xxx.launch
# rpg_stereo
# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_stereo_bin.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_stereo_boxes.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_stereo_desk.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_stereo_monitor.launch

# rpg_simu
# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_checkerboard_6dof.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_office_6dof.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface rpg_shapes_poster_6dof.launch

# upenn
# source ./devel/setup.zsh && roslaunch esvo_time_surface upenn_indoor_flying1.launch
# source ./devel/setup.zsh && roslaunch esvo_time_surface upenn_indoor_flying3.launch

按下空格开始播放.bag文件。

Tracking.cpp

ESVO使用时间曲面(TS)来跟踪跟踪问题,而EVO使用二元事件映射(EM)来跟踪问题。该模块还实现了基于EM的跟踪器,用于比较评估。完整的实验结果将发表。

评估

我们编写一个脚本来执行批处理测试和评估。在不同的事件表示上运行带有跟踪器的ESVO:

1
$ python run_esvo.py -dataset=rpg_stereo -sequence=rpg_bin -representation=TS,EM,TSEM -eventnum=2000,3000,4000 -trials=1 -program=run,eval,load_result

我们使用这个包:rpg_trajectory_evaluation来计算RMSE和RPE。

问:你能分享一下analyze_trajectory_single_vo.py文件吗?

答:很抱歉这个文件不能公开。如果你想评估轨迹,请使用这个原始库:https://github.com/uzh-rpg/rpg_trajectory_evaluation

./ESVO_extension/esvo_core/src/initial/中的代码只是我使用对比度最大化初始化地图的尝试。但是我发现使用平面假设直接初始化地图更可靠。所以这个代码没有在Tracking.cpp中使用。


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