原始题目 | VOOM: Robust Visual Object Odometry and Mapping using Hierarchical Landmarks |
---|---|
中文名称 | 使用分层landmarks 的 Robust 视觉目标里程计和建图 |
发表时间 | 2024 年 2 月 21 日 |
平台 | ICRA 2024 |
来源 | 北京理工大学 |
文章链接 | https://arxiv.org/abs/2402.13609 |
开源代码 | https://github.com/yutongwangBIT/VOOM |
VOOM 是一个实时视觉同步定位与地图构建(SLAM)库,它使用高级物体和低级点作为分层 landmarks,以粗到细的方式进行处理。它计算摄像头的轨迹和稀疏的三维重建。
摘要
近年来,面向对象的同步定位与地图构建(SLAM)因其在保持计算效率的同时提供高级语义信息的能力而受到越来越多的关注。
一些研究人员试图通过将 the modeled object residuals 集成到 bundle adjustment 中来提高定位精度。然而,很少有表现出比基于特征的视觉 SLAM 系统更好的结果,因为通用的粗糙对象模型(如长方体或椭球体)不如特征点准确。
在本文中,我们提出了一种视觉对象里程计和建图框架 VOOM(Visual Object Odometry and Mapping ),该框架使用高级对象和低级点作为分层 landmarks,从粗到细的方式,而不是直接使用 object residuals 进行 bundle adjustment。
- 首先,介绍了一种改进的 观测模型( observation model)和一种新的双二次函数 数据关联方法( data association method),用于表示物理对象。它有助于创建紧密反映现实的 3D 地图。
- 接下来,我们使用 对象信息 来增强 特征点的数据关联,从而更新地图。
- 在视觉对象里程计后端,使用更新的地图来进一步优化相机姿势和对象。
- 同时,在我们的 视觉对象建图过程中,利用对象和基于点的可视性图执行 local bundle adjustment。
- 实验表明,VOOM 在定位方面优于面向对象的 SLAM 和特征点 SLAM 系统,如 ORB-SLAM2。
1. 引言
准确的定位和建图在各种应用中至关重要,包括自主导航、机器人操作和增强现实。
相机具有成本效益且易于集成,同时提供丰富的几何形状和语义信息,使其适用于真实场景。因此,视觉里程计 或 同步定位和映射(SLAM)引起了研究人员的日益关注。
然而,传统视觉里程计或SLAM框架 map points as landmarks 缺乏 高级信息,导致鲁棒性和适用性有限[1]–[3],这导致人们对 对象级里程计和建图算法[4]–[6]的兴趣日益浓厚,尤其是在一些使用长方体或双二次体作为 landmarks 的轻量级方法[7],[8]。
目前的算法主要集中在构建更准确的物体 landmarks [9]、[10],以及利用物体信息[11]–[13]提高定位精度。尽管这些方法将对象残差纳入 bundle adjustment 中,但它们依赖于 基于特征的技术(如ORB-SLAM2)[2])对相机姿势的准确初始猜测。它们的定位结果与基于特征的方法相似,有时甚至更差。这表明当前基于对象的方法尚未充分利用有价值的对象信息来提高定位精度。如何进一步利用对象信息来改善视觉SLAM结果仍然具有挑战性。
在本文中,我们提出了一种名为 VOOM 的新颖的视觉对象里程计和建图框架,它同时应用 低级特征点和高级对象 到 里程计和映射的整个过程,如图1所示。
图 1:顶部: Groundtruth map.。中间:ORB SLAM2 with loop closure disabled。底部:VOOM。彩色椭球体表示 3D 对象,蓝色圆锥体表示摄像机姿势,绿线表示关键帧之间的可视性关系。ORB-SLAM2 生成的地图具有冗余的点云和模糊的边界,而我们的 VOOM 构建了更轻量级但语义增强的地图,从而实现更准确的相机姿态估计。
- 在里程计中,我们将 基于 Wasserstein 距离[14]的双二次曲线残差模型 与 基于归一化 Wasserstein 距离的对象数据关联方法 相结合,构建了精确的对象级地图。通过利用对象级信息,当前帧的关键点与先前的地图点更好地匹配,从而增强了帧的姿态估计。
- 在视觉对象映射方面,我们 基于关键帧和对象之间的观察关系,建立了一个基于对象的可视性图。更新与图中当前邻域对应的地图点,从而更新基于点的可视性图和局部地图。
- 通过 bundle adjustment,优化了局部关键帧的姿态和地图点的位置。
在实验中,我们已经证明,在大多数序列中,仅使用里程计和建图组件的所提出的 VOOM 甚至优于具有 loop closure 的 ORB-SLAM2。据我们所知,这是第一篇实现并证明使用双二次曲面和特征点的面向对象 SLAM 系统的论文,可以比最先进的基于特征的视觉 SLAM 系统实现更好的定位精度。
总而言之,我们的主要贡献有三点:
- 开发一种新颖的视觉对象里程计和映射框架,使用特征点和双二次曲线作为landmarks;
- 设计有效的对象优化算法、对象关联和基于对象的地图点关联,以构建具有分层landmarks的地图;
- 广泛的实验验证证明了所提出的方法与最先进的方法相比的优越性。
实践
测试环境: ubuntu 20.04
安装
1. Pangolin 0.6
参考: https://blog.csdn.net/weixin_43592742/article/details/134415646
2. Eigen3 3.3.7
https://gitlab.com/libeigen/eigen/-/tree/3.3.7?ref_type=tags
#安装
cd eigen-git-mirror
mkdir build
cd build
cmake ..
sudo make install
安装后,头文件安装在/usr/local/include/eigen3/
注意!!!
不要采用下面这个指令安装eigen3,
sudo apt-get install libeigen3-dev
如果采用这个指令安装,默认是安装到了/usr/include/eigen3,ORB-SLAM3检测不到,导致编译会报错。利用源码安装,安装好的路径是 /usr/local/include/eigen3/>
3. dlib
https://blog.csdn.net/weixin_64612422/article/details/133913442
git clone https://github.com/davisking/dlib.git
cd dlib
mkdir buid
cd build
cmake .. -DDLIB_USE_CUDA=0 -DUSE_AVX_INSTRUCTIONS=1
cmake --build .
cd ..
sudo python3 setup.py install
最后检验 dlib 是否成功安装 pip list
查看是否有dlib即可
dlib 19.24.99
4. 安装 Protocol Buffers
https://www.cnblogs.com/odesey/p/17619240.html
5. 编译
git clone https://github.com/yutongwangBIT/VOOM.git VOOM
cd VOOM/
sh build.sh
错误1: opencv 版本问题
我安装的 opencv 是 4.9, 因此需要修改 cmake 文件:
find_package(OpenCV REQUIRED)
if(NOT OpenCV_FOUND)
message(FATAL_ERROR "OpenCV > 2.4.3 not found.")
else()
if(NOT "${OpenCV_VERSION_MAJOR}" STREQUAL "4")
message(WARNING "OpenCV 4 is required for dnn module. Object detector will not be available.")
else()
message("OpenCV 4 found. Make sure OpenCV is built with dnn module and CUDA.")
add_definitions(-DUSE_DNN)
endif()
endif()
#find_package(OpenCV 3.0 QUIET)
#if(NOT OpenCV_FOUND)
# find_package(OpenCV 2.4.3 QUIET)
# if(NOT OpenCV_FOUND)
# message(FATAL_ERROR "OpenCV > 2.4.3 not found.")
# endif()
#endif()
错误2:
# Dlib
find_package(dlib REQUIRED)
Could not find a package configuration file provided by "DLib" with any of
the following names:
DLibConfig.cmake
dlib-config.cmake
解决:
sudo make install
sudo ldconfig
错误:
VOOM/Examples/rgbd_tum_with_ellipse.cc:137:73: error: ‘CV_LOAD_IMAGE_UNCHANGED’ was not declared in this scope
137 | imD = cv::imread(path_to_images + '/' + vstrImageFilenamesD[ni],CV_LOAD_IMAGE_UNCHANGED);
imD = cv::imread(path_to_images + '/' + vstrImageFilenamesD[ni],CV_LOAD_IMAGE_UNCHANGED);
改为:
imD = cv::imread(path_to_images + '/' + vstrImageFilenamesD[ni],cv::IMREAD_UNCHANGED);
运行
cd bin/
./rgbd_tum_with_ellipse ../Vocabulary/ORBvoc.txt ../Cameras/TUM2.yaml PATH_TO_DATASET ../Data/fr2_desk/fr2_desk.txt ../Data/fr2_desk/detections_yolov8x_seg_tum_rgbd_fr2_desk_with_ellipse.json points fr2_desk
报错:
Failed to load image: PATH_TO_DATASET/rgb/1311868164.363181.png
X Error of failed request: GLXBadFBConfig
Major opcode of failed request: 152 (GLX)
Minor opcode of failed request: 21 (X_GLXGetFBConfigs)
Serial number of failed request: 41
Current serial number in output stream: 41
Segmentation fault (core dumped)
解决:
这是因为没有下载数据集:
链接:https://cvg.cit.tum.de/data/datasets/rgbd-dataset/download
https://cvg.cit.tum.de/rgbd/dataset/freiburg2/rgbd_dataset_freiburg2_desk.tgz
标签:OpenCV,对象,笔记,里程计,VOOM,SLAM,https From: https://www.cnblogs.com/odesey/p/18216179