EVO编译运行调试记录
本文最后更新于 2024年2月7日 下午
本文主要分享了自己在编译运行论文《EVO: A Geometric Approach to Event-Based 6-DOF Parallel Tracking and Mapping in Real Time》的源代码时的调试记录。
数据集
代码附带了一个测试数据集。如果您没有事件相机并希望在更多数据上运行代码,可以执行以下操作之一:
- 使用我们的事件相机数据集之一:
- 使用事件相机模拟器生成一个:http://rpg.ifi.uzh.ch/esim/index.html
- 使用我们上述引用的“视频到事件:为事件相机回收视频数据集”的代码将标准视频转换为事件:https://github.com/uzh-rpg/rpg_vid2e
环境配置
1 |
|
开始使用
本软件依赖于 ROS。安装说明可在此处找到。我们在Ubuntu 18.04和ROS Melodic上测试了这个软件。ROS的安装与卸载
-
如有需要,创建并初始化一个新的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
-
克隆此仓库。
cd src/ && git clone git@github.com:uzh-rpg/rpg_dvs_evo_open.git
-
克隆(并修复)依赖关系。
官方说明:
./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]
。-
添加PPA(Personal Package Archive)存储库。
1
2
3
4sudo 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 -
安装
libopencv-dev=3.2.0+dfsg-4ubuntu0.1
。-
查看系统中已安装的
libopencv-dev
。1
apt list --installed | grep -i libopencv-dev # 模糊搜索
如果没有,或者版本为
3.2.0
就可以跳过这个步骤。如果版本为4.2.0
,那么建议卸载重装3.2.0
版本。 -
卸载
libopencv-dev=4.2.0+dfsg-6~bionic
。1
2
3sudo apt remove libopencv-dev # 卸载软件
sudo apt-get purge libopencv-dev # 清除配置
# 会同时卸载掉libcaer-dev?所以libcaer-dev建议在后面安装。 -
安装
libopencv-dev=3.2.0+dfsg-4ubuntu0.1
。-
查看系统可选的安装版本。
1
2
3
4sudo apt update # 先更新软件包列表,检查可用的软件包更新
# 查看可选的安装版本
apt-cache policy libopencv-dev
apt-cache search libopencv-dev -
安装依赖库。如果直接使用
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
20sudo 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 -
安装
libopencv-dev=3.2.0+dfsg-4ubuntu0.1
。1
sudo apt install libopencv-dev=3.2.0+dfsg-4ubuntu0.1 # 安装软件
-
-
-
源码编译安装
libcaer-dev
。-
查看系统中是否已安装的
libcaer-dev
。1
apt list --installed | grep -i libcaer-dev # 模糊搜索
-
卸载之前使用
sudo apt install
命令安装的libcaer-dev
。1
2sudo apt remove libcaer-dev # 卸载软件
sudo apt-get purge libcaer-dev # 清除配置 -
源码编译安装
libcaer-dev
。1
2
3
4
5
6
7
8sudo 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
-
-
安装其他依赖库。
1
2
3
4
5
6
7
8
9
10
11
12
13sudo 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 -
vcs-import < rpg_dvs_evo_open/dependencies.yaml
下载的第三方库在
./catkin_ws/src/
目录下,与rpg_dvs_evo_open
文件夹同级。 -
为防止网路下载不稳定的情况,可以将第三方库
CmakeLists.txt
中的下载链接替换为本地路径。-
gflags_catkin
。下载v2.2.1.zip到yourfolder/
并重命名为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" -
nanoflann_catkin
。下载nanoflann到yourfolder/
并重命名为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"
-
-
你可能需要
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
-
-
构建包。
1
2
3catkin 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
。
-
-
OpenCV报错未定义的引用。使用OpenCV的安装与版本管理中的版本管理方法1(EVO使用方法2反而不行)。如果
rpg_dvs_ros/dvs_calibration/CMakeLists.txt
报错,则尝试使用版本管理方法2。
-
-
之后别忘了刷新工作区!
1
2source ./devel/setup.bash
# source ./devel/setup.zsh
示例
在下表中列出了每个示例的特定启动文件(精调)。最有趣和可重复的一个(由于引导序列,请参阅进一步改进)是多关键帧序列。
示例 | 启动文件 | Rosbag |
---|---|---|
多关键帧序列 | flyingroom.launch | 538 MB |
桌面序列 | desk.launch | 145 MB |
下载rosbags,您可以使用以下命令:
1 |
|
例如,以下命令将下载多关键帧序列rosbag:
1 |
|
要从rosbag运行管道,首先作为下面的启动管道
1 |
|
然后,一旦加载了所有内容,运行rosbag如下
1 |
|
例如,
1 |
|
请注意,我们将auto_trigger
参数设置为true。您也可以将其设置为false,然后按照如何实时运行的指示进行操作。
如果有什么失败,只需重试(给它几个机会!),并确保严格按照上面的说明进行操作。
在进一步改进部分概述了运行代码可能出现的问题。为了提高播放rosbags的可靠性(实时运行更简单),考虑使用-r .7
来降低速率。特别是当硬件不够强大时,这会有所帮助。
例如,
1 |
|
最终,设置bootstrap_image_topic:=/dvs/image_raw
将从传统帧引导,然后仅切换到事件。这是目前可用的最可靠的引导方式。
1 |
|
实时运行
运行
该过程类似于在示例中解释的过程:
-
在第一个终端运行ros core。
1
roscore
-
在第二个终端,启动事件相机驱动程序。
1
2source ./devel/setup.zsh && rosrun davis_ros_driver davis_ros_driver
# source ./devel/setup.zsh && rosrun dvs_ros_driver dvs_ros_driver -
在另一个终端,启动管道,禁用自动触发。
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管道的其余部分,而不必担心引导的质量。
-
您应该看到两个rqt GUI。一个是SVO GUI。重置并启动管道,直到它跟踪得很好。确保将命名空间设置为
svo
。 -
在EVO GUI中按下
Bootstrap
按钮。这将自动触发管道。或者,也可以一次触发一个模块:
- 在
rqt_evo
中按下Start/Reset
按钮。执行一个圆圈(或更多),然后按下Update
。这将触发地图创建。 - 如果地图看起来正确,请按下
Switch to tracking
开始使用EVO进行跟踪。如果不是,请重复创建地图。 - 随着摄像机移出当前地图,如果启用了
Map-Expansion
,则后者将自动更新。您可能会禁用Map-Expansion
来使用当前地图(单关键帧跟踪)跟踪高速运动。 - 场景应该有足够的质感,并且运动应该类似于您可以在提供的示例中看到的运动。
- 在
-
如果有任何失败,只需按下
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_depth
和 max_depth
参数,以及 bootstrap
节点参数。
流水线每个模块的所有参数解释可以在 Wiki 中找到。
主要参数可以在模板启动文件中找到,并且会根据上下文进行解释。我们仍然邀请你查看 Wiki,以发现更多的有趣特性 😉
1 |
|
模块 |
---|
全局参数 |
启动引导 |
建图 |
跟踪 |
如果你不使用平面正面启动引导器,那么你可能需要调整 SVO。
请注意,这可能不是必需的。你可以从传统帧测试 SVO 调整启动引导:
1 |
|
例如,bootstrap_image_topic:=/dvs/image_raw
。
进一步改进
在下面我们概述了目前已知的主要问题和可能的解决方法。非常欢迎你为这个流水线做出贡献,让它变得更好!
可能出现的问题 | 待办事项 |
---|---|
由于操作系统调度器的随机性,rosbags 不可靠 | 实现 rosbag 数据提供者模式,并确保事件消费的正确性 |
目前流水线使用多个节点。切换到 nodelets 或使用单个节点可以提高 rosbags 的可重复性。 | |
鲁棒性 | 启动引导:捕获 SVO 不收敛的情况,并触发自动重启(即人工操作员最终会手动完成的操作)。 |
追踪:捕获追踪器偏离的情况,并重新初始化。目前我们有两个参数来预测这种情况,即 min_map_size 和 min_n_keypoints 。 |
|
提升启动引导的鲁棒性 | 目前我们有两种用事件启动流水线的有效方法:使用 SVO(用事件帧喂给它)和假设平面正面对准。 |
减少所需的假设,使它们更可靠,将允许更好的启动引导,减小与从传统帧启动引导的差距(bootstrap_image_topic:=/dvs/image_raw )。 |
事件摄像机的额外资源
rpg_dvs_evo_open.wiki
1. 主页
EVO: 实时事件驱动的6自由度并行追踪与建图的几何方法的维基页面。
如需超参数文档,请查看右侧主题 =================================================>
2. 启动参数
本页详细描述了影响启动模块的参数的目的。
如果您计划修改或扩展启动模块,请参阅文档。
目录
- 运动补偿
- 可视化与管道连接
- [[可选] 中值滤波](#[可选] 中值滤波)
- [[可选] 自适应阈值](#[可选] 自适应阈值)
- [[可选] 将事件帧保存在磁盘上](#[可选] 将事件帧保存在磁盘上)
- 前向平面启动
运动补偿
这些是此模块最主要和最重要的参数。事件是由相机运动产生的,因此,通常情况下,仅将收集的事件在同一图像上聚合并不会产生一个聚焦的事件帧。
启动器接受一组事件,并产生一个运动校正的事件帧。为此,它考虑了在一组事件的开始和结束处的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. 映射参数
此页面总结了影响映射模块的参数的目的。请考虑查阅更多的参考资料以获取更多关于映射算法如何使用这些参数的细节。
如果您计划修改或扩展映射模块,请参考文档。
目录
事件处理
参数 | 描述 |
---|---|
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. 跟踪参数
此页面总结了影响跟踪模块的参数的目的。请考虑查阅参考资料以获取更多关于跟踪算法如何使用这些参数的细节。
如果您计划修改或扩展跟踪模块,请参考文档。
目录
基本参数
参数 | 描述 |
---|---|
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_) |
进一步的参考文献
要充分理解这些参数如何在跟踪模块中被使用,请参考: