首页 > 其他分享 >VOOM 笔记

VOOM 笔记

时间:2024-05-27 19:55:21浏览次数:22  
标签:OpenCV 对象 笔记 里程计 VOOM SLAM https

原始题目 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所示。

image

图 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

相关文章

  • JAVA课堂笔记15(面向对象的三大特性)
    第八章:面向对象的三大特性[封装、继承、多态]三.多态:1.理解:(1)父类型的引用存储不同子类型的对象  父类类名引用名=new子类类名();    引用    对象    父类型   子类型(2)以父类型的引用调用......
  • Bullet 学习笔记之 BugList 生产日记
    每天不是在改bug,就是在生产bug...在做Bullet开发的时候,总会“不由自主地”生产出各种奇奇怪怪的bug,虽然极大地丰富了工作量,但这些bug实在让人头大。记录一下。btMax()/btMin()误用:btMax(btScalara,btScalarb)可以计算得到a和b中的较大值;但btMax(btVector3......
  • VUE学习笔记(四)
    通过子组件实例实现对话框的打开AddCategory.vue页面里调整dialogvue里按钮事件<divclass="dialog-footer"><el-button@click="state.dialogVisible=false">Cancel</el-button><el-buttontype="primary"......
  • 抽象代数学习笔记(环论、域论)
    RingTheory4.8Definition:Aring\(R\)isasettogetherwithtwobinaryoperationtogetherwith"\(+\)"and"\(\times\)",obeying:\((R,+)\)isanAbeliangroup.\(\times\)isassociative:\((a\timesb)\timesc=a\ti......
  • mit6.828笔记 - lab5(上)- Spawn and Shell
    SpawningProcess有了文件系统了,我们终于可以方便地读取磁盘中的文件了。到目前为止,我们创建进程的方法一直都是在编译内核的时候将程序链接到数据段,在i386_init通过ENV_CREATE宏创建。现在我们应该考虑通过文件系统直接将用户程序从硬盘中读取出来,spawn就是这样的东西。s......
  • 3D Gaussian SLAM学习笔记一.Gaussian-SLAM配置运行
    ​研一小白,最近在做SLAM的科研工作,在一定的调研后,发现3DGaussianSplatting这个方向不错,于是跑一下这方面的代码。论文链接:https://arxiv.org/pdf/2312.10070.pdf代码链接:https://github.com/VladimirYugay/Gaussian-SLAM项目测试首先克隆代码,不过我觉得直接下载zip包......
  • day10今日笔记
    今日笔记grepgrep是对数据进行过滤查找关键字源数据可以是文件内容grephello/opt/hello.txt,找出存在hello的那一行命令的执行结果,这个需要结合管道符使用,cat/etc/passwd|grep'root'测试数据Iteachlinux.Ilikepython.Myqqis877348180.Mynameis......
  • 梦断代码阅读笔记06
    梦断代码阅读笔记06阅读总结在阅读《梦断代码》这本书后,我深刻感受到编程不仅是一种技能,更是一种思维方式,它对日常生活中的问题解决和思考方式有着深远的影响。通过这本书,我学到了编程思维的重要性。书中强调了逻辑思维、创造性、自动化、数据分析和解决复杂问题的能力,这些都是......
  • VUE学习笔记(三)
    本小节为设置跨域和axios请求和获取数据设置跨域,在vue.config.js添加devServer配置const{defineConfig}=require("@vue/cli-service");module.exports=defineConfig({transpileDependencies:true,devServer:{proxy:{"/api":{target:&q......
  • VUE学习笔记(二)
    本小节为搭建布局页和分类页面需要使用到element-plus,添加指令npminstallelement-plus--save布局页从elementplus官网找到布局,粘贴过来<template><el-containerclass="layout-container-demo"><el-asidewidth="200px"><el-scrollbar><divclass=&qu......