ESVO编译运行调试记录
本文最后更新于 2024年4月11日 下午
本文主要分享了自己在编译和运行论文《Event-Based Stereo Visual Odometry》(下面简称为ESVO)的代码时的调试记录,另附基于ESVO的拓展代码SEVIO和ESVO_extension的编译运行过程。
ESVO简介
ESVO 是一种利用双目事件相机实现实时视觉里程计的新型策略。提出的建图方法和跟踪方法都利用了统一的事件表示(时间表面) ,因此,它可以看作是一种“直接”的,以原始事件为输入的几何方法。
有关更详细的信息和测试事件数据,请参考ESVO项目页。
相关出版物:
- Event-based Stereo Visual Odometry, Yi Zhou, Guillermo Gallego, Shaojie Shen, IEEE Transactions on Robotics (T-RO) 2021.
- Semi-dense 3D Reconstruction with a Stereo Event Camera, Yi Zhou, Guillermo Gallego, Henri Rebecq, Laurent Kneip, Hongdong Li, Davide Scaramuzza, ECCV 2018.
项目文件解读
./ESVO/esvo_core/include/
:./container
: 包含数据结构和数据容器类。./core
: 标识了它属于核心功能的一部分。./optimization
: 定义了一个模板结构体OptimizationFunctor
,用作 Eigen 非线性优化工具箱的通用基类(functor)。./tools
: 包含实用程序和算法工具。
./ESVO/dependencies.yaml
- 该
dependencies.yaml
文件列出了一个源代码项目在构建和运行时所依赖的外部库。这些库通过catkin
构建系统进行管理,通常用于ROS(Robot Operating System)项目。每一个依赖项提供了三个关键信息:类型、URL和版本。在这个文件中,所有依赖项都是从Git仓库中获取的,且均指定为master
分支。 - 这个文件主要用于配置项目的依赖管理系统,确保所有所需的外部库均能被正确拉取并集成到项目中。这对于确保代码的一致性和可复现性是非常重要的。
- 该
.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_surface
ROS节点(用于构造时间表面)。./ESVO/esvo_time_surface/launch/rosbag_launcher/xxx/rosbag.launch
: 启动esvo_time_surface
ROS节点(播放rosbag包)。./ESVO/esvo_core/launch/system/system_xxx.launch
: 启动esvo_core
ROS节点(用于跟踪)。./ESVO/esvo_core/launch/mvstereo/mvstereo_xxx.launch
: 启动esvo_core
ROS节点(用于MVS建图)。
./ESVO/xxx/package.xml
- 此文件是一个ROS(Robot Operating System)软件包的清单文件,用于定义包的基本信息和依赖关系。
- 这个文件主要被ROS用来理解如何构建和维护程序包,并且定义了必要的信息,使得包可以在ROS生态中被正确找到和编译。
./ESVO/esvo_core/calib/xxx/(left/right).yaml
- 一个YAML格式的文件,它包含了特定相机的标定参数。
- 这些参数包括图像尺寸、相机内参矩阵、畸变模型和畸变系数、校正矩阵、投影矩阵以及右相机相对于左相机的变换矩阵。
- 这种文件通常用于机器视觉和机器人系统,用来纠正相机拍摄图像的畸变,并将图像坐标转换为实际世界坐标。
./ESVO/esvo_core/cfg/DVS_MappingStereo.cfg
- 该程序文件名为
DVS_MappingStereo.cfg
是一个配置脚本,它属于一个名叫esvo_core
的包,并且这个项目与源代码项目ESVO
(Event-based Stereo Visual Odometry)相关。这个脚本使用dynamic_reconfigure
功能,来允许实时修改运行中ROS节点的参数。 - 在最后,脚本执行
generate
函数来创建一个用于动态配置的服务,该服务可以在ROS运行时动态调整上述参数。
- 该程序文件名为
./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
的值可能需要根据实际环境进行修改。
- 该文件
./ESVO/esvo_core/cfg/time_surface/ts_parameters.yaml
- 这个
ts_parameters.yaml
文件是一个配置文件,用于设定时间表面(Time Surface)参数。在事件相机数据处理中,时间表面是一种将事件信息编码成易于分析的形式。
- 这个
./ESVO/esvo_core/cfg/mvstereo/mvstereo_xxx.yaml
- 配置文件包含各种参数设置,这些参数影响了多视角双目视觉系统(Multi-View Stereo, MVStereo)的行为和性能。
./ESVO/esvo_core/cfg/mapping/mapping_xxx.yaml
- 此文件包含用于调整 ESVO (Event-based Stereo Visual Odometry) 系统建图部分参数的配置文件。
./ESVO/xxx/.perspective
- 这是一个JSON格式的配置文件,用于定义一个名为
ESVO
的软件项目中的esvo_time_surface
插件的窗口布局和行为。基于文档结构,这看起来像是为图形用户界面(GUI),如rqt
插件制定的配置。rqt
是一个基于Qt的软件框架,它使得为机器人操作系统(ROS)创建丰富的图形界面变得简单。 - 总的来说,这个配置文件为ESVO项目中的
esvo_time_surface.perspective
插件提供了窗口布局、插件状态和用户界面元素的详细信息。
- 这是一个JSON格式的配置文件,用于定义一个名为
./ESVO/esvo_core/.rviz
.rviz
文件是一个用于配置 ROS (Robot Operating System) 可视化工具 RViz 的视图配置文件。RViz 是一个用来对机器人传感器数据、导航状态以及其他信息进行三维可视化的工具。这个文件定义了RViz中的一系列面板、显示项、视图以及工具的属性和设置。
数据集下载
原始数据集
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 |
|
提示:
-
对于Eigen,安装配置、使用3.3.0的版本,使用3.4.0版本会报错。可以参考链接:Eigen的安装与版本管理。
-
对于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的版本,还是自行寻找使用的系统中其它的版本,从而产生报错。
-
如果自己之前有源码安装的PCL,最好检查一下,不要安装到系统根目录下,也就是默认的
/usr/local/
下。如果安装到了/usr/local/
下,最后链接PCL的库的时候会默认链接到这个路径下的库。但是绝大部分搭建在ROS上的工程都是使用ROS自带的pcl-1.8的,这个时候虽然编译可以通过,但是运行的时候会出错,且报错信息不会有这方面的提示。血泪教训。具体说明见下文。 -
如果终端是在conda环境下的话,最好提前退出conda环境,因为conda和ros有冲突:
1
conda deactivate
-
如果在编译运行过程中遇到了关于gcc、g++的版本问题,可以参考链接:gcc、g++的安装与版本管理。
2. 配置事件相机驱动器
ROS DVS 包为动态视觉传感器(DVS/DAVIS)提供 C++ 驱动程序。即使您没有 DAVS 或 DAVIS 设备,您仍然可以使用此驱动程序读取预先录制的事件数据文件。该软件包还提供了一个校准工具,为本征intrinsic和双目stereo校准。
将下面提到的ROS版本替换为你自己的版本。
-
安装ROS依赖项:
1
2
3# melodic/kinetic/Noetic
sudo apt-get install ros-melodic-camera-info-manager
sudo apt-get install ros-melodic-image-view -
安装libcaer
-
首先根据下面的网站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
。 -
安装libcaer:
1
sudo apt-get install libcaer-dev
-
-
安装catkin tools:
1
sudo apt-get install python-catkin-tools
-
创建一个catkin工作区:
1
2
3
4
5
6
7
8
9cd 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 -
克隆catkin_simple包,它将用于构建 DVS/DAVIS 驱动程序包:
1
2cd yourfolder/catkin_ws/src
git clone https://github.com/catkin/catkin_simple.git -
克隆 rpg_dvs_ros 的存储库:
1
2cd yourfolder/catkin_ws/src
git clone https://github.com/uzh-rpg/rpg_dvs_ros.git -
构建软件包:
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 -
您可以通过运行提供的启动文件来测试安装。它启动驱动程序(DVS 或 DAVIS)和渲染器(图像查看器)。
-
首先,构建渲染器:
1
2cd 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进行修改,即可。
- 20240109更新:编译
-
建立环境:
1
2
3
4
5
6
7
8source 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打开文件,查看是否加入 -
然后,启动示例(无示例,略):
1
2
3roslaunch 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 -
得到运行结果。
-
-
如果您没有DAVIS,您仍然可以使用此驱动程序读取记录的文件。示例:
-
下载数据集的序列,如slider_deep.bag。
-
打开第一个终端,启动roscore:
1
roscore
-
在第二个终端,播放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 -
在第三个终端中,启动 DVS/DAVIS 渲染器:
1
2source ./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
文件里,events
、image
等参数指向的路径。 -
你可以看到连续图像的播放。
-
-
(可选)对于来自 DAVIS 的实时数据流(即,不是记录的文件) ,您可以使用动态重新配置 GUI 根据需要调整 DVS/DAVIS 参数。运行
1
2
3
4
5# 第一个终端
roscore
# 第二个终端
source ./devel/setup.zsh
rosrun rqt_reconfigure rqt_reconfigure一个窗口将会出现。
选择 davis_ros_Driver(在左侧面板中),您应该会得到 GUI,它允许您修改传感器的参数。
3. 安装依赖
-
您应该已经在第2节创建了一个
catkin
工作区。如果没有,请返回并创建一个。 -
将此存储库克隆到
catkin
工作区的文件夹中。1
2cd yourfolder/catkin_ws/src
git clone https://github.com/HKUST-Aerial-Robotics/ESVO.git -
依赖关系在
./ESVO/dependencies.yaml
文件中指定。它们可以通过以下命令从您的catkin
工作区的src
文件夹中安装:1
2
3cd yourfolder/catkin_ws/src
sudo apt-get install python3-vcstool
vcs-import < ESVO/dependencies.yaml上面的命令应该将存储库克隆到
catkin_simple
、glog_catkin
、gflag_catkin
、minkindr
等文件夹中,这些文件夹位于catking
工作区的src
文件夹中,与这个存储库(ESVO
)处于同一级别。提示:
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/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" -
你可能需要
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 -
yaml-cpp
只用于从yaml
文件加载校准参数:1
2
3
4
5cd 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 -
你应该安装好了有 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 -
其他 ROS 依赖项应该已经在第2节中安装。如果有问题,安装相应缺失的依赖项。
-
(可选)使用CLion编译项目时
./catkin_ws/src/minkindr/minkindr_python
会报错找不到文件catkin_boost_python_buildtool
和numpy_eigen
(使用终端编译时不会报错)。猜测是CLion会自动编译工作区内所有的包,而使用终端编译时只指定了特定的包。解决方法:下载catkin_boost_python_buildtool和numpy_eigen后解压放到
./catkin_ws/src/
文件夹下重新编译。
4. 安装 ESVO
-
编译
1
2
3
4
5
6
7
8cd 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:
-
报错信息:error: no match for ‘operator<=’ (operand types are ‘Eigen::internal::enable_if<true, Eigen::IndexedView<Eigen::Matrix<int, -1, -1>, double, double> >::type {aka Eigen::IndexedView<Eigen::Matrix<int, -1, -1>, double, double>}’ and ‘double’)
-
解决方法:
https://github.com/HKUST-Aerial-Robotics/ESVO/issues/20
https://blog.csdn.net/qq_29876847/article/details/128336408
Eigen版本切换,指定使用的Eigen版本为3.3.0。3.4.0会报错。参考链接:Eigen的安装与版本管理。
报错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版本。
-
-
刷新环境变量
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
2rostopic 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 |
|
这个包实现了一个不断更新双目时间图(即时间表面)的节点。要单独启动它,打开一个终端并运行命令:
1 |
|
要播放一个bag包,请转到esvo_time_surface/launch/rosbag_launcher
,并根据您的bag包文件下载的位置修改[bag_name].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 # 可以解决报错 -
ROS:ModuleNotFoundError: No module named 'PySide2'
1
2
3
4
5# 安装了anaconda 导致的
which pip
pip install PySide2 # 不能彻底解决问题
# 或
conda deactivate # 可以解决报错
esvo_core
运行
1 |
|
这个包实现了提出的建图和跟踪方法。初始化在建图部分内部实现。要启动它,打开一个终端并运行命令:
1 |
|
这将同时启动两个esvo_time_surface
节点(分别用于左右事件相机)、建图节点和跟踪节点。然后播放运行输入的包文件:
1 |
|
若要在任何时候保存轨迹,请转到另一个终端并通过以下方式终止系统:
1 |
|
您需要在ESCO/esvo_core/cfg/trace_xxx.yaml
中设置将保存结果文件的路径。
1 |
|
报错
-
-
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共存。完美解决!具体步骤:
-
找到当时源码安装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 -
上述命令只会删除掉文件夹里的文件,会留下空文件夹。所以可以继续对照
install_manifest.txt
文件,手动删掉多余的空文件夹。我这里是:1
2sudo rm -r /usr/local/include/pcl-1.8/
sudo rm -r /usr/local/share/pcl-1.8/ -
如果该方法不行。尝试其它方法也不行的话。可以尝试卸载重装ROS:ROS的安装与卸载。
附:
ESVO的GitHub Issues上关于这个报错的讨论(没有看到通用的解决办法):
-
esvo_core/mvstereo
1 |
|
该模块实现了ESVO的建图器和其他一些基于事件的建图方法(如[26],[45])。作为一个多视图双目(MVS)管道,它假设姿势是已知的先验。要启动建图器,请运行:
1 |
|
这将同时启动两个esvo_time_surface
节点(分别用于左右事件相机)、建图节点和跟踪节点。然后播放运行输入的包文件:
1 |
|
请注意,只有rpg
和upenn
数据集适用于这个模块,因为它们含有地面真值。
其他
conda环境安装
自己曾尝试在激活conda环境的情况下运行ESVO(ROS),主要是为了解决PCL库问题的一种尝试,当时以为是本地Qt的问题,所以想使用conda的Qt尝试解决问题。
当然,最后不了了之,也是conda deactivate
运行起来更简单直接。
下面的配置自建conda环境的步骤供参考:
1 |
|
指定此时系统使用conda环境里的Qt:
1 |
|
验证安装: 安装完成后,你可以通过运行简单的测试来验证Qt是否正确安装和配置。
1 |
|
运行这个Python脚本,如果一切正常,你应该会看到一个简单的窗口。
1 |
|
后续安装:
1 |
|
(往下没有继续踩坑)
评估
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。
数据集下载
我们测试的数据集可以从sequences中下载。
编译
我们已经使用以下配置在机器上测试了 SEVIO:
- Ubuntu 18.04.5 LTS + ROS melodic + OpenCV 3.2
编译过程与ESVO一致。这里只提供关键步骤:
1 |
|
运行
time_surface
这个包实现了一个不断更新立体时间图(即时间表面)的节点。要单独启动它,打开一个终端并运行命令:
1 |
|
要播放一个bag包,请转到sevio_time_surface/launch/rosbag_launcher
,并根据您的bag包文件下载的位置修改[bag_name].launch
中的路径。然后执行:
1 |
|
full system
启动系统:
1 |
|
这将同时启动两个esvo_time_surface
节点(分别用于左右事件相机)。然后播放运行输入的包文件:
1 |
|
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.
仿真数据集
我们使用基于事件相机的模拟器:ESIM来收集几个模拟的双目事件相机序列。双目事件相机在具有不同背景的墙壁前执行平面或6DoF运动:简单形状、棋盘和办公室。这些序列可用于算法验证。可以在这里下载(无需连接外网下载)。
编译
编译过程与ESVO一致。这里只提供关键步骤:
-
使用的代码文件为
ESVO_extension-multi_rep_tracking-default.zip
。 -
从下载链接下载
cnpy_catkin
到./catkin_ws/src
文件夹。 -
(可选)从下载链接下载并重命名文件为
cnpy.zip
,修改./catkin_ws/src/cnpy_catkin/CMakeLists.txt
:1
2# URL https://github.com/rogersce/cnpy/archive/4e8810b1a8637695171ed346ce68f6984e585ef4.zip
URL "/yourfolder/cnpy.zip" -
编译运行。
1
2
3
4
5
6
7
8
9
10
11cd 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
10sudo 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_;参考链接:
运行
问:如何运行这个代码与我自己的单目事件相机数据集?因为我看到的
system_rpg.launch
和system_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 |
|
(取消掉.lanuch
文件<!-- Visualization -->
模块的注释来在程序运行时进行可视化)
这将同时启动一个esvo_time_surface
节点(用于左事件摄像头)和建图节点。建图器中不使用时间曲面,而是用于与原始ESVO兼容的API。
1 |
|
按下空格
开始播放.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 |
|
启动esvo_time_surface
节点:
1 |
|
按下空格
开始播放.bag
文件。
Tracking.cpp
ESVO使用时间曲面(TS)来跟踪跟踪问题,而EVO使用二元事件映射(EM)来跟踪问题。该模块还实现了基于EM的跟踪器,用于比较评估。完整的实验结果将发表。
评估
我们编写一个脚本来执行批处理测试和评估。在不同的事件表示上运行带有跟踪器的ESVO:
1 |
|
我们使用这个包: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
中使用。