VDO-SLAM

2024-01-10 03:18
文章标签 slam vdo

本文主要是介绍VDO-SLAM,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

VDO-SLAM( A Visual Dynamic Object-aware SLAM System )

install

ubuntu16,gcc >= 9.2.1, opencv>= 3.0,  eigen>= 3.1.0, g2o(in folder)

更新gcc

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install gcc-9 g++-9
sudo apt-get upgrade
sudo updatedb && sudo ldconfig
locate gcc | grep -E "/usr/bin/gcc-[0-9]" # 检查gcc现有版本
locate g++ | grep -E "/usr/bin/g\+\+-[0-9]" # 检查g++现有版本
cd /usr/bin
sudo rm gcc
sudo ln -s gcc-9 gcc
sudo rm g++
sudo ln -s g++-9 g++
git clone https://github.com/halajun/VDO_SLAM.git VDO-SLAM

修改CMakeLists.txt。将76行加上注释,将78行注释消除 

# for mac os (default)
#
<img src="https://www.zhihu.com/equation?tex={PROJECT_SOURCE_DIR}/dependencies/g2o/lib/libg2o.dylib
# for linux (ubuntu)" alt="{PROJECT_SOURCE_DIR}/dependencies/g2o/lib/libg2o.dylib
# for linux (ubuntu)" class="ee_img tr_noresize" eeimg="1">
{PROJECT_SOURCE_DIR}/dependencies/g2o/lib/libg2o.so

编译

cd VDO-SLAM
chmod +x build.sh
./build.sh

运行 

  1. Download the demo sequence: kitti_demo, and uncompress it.

  2. Execute the following command. 

./example/vdo_slam example/kitti-0000-0013.yaml PATH_TO_KITTI_SEQUENCE_DATA_FOLDER

VDO-SLAM代码阅读

该部分不是很好写笔记,也没看的太仔细,就简单聊聊吧

整个结构相对比较清晰。简单的聊下比较重要的几个函数:

  • GrabImageRGBD():入口函数
  • UpdateMask():这个是之前提到的第10点,即如果语义分割失败后如何回复掩码
  • Frame():里面特征提取完全仿照ORB-SLAM的思路,但是增加了光流特征。并且,对于存在语义掩码的物体每隔3点采集光流。
  • GetInitModelCam():采用恒速度模型(这里理解为变换矩阵与上一帧相同)和PNP求解两种方式计算变换矩阵,并采用内点较多的那一种模型
  • PoseOptimizationFlow2Cam():光流和位姿联合优化
  • DynObjTracking():主要解决动态物体选取、编码问题。其中sf_norm表示场景流的变化(虽然不知道为什么会表述成只计算x与z?),并根据值的大小为光流编订序号(????),最后,将前后帧的标签相互对应
  • RenewFrameInfo():更新信息,补充光流追踪特征点
  • GetStaticTrack()/GetDynamicTrackNew():获得追踪列表
  • PartialBatchOptimization()/FullBatchOptimization():局部、全局优化。说实话有些没有看懂。

 

简介

该系统可以在单目、双目、RGBD版本上应用。但是,由于系统需要视差图,因此单目版本还需要额外的视差估计模块。但是最佳使用的应该是基于基于双目的室外场景

  • VDO-SLAM具有以下贡献( 主要内容在第1和第3点 ):
  1. 设计了统一的估计框架,将机器人位姿、动态点和静态点、运动物体的位姿(object motions)联合起来计算与优化
  2. 对动态物体 SE(3) 位姿变化,以及提取场景中物体速度的方法 进行了精确的估计,并优于最先进的算法。
  3. 能够处理由于非直接遮挡导致的语义分割失败,使算法具有更大的鲁棒性。
  4. 一种在复杂和compelling的真实场景中的可演示系统
  • 预处理
  1. 实例级别的语义分割:采用mask r-cnn网络,由coco数据集训练,未经过微调。
  2. 稠密光流估计:采用PWC-Net网络,由FlyingChairs数据集训练,经过Sintel 和 KITTI 数据集微调。
  3. 立体匹配视差图:单目情况下,使用 MonoDepth2 (Godard et al. (2019)) 网络。数据集:Depth Eigen split


 

  • 稠密光流估计作用:第一为语义掩码提供采样点,保证有足够数量和鲁棒的点来传播,使得多物体追踪能够进行;第二,能够在语义分割失败后用于恢复语义掩码。之所以选择稠密光流而非稀疏光流,是因为稠密光流能够保证长期追踪的鲁棒性。
  • 特征检测与追踪:采用稀疏的改进型FAST角点检测( Rublee et al. (2011). ),并用光流法进行追踪。
  • 位姿变换:静态点采用3D-2D方法求解。初始化则计算两种模型:先前运动的传播模型、以及带有RANSAC方法的P3P模型,并计算内点数量,取内点数量多的为初始化标准。
  • 动态物体的判断:计算空间内某一点m在k、k-1帧时刻位置偏差,得到场景流(scene flow)如果该点的场景流变化大于预先设定的阈值(文中取0.12),则认定该点为动态点。在语义分割后的掩码范围内,计算每个物体场景流的动态点占比是否大于某一阈值(文中取30%),如果大于则判定该物体掩码对应的物体为动态物体。
  • 动态追踪:实例级别的语义分割仅仅能够提供单阶段(单张图片)的分割结果,但是没法实现追踪,因此需要引入稠密光流进行数据关联。使用光流为每个运动物体进行编号,对受到噪声,图像边界及遮蔽影响的运动物体,当其上一帧周边的点场景流运动标签为0时,重新对其编号。
  • 运动物体的位姿变换估计:直接法。为了提升速度,每三个点采集一次。
  • 速度估计:公式24第一行将 [公式] 拆解为 [公式] ,得到第二行。其中 [公式]
  • 局部地图及优化:固定尺寸的滑动窗口。在局部地图中仅仅优化静态点及相机位姿,因为优化动态结构并不能够带来精度上的收益。
  • 全局地图及优化:采用因子图方法优化,并且为了提高准确性和鲁棒性,当空间点在3帧内被观测到时才会将该点记录进入全局地图。因子图结如下。此时,静态特征与动态特征同时被纳入因子图中共同被优化。

实验过程及对比

  • 室内数据集:Oxford Multimotion Dataset。数据集的主要内容为几个悬挂在室内的摇摆方块以及玩具小车(在本次实验中没有涉及),不是很偏向于实际应用场景,但是在VDO-SLAM系统中可以用于测试方块的运动变换。实验对比的系统为MVO。两者同时去除了全局优化。结果显示,VDO-SLAM在绝大多数情况下优于MVO。但是在纯旋转方面表现可能较弱,这一问题主要由光流在纯旋转问题上表现不佳造成的。
  • 室外数据集:KITTI。主要对比了01-06、16、20几个序列。主要用于测试追踪效果。对比系统为CubeSLAM(单目)。效果大幅提升(因为增加了立体匹配的时差图)
  • 讨论:
  1. 加入光流进行联合优化:能够大幅提升鲁棒性(更多内点)和准确率(误差减少15%-20%)。实验见论文。
  2. 非直接遮挡追踪的鲁棒性探索:利用流程图-10中方法进行数据关联,能够大幅降低分割失败造成的影响。
  3. 全局联合动态特征点及物体进行优化:能够同时增加追踪精度和相机自身的定位精度。
  4. 计算消耗情况:取决于追踪数量多少,一般在5-8 fps左右。

 

这篇关于VDO-SLAM的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/589378

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

激光SLAM如何动态管理关键帧和地图

0. 简介 个人在想在长期执行的SLAM程序时,当场景发生替换时,激光SLAM如何有效的更新或者替换地图是非常关键的。在看了很多Life-Long的文章后,个人觉得可以按照以下思路去做。这里可以给大家分享一下 <br/> 1. 初始化保存关键帧 首先对应的应该是初始化设置,初始化设置当中会保存关键帧数据,这里的对应的关键帧点云数据会被存放在history_kf_lidar当中,这个数据是和

用python fastapi写一个http接口,使ros2机器人开始slam toolbox建图

如果你想使用Python的FastAPI框架编写一个HTTP接口,以便通过接口启动ROS 2机器人的SLAM Toolbox建图,可以按照以下方式进行: 首先,确保你已经安装了fastapi和uvicorn库。你可以使用以下命令进行安装: pip install fastapi uvicorn 接下来,创建一个Python文件(例如app.py),并将以下代码添加到文件中: import

GS-SLAM论文阅读笔记--GSFusion

介绍 GS-SLAM是最近比较新的方向,由于传统SLAM的研究变得很少,拥抱与新的技术结合的方法也许是个好主意。之前总结了大部分GS-SLAM的文章。但是这个方向在不断发展,而发展初期的很多论文值得参考。所以用博客记录一下比较新的论文阅读笔记。GSFusion 这篇文章是TUM发表的,TUM在SLAM领域是非常牛的,所以需要仔细阅读一下这篇文章,肯定会有所收获! 文章目录 介绍1.

SLAM相关数据集调研

SLAM相关数据集调研 主要分成4种:关于自动驾驶的数据集,包含Depth的SLAM及三维重建数据集,不含Depth的数据集,包含语义的数据集。 自动驾驶: KITTI数据集:http://www.cvlibs.net/datasets/kitti/index.php (RGB+Lidar+GPS+IMU) KITTI数据集由德国卡尔斯鲁厄理工学院和丰田美国技术研究院联合创办,是目前国际上最

SLAM ORB-SLAM2(29)PnP估计姿态

SLAM ORB-SLAM2(29)PnP估计姿态 1. PnP问题2. EPnP算法2.1. 计算4对控制点的世界坐标2.2. 计算齐次质心坐标2.3. 计算4对控制点的相机坐标2.3.1. 构造M矩阵2.3.2. 计算 M T M M^TM MTM的0特征值对应的特征向量2.3.3. 计算零空间的秩2.3.4. 计算线性组合的系数 2.4. 选择最小重投影误差 3. 标题

SLAM_极线搜索最佳匹配特征点_NCC

目录 1. 需求 2. 代码实现 思路 代码 极线搜索 NCC的实现 双线性插值 1. 需求 输入: 参考图像ref, 当前图像curr, 当前图像相对于参考图像的位姿T_C_R,  参考图像的深度图depth和深度方差图depth_cov, 输入参考图像ref上的一个像素点坐标pt_ref, 求解: 在当前图像上的最佳匹配点pt_curr 2. 代码实现 思路

视觉SLAM补充习题(来源于B站博主)

题目来源于up主全日制学生混的SLAM课程,代码链接如下: GitHub - cckaixin/Practical_Homework_for_slambook14: This repository is used to store SLAM 14 training exercises 如果打不开github请参考下面两篇博文,亲测有效!! 解决国内 github.com 打不开的最最最准确方

DSO slam ros 模式

dso 直接法纯视觉定位,作者采用读取包的方式,数据使用存在不方便. 源码:https://github.com/JakobEngel/dso.git ros需要链接库版:https://github.com/JakobEngel/dso_ros.git 直接运行版:GitHub - jankinbyy/dso_ros_run 在config下修改相机内参. 结果:地图点密度较高,尺度存

Gazebo Harmonic gz-harmonic 和 ROS2 Jazzy 思考题 建图和导航 SLAM Navigation

仿真 效果还挺好的。  SLAM建图 导航 …… 提示 这篇文档详细介绍了如何在ROS 2环境中使用SLAM(Simultaneous Localization and Mapping,即同时定位与地图构建)和Nav2(Navigation 2,ROS 2的导航框架)来让机器人一边构建环境地图一边进行导航。以下是对该文档的详细总结: 概述 文档主要面向ROS 2用户