EVO编译运行调试记录

本文最后更新于 2024年2月7日 下午

本文主要分享了自己在编译运行论文《EVO: A Geometric Approach to Event-Based 6-DOF Parallel Tracking and Mapping in Real Time》的源代码时的调试记录。

数据集

代码附带了一个测试数据集。如果您没有事件相机并希望在更多数据上运行代码,可以执行以下操作之一:

环境配置

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的安装路径

开始使用

本软件依赖于 ROS。安装说明可在此处找到。我们在Ubuntu 18.04和ROS Melodic上测试了这个软件。ROS的安装与卸载

  1. 如有需要,创建并初始化一个新的catkin工作区。

    mkdir -p catkin_ws/src && cd catkin_ws/
    catkin config \
        --init --mkdirs --extend /opt/ros/melodic \
        --merge-devel --cmake-args \
        -DCMAKE_BUILD_TYPE=Release
    
  2. 克隆此仓库。

    cd src/ && git clone git@github.com:uzh-rpg/rpg_dvs_evo_open.git
    
  3. 克隆(并修复)依赖关系。

    官方说明:

    ./rpg_dvs_evo_open/install.sh [ros-version] # [ros-version]:melodic, ..
    

    [ros-version] 替换为您实际的ROS发行版。例如:

    ./rpg_dvs_evo_open/install.sh melodic
    

    确保已经安装了ROS和常用的包(如rviz、rqt等)。

    上述命令执行以下操作:

    • 首先,我们安装所需的包。

    • 其次,我们克隆evo所依赖的仓库

    如遇驱动安装问题(实时运行所需),请参考此存储库

    在实际编译编译过程中,自己踩了一些坑,主要是版本不匹配的问题,即随着时间的推移,EVO源代码的编译会因为依赖库的更新而出现报错。类似于参考链接中所说:

    • 我的平台是一个新的 Ubuntu 18.04 系统,没有手动安装 OpenCV,但是当我按照说明构建项目时,它不断报告有关 OpenCV 的错误。然后我发现,install.sh 中有一个命令sudo apt-get install libopencv-dev。在这个时间点(2023 年),如果我们执行这个命令,可能是因为 OpenCV 从 2021 年开始的更新,随 ROS 一起安装的 OpenCV 会被 OpenCV4 覆盖,然后我们运行catkin build dvs_tracking时会出现很多错误,类似于问题 #17 中提到的问题。所以我只是注释掉了上述命令,然后一切正常。我希望这个小小的修改对你们有所帮助,如果你遇到和我一样的问题。

    因此,自己更推荐以下的步骤(主要根据参考链接的说明)。当然,你也可以先按照官方的说明进行尝试,如果编译成功了,就万事大吉。如果报错了,又没有解决,可以重新回到这个步骤,推倒重来。

    个人更倾向于将install.sh里的命令单独运行,方便出现报错时的定位和处理。如果这样做的话,注意,将install.sh里的$1替换为[ros-version]

    1. 添加PPA(Personal Package Archive)存储库。

      1
      2
      3
      4
      sudo add-apt-repository ppa:inivation-ppa/inivation
      # Ubuntu PPA for Focal 20.04 LTS and latest Ubuntu releases.
      # For Bionic 18.04 LTS, please use 'ppa:inivation-ppa/inivation-bionic'.
      sudo add-apt-repository ppa:inivation-ppa/inivation-bionic
    2. 安装libopencv-dev=3.2.0+dfsg-4ubuntu0.1

      1. 查看系统中已安装的libopencv-dev

        1
        apt list --installed | grep -i libopencv-dev  # 模糊搜索

        如果没有,或者版本为3.2.0就可以跳过这个步骤。如果版本为4.2.0,那么建议卸载重装3.2.0版本。

      2. 卸载libopencv-dev=4.2.0+dfsg-6~bionic

        1
        2
        3
        sudo apt remove libopencv-dev  # 卸载软件
        sudo apt-get purge libopencv-dev # 清除配置
        # 会同时卸载掉libcaer-dev?所以libcaer-dev建议在后面安装。
      3. 安装libopencv-dev=3.2.0+dfsg-4ubuntu0.1

        1. 查看系统可选的安装版本。

          1
          2
          3
          4
          sudo apt update	# 先更新软件包列表,检查可用的软件包更新
          # 查看可选的安装版本
          apt-cache policy libopencv-dev
          apt-cache search libopencv-dev
        2. 安装依赖库。如果直接使用sudo apt install libopencv-dev=3.2.0+dfsg-4ubuntu0.1命令安装libopencv,会报依赖库和4.2.0版本冲突的问题。所以,要先安装依赖库。经过尝试,按照一下步骤一次安装依赖库,没有问题。

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          sudo apt install libopencv3.2-java=3.2.0+dfsg-4ubuntu0.1
          sudo apt install libopencv-core-dev=3.2.0+dfsg-4ubuntu0.1
          sudo apt install libopencv-viz-dev=3.2.0+dfsg-4ubuntu0.1
          sudo apt install libopencv-flann-dev=3.2.0+dfsg-4ubuntu0.1
          sudo apt install libopencv-imgproc-dev=3.2.0+dfsg-4ubuntu0.1
          sudo apt install libopencv-imgcodecs-dev=3.2.0+dfsg-4ubuntu0.1
          sudo apt install libopencv-videoio-dev=3.2.0+dfsg-4ubuntu0.1
          sudo apt install libopencv-highgui-dev=3.2.0+dfsg-4ubuntu0.1
          sudo apt install libopencv-ml-dev=3.2.0+dfsg-4ubuntu0.1
          sudo apt install libopencv-features2d-dev=3.2.0+dfsg-4ubuntu0.1
          sudo apt install libopencv-calib3d-dev=3.2.0+dfsg-4ubuntu0.1
          sudo apt install libopencv-photo-dev=3.2.0+dfsg-4ubuntu0.1
          sudo apt install libopencv-video-dev=3.2.0+dfsg-4ubuntu0.1
          sudo apt install libopencv-videostab-dev=3.2.0+dfsg-4ubuntu0.1
          sudo apt install libopencv-ts-dev=3.2.0+dfsg-4ubuntu0.1
          sudo apt install libopencv-superres-dev=3.2.0+dfsg-4ubuntu0.1
          sudo apt install libopencv-objdetect-dev=3.2.0+dfsg-4ubuntu0.1
          sudo apt install libopencv-stitching-dev=3.2.0+dfsg-4ubuntu0.1
          sudo apt install libopencv-shape-dev=3.2.0+dfsg-4ubuntu0.1
          sudo apt install libopencv-contrib-dev=3.2.0+dfsg-4ubuntu0.1
        3. 安装libopencv-dev=3.2.0+dfsg-4ubuntu0.1

          1
          sudo apt install libopencv-dev=3.2.0+dfsg-4ubuntu0.1  # 安装软件
    3. 源码编译安装libcaer-dev

      1. 查看系统中是否已安装的libcaer-dev

        1
        apt list --installed | grep -i libcaer-dev  # 模糊搜索
      2. 卸载之前使用sudo apt install命令安装的libcaer-dev

        1
        2
        sudo apt remove libcaer-dev  # 卸载软件
        sudo apt-get purge libcaer-dev # 清除配置
      3. 源码编译安装libcaer-dev

        1
        2
        3
        4
        5
        6
        7
        8
        sudo apt install libusb-1.0-0-dev libserialport-dev
        cd ~/yourfolder
        git clone https://gitlab.com/inivation/dv/libcaer.git
        cd libcaer
        mkdir build && cd build
        cmake -DENABLE_SERIALDEV=1 -DENABLE_OPENCV=1 ..
        sudo make -j8
        sudo make install
    4. 安装其他依赖库。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      sudo apt-get install python3-vcstool
      sudo apt-get install ros-melodic-sophus
      sudo apt-get install ros-melodic-pcl-ros
      sudo apt-get install ros-melodic-eigen-conversions
      sudo apt-get install ros-melodic-camera-info-manager
      sudo apt-get install ros-melodic-image-view
      sudo apt-get install libfftw3-dev libfftw3-doc
      sudo apt-get install libglew-dev
      sudo apt-get install libyaml-cpp-dev
      sudo apt-get install python-catkin-tools
      sudo apt-get install ros-melodic-camera-info-manager
      sudo apt-get install ros-melodic-image-geometry
      sudo apt-get install ros-melodic-cv-bridge
    5. vcs-import < rpg_dvs_evo_open/dependencies.yaml

      下载的第三方库在./catkin_ws/src/目录下,与rpg_dvs_evo_open文件夹同级。

    6. 为防止网路下载不稳定的情况,可以将第三方库CmakeLists.txt中的下载链接替换为本地路径。

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

      1. gflags_catkin。下载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"
      2. nanoflann_catkin。下载nanoflannyourfolder/并重命名为nanoflann.zip。打开./catkin_ws/src/nanoflann_catkin目录下的Cmakelists.txt文件,修改GIT_REPOSITORY

        1
        2
        # GIT_REPOSITORY https://github.com/cfo/nanoflann.git
        URL "/yourfolder/nanoflann.zip"
    7. 你可能需要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
  4. 构建包。

    1
    2
    3
    catkin build dvs_tracking
    # 如果编译报错:
    # catkin clean 相当于 rm -r ${build} ${devel}, 但是避免了 rm -r 这种危险的操作!

    构建所有内容可能需要一些时间……这或许是喝杯咖啡的好时机!😃

    报错处理:

      • 报错信息:/src/rpg_dvs_evo_open/dvs_reconstruction/src/mosaic.cpp:290:49: error: invalid initialization of reference of type ‘const Scalar&’ {aka ‘const cv::Matx<float, 1, 1>&’} from expression of type ‘const float’
        290 | const Scalar &z = new_grad.at(y, x);

        /src/rpg_dvs_evo_open/dvs_reconstruction/src/mosaic.cpp:312:35: error: conversion from ‘float’ to non-scalar type ‘const Scalar’ {aka ‘const cv::Matx<float, 1, 1>’} requested
        312 | const Scalar h = g.dot(v), nu = z - h, S = dhdg * P * dhdg.t() + R_;

      • 解决方法:使用OpenCV3.2.0,使用3.4.0版本会报错。

      • 参考链接

      • 报错信息:/catkin_ws/devel/lib/libdvs_bootstrapping_ef.so:对‘cv::imwrite(std::__cxx11::basic_string<char, std::char_traits, std::allocator > const&, cv::_InputArray const&, std::vector<int, std::allocator > const&)’未定义的引用
        /catkin_ws/devel/lib/libdvs_bootstrapping_ef.so:对‘cv::Formatter::get(cv::Formatter::FormatType)’未定义的引用
        collect2: error: ld returned 1 exit status

      • 解决方法:如上所述,卸载libopencv-dev=4.2.0+dfsg-6~bionic,安装libopencv-dev=3.2.0+dfsg-4ubuntu0.1

    1. OpenCV报错未定义的引用。使用OpenCV的安装与版本管理中的版本管理方法1(EVO使用方法2反而不行)。如果rpg_dvs_ros/dvs_calibration/CMakeLists.txt报错,则尝试使用版本管理方法2。

  5. 之后别忘了刷新工作区!

    1
    2
    source ./devel/setup.bash
    # source ./devel/setup.zsh

示例

在下表中列出了每个示例的特定启动文件(精调)。最有趣和可重复的一个(由于引导序列,请参阅进一步改进)是多关键帧序列。

示例 启动文件 Rosbag
多关键帧序列 flyingroom.launch 538 MB
桌面序列 desk.launch 145 MB

下载rosbags,您可以使用以下命令:

1
wget [rosbag link] -O /path/to/download/folder/

例如,以下命令将下载多关键帧序列rosbag:

1
wget http://rpg.ifi.uzh.ch/data/EVO/code_examples/evo_flyingroom.bag -O /tmp/evo_flyingroom.bag

要从rosbag运行管道,首先作为下面的启动管道

1
2
source ./devel/setup.zsh && roslaunch dvs_tracking [launch-file] auto_trigger:=true
# source ./devel/setup.zsh && roslaunch dvs_tracking flyingroom.launch auto_trigger:=true

然后,一旦加载了所有内容,运行rosbag如下

1
rosbag play -r 0.7 [rosbag-file]

例如,

1
rosbag play -r 0.7 /tmp/evo_flyingroom.bag

请注意,我们将auto_trigger 参数设置为true。您也可以将其设置为false,然后按照如何实时运行的指示进行操作。

如果有什么失败,只需重试(给它几个机会!),并确保严格按照上面的说明进行操作。

进一步改进部分概述了运行代码可能出现的问题。为了提高播放rosbags的可靠性(实时运行更简单),考虑使用-r .7来降低速率。特别是当硬件不够强大时,这会有所帮助。

例如,

1
rosbag play /tmp/evo_flyingroom -r .7

最终,设置bootstrap_image_topic:=/dvs/image_raw 将从传统帧引导,然后仅切换到事件。这是目前可用的最可靠的引导方式。

1
2
3
source ./devel/setup.zsh &&  roslaunch dvs_tracking [launch-file] bootstrap_image_topic:=/dvs/image_raw auto_trigger:=true
# source ./devel/setup.zsh && roslaunch dvs_tracking flyingroom.launch bootstrap_image_topic:=/dvs/image_raw auto_trigger:=true
# source ./devel/setup.zsh && roslaunch dvs_tracking desk.launch bootstrap_image_topic:=/dvs/image_raw auto_trigger:=true

实时运行

运行

该过程类似于在示例中解释的过程:

  1. 在第一个终端运行ros core。

    1
    roscore
  2. 在第二个终端,启动事件相机驱动程序。

    1
    2
    source ./devel/setup.zsh &&  rosrun davis_ros_driver davis_ros_driver
    # source ./devel/setup.zsh && rosrun dvs_ros_driver dvs_ros_driver
  3. 在另一个终端,启动管道,禁用自动触发。

    1
    source ./devel/setup.zsh &&  roslaunch dvs_tracking live.launch auto_trigger:=false camera_name:=[calibration filename] events_topic:=[events topic]

    例如:

    1
    source ./devel/setup.zsh &&  roslaunch dvs_tracking live.launch auto_trigger:=false camera_name:=DAVIS-ijrr events_topic:=/dvs/events

    如果您的校准文件名为my_camera.yaml,则使用camera_name:=my_camera。确保为两个校准文件使用相同的名称。如果您的传感器在主题/my_sensor/events下输出事件,则使用events_topic:=/my_sensor/events

    对于基于SVO的引导程序,请继续进行步骤4。对于fronto-planar启动器,请转到步骤5。如何设置fronto-planar引导程序在live.launch文件中进行了解释。

    如果您想从传统的帧引导,您可以使用以下命令:

    1
    source ./devel/setup.zsh &&  roslaunch dvs_tracking live.launch bootstrap_image_topic:=[topic raw frames] auto_trigger:=false

    例如bootstrap_image_topic:=/dvs/image_raw.

    在这种情况下,只建议使用基于SVO的引导。建议使用此选项来调试/改进/扩展EVO管道的其余部分,而不必担心引导的质量。

  4. 您应该看到两个rqt GUI。一个是SVO GUI。重置并启动管道,直到它跟踪得很好。确保将命名空间设置为svo

  5. 在EVO GUI中按下Bootstrap按钮。这将自动触发管道。

    或者,也可以一次触发一个模块:

    • rqt_evo中按下Start/Reset按钮。执行一个圆圈(或更多),然后按下Update。这将触发地图创建。
    • 如果地图看起来正确,请按下Switch to tracking开始使用EVO进行跟踪。如果不是,请重复创建地图。
    • 随着摄像机移出当前地图,如果启用了Map-Expansion,则后者将自动更新。您可能会禁用Map-Expansion来使用当前地图(单关键帧跟踪)跟踪高速运动。
    • 场景应该有足够的质感,并且运动应该类似于您可以在提供的示例中看到的运动。
  6. 如果有任何失败,只需按下Ctrl+C并重启实时节点 😉

一些备注:

  • 校准文件路径将构建为$(find dvs_tracking)/parameters/calib/ncamera/$(arg camera_name).yaml$(find dvs_tracking)/parameters/calib/$(arg camera_name).yaml,其中 camera_name作为启动文件的参数指定。您还可以在live.launch中将其设置为默认值。
  • 如果您的传感器提供位于主题/my_sensor/image_raw下框架,并且您想从传统帧引导,则可以使用bootstrap_image_topic:=/my_sensor/image_raw

要实时运行管道,首先根据您的传感器和场景调整模板live.launch。您可以按照以下步骤操作。关于使用哪个引导程序等进一步定制,都在启动文件本身中进行了解释。

校准

确保你为你的事件相机更新了校准文件,在 dvs_tracking/parameters/calib 文件夹中。

确保你的 .yaml 文件与提供的格式相同(单个摄像机格式多摄像机格式)。

请注意,我们为同一传感器有两种不同格式的两个校准文件。单个摄像机格式的文件必须放在 dvs_tracking/parameters/calib 文件夹中,而多摄像机格式的文件必须放在 dvs_tracking/parameters/calib/ncamera 文件夹中。

有关校准的进一步参考资料,请查看事件摄像机的额外资源

调整

在启动文件 dvs_tracking/launch/template.launch 中调整参数。

调整对于整个流程的良好性能至关重要,特别是建图节点中的 min_depthmax_depth 参数,以及 bootstrap 节点参数。

流水线每个模块的所有参数解释可以在 Wiki 中找到。

主要参数可以在模板启动文件中找到,并且会根据上下文进行解释。我们仍然邀请你查看 Wiki,以发现更多的有趣特性 😉

1
git clone https://github.com/uzh-rpg/rpg_dvs_evo_open.wiki.git
模块
全局参数
启动引导
建图
跟踪

如果你不使用平面正面启动引导器,那么你可能需要调整 SVO。

请注意,这可能不是必需的。你可以从传统帧测试 SVO 调整启动引导:

1
source ./devel/setup.zsh &&  roslaunch dvs_tracking live.launch bootstrap_image_topic:=[topic of raw frames] auto_trigger:=[true/false]

例如,bootstrap_image_topic:=/dvs/image_raw

进一步改进

在下面我们概述了目前已知的主要问题和可能的解决方法。非常欢迎你为这个流水线做出贡献,让它变得更好!

可能出现的问题 待办事项
由于操作系统调度器的随机性,rosbags 不可靠 实现 rosbag 数据提供者模式,并确保事件消费的正确性
目前流水线使用多个节点。切换到 nodelets 或使用单个节点可以提高 rosbags 的可重复性。
鲁棒性 启动引导:捕获 SVO 不收敛的情况,并触发自动重启(即人工操作员最终会手动完成的操作)。
追踪:捕获追踪器偏离的情况,并重新初始化。目前我们有两个参数来预测这种情况,即 min_map_sizemin_n_keypoints
提升启动引导的鲁棒性 目前我们有两种用事件启动流水线的有效方法:使用 SVO(用事件帧喂给它)和假设平面正面对准。
减少所需的假设,使它们更可靠,将允许更好的启动引导,减小与从传统帧启动引导的差距(bootstrap_image_topic:=/dvs/image_raw)。

事件摄像机的额外资源

rpg_dvs_evo_open.wiki

1. 主页

EVO: 实时事件驱动的6自由度并行追踪与建图的几何方法的维基页面。

如需超参数文档,请查看右侧主题 =================================================>

2. 启动参数

本页详细描述了影响启动模块的参数的目的。

如果您计划修改或扩展启动模块,请参阅文档

目录

  1. 运动补偿
  2. 可视化与管道连接
  3. [[可选] 中值滤波](#[可选] 中值滤波)
  4. [[可选] 自适应阈值](#[可选] 自适应阈值)
  5. [[可选] 将事件帧保存在磁盘上](#[可选] 将事件帧保存在磁盘上)
  6. 前向平面启动

运动补偿

这些是此模块最主要和最重要的参数。事件是由相机运动产生的,因此,通常情况下,仅将收集的事件在同一图像上聚合并不会产生一个聚焦的事件帧。

启动器接受一组事件,并产生一个运动校正的事件帧。为此,它考虑了在一组事件的开始和结束处的local_frame_size 事件来聚合。

参数 描述
frame_size 在事件帧中聚合的事件数量
local_frame_size 用于计算变形参数的两批事件的大小

然后,对生成的局部帧运行一个优化算法,以估计与聚合的frame_size 事件相关的相机运动所产生的变形。

参数 描述
unwarp_estimate_n_it 估计单应性的最大迭代次数
unwarp_estimate_eps 单应性估计公差
unwarp_estimate_pyramid_lvls 用于估计单应性的金字塔级别

然后,使用估计的变形来聚合整组事件,考虑运动失真。

参数 描述
min_step_size 下一个事件帧之前的最小新事件数
events_scale_factor 像素强度 = 饱和(#事件 / events_scale_factor)

可视化与管道连接

参数 描述
enable_visualizations 是否发布事件帧和光流
motion_corrected_topic 发布的事件帧的主题
optical_flow_topic 光流发布的主题

请注意,参数motion_corrected_topic可用于将生成的事件帧作为输入,提供给视觉里程测量管道,例如SVO。

或者,您可以简单地扩展类EventsFramesBootstrapper。这是在FrontoPlanarBootstrapper中使用的方法。

[可选] 中值滤波

可以选择在运动补偿的事件帧上引入中值滤波。

参数 描述
median_filtering 是否进行中值滤波
median_filter_size 滤波器大小

[可选] 自适应阈值

可以选择在运动补偿的事件帧上引入自适应阈值。

参数 描述
adaptive_thresholding 是否进行自适应阈值处理
activation_threshold_min 最小像素强度
activation_threshold_patch_size 滤波器补丁大小

[可选] 将事件帧保存在磁盘上

还可以将生成的事件帧存储在磁盘上,以便以后处理和分析。

例如,您可能想首先在可重复的环境中离线测试基于事件帧的视觉里程测量算法。

参数 描述
max_events_frames_saved_to_file 存储在磁盘上的事件帧数量
events_frames_filename_format 存储的事件帧的文件名格式

请注意,如果max_events_frames_saved_to_file = 0,则不存储帧。

前向平面启动

如果你使用的是前向平面启动,你可能也想调整这些参数。

参数 描述
plane_distance 事件帧被重新投影的距离
one_shot 如果为真,则只发布单个地图然后进入空闲状态
n_subscribers_to_wait 在发布地图之前等待一些订阅者

在事件帧被重新投影后,使用半径过滤器进一步过滤地图。

参数 描述
radius_search 半径过滤器的半径大小
min_num_neighbors 半径过滤的最小邻居数量

3. 全局参数

以下参数对所有模块通用:

参数 描述
auto_trigger 是否自动触发管道
dvs_frame_id 启动后考虑的帧ID
dvs_bootstrap_frame_id 启动期间考虑的帧ID
world_frame_id 考虑的世界帧ID
min_depth 体素网格最小深度
max_depth 体素网格最大深度
num_depth_cells 深度单元数
fov_virtual_camera_deg fov 虚拟相机(体素网格)
virtual_width 体素网格宽度
virtual_height 体素网格高度

4. 图像重建参数

参数 描述
window_size EKF更新间的事件窗口
map_blur 高斯模糊核大小
sigma_m EKF的σ
init_cov EKF的协方差初始猜测

5. 映射参数

此页面总结了影响映射模块的参数的目的。请考虑查阅更多的参考资料以获取更多关于映射算法如何使用这些参数的细节。

如果您计划修改或扩展映射模块,请参考文档

目录

  1. 事件处理
  2. DSI
  3. 来自体素网格的点云
  4. 地图扩展
  5. 更多的参考资料

事件处理

参数 描述
skip_batches 在优化期间跳过的事件批次数量
skip_batches_for_reset 重置后在优化期间跳过的事件批次数量
max_event_rate 每秒处理的最大事件数;最终为满足此条件而丢弃事件
frame_size 计算新地图时聚集的事件数量
min_batch_size 需要更新地图的最小新事件数
events_to_recreate_kf 创建新关键帧以定位体素网格姿态时考虑的事件数量

DSI

参数 描述
min_depth 体素网格最小深度
max_depth 体素网格最大深度
num_depth_cells 深度单元数量
fov_virtual_camera_deg 虚拟相机(体素网格)的视场角
virtual_width 体素网格宽度
virtual_height 体素网格高度
adaptive_threshold_kernel_size 自适应阈值过滤器的大小
size adaptive_threshold_c 自适应阈值常数偏移

请注意,只有最后两个参数实际上是模块的私有参数,其他参数是共享的,并且也在全局参数wiki页面中描述。

来自体素网格的点云

参数 描述
type_focus_measure 使用的聚焦度量类型
radius_search 半径滤波器的半径大小
min_num_neighbors 半径滤波器的最小邻居数
voxel_filter_leaf_size 体素滤波器的粒度
median_filter_size 深度图上中值滤波器的大小
accumulate_local_map_once_every 1累积所有的局部地图,n每n累积1个
global_point_cloud_skip_first 累积全局点云时跳过的局部图数量
radius_search_global_map 全局点云上半径滤波器的半径大小
min_num_neighbors_global_map 全局点云上半径滤波器的最小邻居数

请注意,全局点云不是全局地图,但它是通过累积不同的局部点图构建的。

当前可用的聚焦度量摘要在下表中。

type_focus_measure 描述
0 Linf: 选择体素在投票局部最大值处的3D点
1 Contrast: 选择体素网格对比度最大处的3D点
2 Gradient magnitude: 选择渐变幅度最大处的3D点

Linf

不需要额外参数。

Contrast

参数 描述
half_patchsize 估计对比度的高斯滤波器大小

Gradient magnitude

参数 描述
half_patchsize 计算代数导数的索贝尔滤波器大小

地图扩展

参数 描述
rate 节点检查是否需要扩展的频率
visibility_threshold 可见性低于此值时触发更新
coverage_threshold 投影地图覆盖的最小像素阈值
baseline_threshold 更新被触发的基线/平均深度比率上限
number_of_initial_maps_to_skip 在此数量的地图之后开始检查更新条件

更多的参考资料

要充分理解映射模块中参数的使用方式,请参考:

6. 跟踪参数

此页面总结了影响跟踪模块的参数的目的。请考虑查阅参考资料以获取更多关于跟踪算法如何使用这些参数的细节。

如果您计划修改或扩展跟踪模块,请参考文档

目录

  1. 基本参数
  2. 轨迹估计
  3. LKSE3参数
  4. [[可选] 稳健性](#[可选] 稳健性)
  5. [[可选] 可视化](#[可选] 可视化)
  6. 进一步的参考文献

基本参数

参数 描述
discard_events_when_idle 当处于闲置状态时是否不收集事件

轨迹估计

参数 描述
max_event_rate 事件被随机采样以保持速率低于此值
events_per_kf 生成新关键帧所需的事件
frame_size 考虑的事件窗口
step_size 等待更新姿态前的最少新事件数
noise_rate 如果事件速率低于此值,则跳过帧
pose_mean_filter_size 中值滤波器大小(姿态进行中值滤波)

LKSE3参数

参数 描述
batch_size 批量梯度下降的批大小
max_iterations 优化中的最大迭代次数
map_blur 应用于重新投影地图的高斯滤波器的西格玛
pyramid_levels 在KLT过程中使用的金字塔级别数量
weight_scale_translation 在平移误差中使用的权重
weight_scale_rotation 在旋转误差中使用的权重

请参考文档以深入了解这些参数如何在我们基于SE3群的Lucas-Kanade跟踪器实现中使用,或考虑阅读链接的参考文献

[可选] 稳健性

为了进一步提高管道的稳健性,可以在满足特定条件时引入触发策略。

参数 描述
min_map_size 进行更新所需的最小地图点数
min_n_keypoints 需要可靠跟踪的提取关键点的最小数目 (LKSE3::keypoints_)

[可选] 可视化

这些参数用于自定义重投影地图和累积事件帧的图像并置展示。

参数 描述
event_map_overlap_rate 可视化的发布频率
max_depth 场景中预期的最大深度(建议使用体素网格大小)
min_depth 场景中预期的最小深度(建议使用体素网格大小)

以下参数描述了其中的一些条件。

参数 描述
min_map_size 进行更新所需的最小地图点数
min_n_keypoints 需要可靠跟踪的提取关键点的最小数目 (LKSE3::keypoints_)

进一步的参考文献

要充分理解这些参数如何在跟踪模块中被使用,请参考:


EVO编译运行调试记录
http://zeyulong.com/posts/2ef058d1/
作者
龙泽雨
发布于
2024年2月7日
许可协议