动态SLAM 开源方案汇总及介绍(一)

参考https://zhuanlan.zhihu.com/p/673614739及https://zhuanlan.zhihu.com/p/673615788

具体来说,当SLAM系统在前一帧的动态物体上提取了特征点时,如果将这个特征点投影到当前帧,由于目标已经移动,这个点找到的匹配点必然是错误的,由此解算出的位姿必然也存在较大的误差。尤其是动态物体占据画面的比例很大时,SLAM系统极容易崩溃。

一、基于目标检测/语义分割的动态SLAM

这一部分也是目前动态SLAM的主流方案,基本套路就是在ORB-SLAM2/3或者VINS的基础上加入YOLO。首先SLAM该怎么提特征点还怎么提,然后对于候选框内的特征点直接丢弃,这样位姿解算所使用的特征点也就没有了动态物体的影响。优点是效果还不错,尤其经过TensorRT加速的YOLO可以达到实时,对GPU显存的要求也没那么高。缺点是一方面在YOLO出现漏检时不稳定,另一方面只能识别预先定义好的物体类别,而且也没办法识别不在预定义类别范围内但真的在运动的物体,比如人手上拿着的书、正在搬运的椅子等等。

首先最经典的肯定是DS-SLAM和DynaSLAM了,这两篇文章也都来源于2018 IROS,虽然时间比较早,但是思想具有很高的借鉴意义。

1.1 DS-SLAM:(IROS 2018, 清华大学)

论文链接:https://arxiv.org/abs/1809.08379

代码链接:https://github.com/ivipsourceco

DS-SLAM是基于ORB-SLAM2开发的,有5个并行运行的独立线程:跟踪、语义分割、局部建图、回环检测和稠密语义八叉树地图。针对动态目标(主要是人),首先使用SegNet进行语义分割,然后进行运动一致性检查,剔除动态区域上的特征点。为啥要进行运动一致性检查呢?就是为了检测上面提到的"人手上拿着的书、正在搬运的椅子"这类无法提前定义的物体。

在DS-SLAM中,运动一致性检查的具体流程是:

  • 1、计算光流金字塔,获得当前帧中的匹配对;
  • 2、校验匹配关系,如果匹配对靠近边缘或其像素值与以它为中心的邻域的3x3区域内的像素值差别太大,就认为不合法,丢弃;
  • 3、使用RANSAC寻找内点,并利用这些内点求解基础矩阵;
  • 4、利用基础矩阵计算当前帧中极线方程;
  • 5、计算匹配点到极线的距离,如果超过阈值则认为是外点(运动点)。

 缺点就是太慢了,总单帧耗时达到了59.4ms。

 

1.2 DynaSLAM:(IROS 2018)

论文链接:https://arxiv.org/abs/1806.05620

代码链接:https://github.com/BertaBescos/DynaSLAM

DynaSLAM的主要思想和DS-SLAM很像。具体的流程是:

  • 1、使用Mask R-CNN和几何方法(将深度或者角度差距较大的数据关联点当做动态点)分别检测可能运动和正在运动的物体;
  • 2、只使用静态区域和非动态物体掩膜边缘的ORB特征点进行相机位姿估计;
  • 3、使用历史观测数据做背景修复。

DynaSLAM中几何一致性验证的具体流程是:

  • 1、选取5个与当前关键帧CF重合度最高的KF;
  • 2、计算每个KeyPoint从KF到CF的投影,得到投影后的坐标和投影深度;
  • 3、计算两个坐标之间的视差角,如果大于30°就滤除,计算两个深度之间的差值,如果超过一定阈值就滤除。

效果还不错,但是缺点也是耗时太大了。 

 

1.3 Detect-SLAM(2018 IEEE WCACV, 北京大学)

论文链接:Detect-SLAM: Making Object Detection and SLAM Mutually Beneficial

代码链接:https://github.com/liadbiz/detect-slam

主要思想:
目标检测的网络并不能实时运行,所以只在关键帧中进行目标检测,然后通过特征点的传播将其结果传播到普通帧中

  • 1.只在关键帧中用SSD网络进行目标检测(得到的是矩形区域及其置信度),图割法剔除背景,得到更加精细的动态区域;
  • 2.在普通帧中,利用feature matching + matching point expansion两种机制,对每个特征点动态概率传播,至此得到每个特征点的动态概率;
  • 3.object map帮助提取候选区域。 

 

1.4 RDS-SLAM: (2021,Access)

论文链接:https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9318990

代码链接:https://github.com/yubaoliu/RDS-SLAM

前面说到,语义分割的主要问题在于太过耗时。而RDS-SLAM的主要贡献就是在实时性上的提升。RDS-SLAM是在ORB-SLAM3的基础上,开辟了一个独立的语义线程。这样就可以不等待语义信息进入跟踪线程,将语义分割与跟踪分离。利用移动概率将语义信息从语义线程传递到跟踪线程。利用移动概率来检测和去除跟踪中的异常值。

那么具体来说,为啥开辟一个新的语义线程就可以提高实时性呢?作者定义了语义延时来说明该部分如何保证语义分割的实时性。首先按照时间顺序分割每一帧(假设语义分割一次耗时10次采样时间,每隔两帧取一个关键帧),同时连续分割两帧。注意,作者使用了双向模型(bi-directional model),关键帧的分割不是按顺序进行的,而是分割队列的前面和后面。这里还有一个问题,就是为什么还要对前面的关键帧做分割呢?这是因为如果前几帧没有语义信息,由于跟踪线程很快,可能已经因为动态物体累计了很大的误差。因此,需要使用语义信息来把漂移拉回来。

对于速度的提升也很明显,可以在2080Ti上达到实时。

 

1.5 Dynamic-SLAM  (2019  Robotics and Autonomous Systems)

在动态环境中工作时,由于动态对象的干扰,传统的SLAM框架的性能很差。 通过在对象检测中利用深度学习的优势,提出了一种语义动态的动态地图定位和映射框架Dynamic-SLAM,以解决动态环境中的SLAM问题。

本文的主要三大贡献:

  • 1.针对SLAM系统提出了一种基于相邻帧速度不变性的丢失检测补偿算法,提高SSD的recall rate,为后续模块提供了良好的依据。
  • 2.提出了一种选择跟踪算法,以一种简单有效的方式消除动态对象,提高了系统的鲁棒性和准确性。
  • 3.构建了基于特征的可视化动态SLAM系统。 构建了基于SSD的目标检测模块线程,并将其检测结果作为先验知识提升SLAM性能。

 

1.6 DynaVINS  (2022 IEEE Robotics and Automation Letters

论文链接:https://arxiv.org/abs/2208.11500

代码链接:https://github.com/url-kaist/dynavins

前面的方案都是基于ORB-SLAM开发的,我们再来看几个基于VINS的。DynaVINS是2022 RAL的文章,主要贡献在于解决了临时静态对象引起的假阳性回环问题。

DynaVINS的输入为单目/双目图像和IMU,并进行特征跟踪和IMU预积分。一方面,DynaVINS设计了一个鲁棒BA来从动态对象中丢弃跟踪的特征,保留静态特征。之后使用被追踪特征的数量对关键帧进行分组,并且聚类在当前关键帧组中检测到的回环假设。最后在选择性优化中使用或拒绝具有权重的每个假设,最终获得面向动态和暂时静态对象鲁棒的轨迹。

1.7 Dynamic-VINS: (2022 ​​​​​​​ IEEE Robotics and Automation Letters)

论文链接:https://arxiv.org/abs/2304.10987

代码链接:https://github.com/HITSZ-NRSL/Dynamic-VINS

哈工大深圳的最新工作,发表在2022 RAL上。Dynamic-VINS的输入是RGBD图像和IMU,性能和YOLO-DynaSLAM类似,但是对计算资源要求更低。Dynamic-VINS结合目标检测和深度信息进行动态特征识别,达到了与语义分割相当的性能,并且将IMU应用于运动预测,进行特征跟踪和运动一致性检查。

Dynamic-VINS使用YOLOv3进行运动物体检测,然后使用深度阈值和IMU进行运动一致性检查。注意这里深度阈值的作用与普通的运动一致性检查不太一样,主要是考虑到动态对象的bounding box内还包含很多静态背景点,如果直接滤除则有点浪费,因此希望将这部分静态背景点保留。具体流程是:

  • 1、对于每个动态对象的bounding box,根据四个角点计算物体深度平均值;
  • 2、提取特征点深度值;
  • 3、比较特征点深度值与物体深度平均值,如果较小则滤除,较大则保留。

IMU运动一致性检查的方法也很直接,就是将当前帧的特征点投影到IMU坐标系,再投影到世界坐标系,再根据之前关键帧的IMU投影到图像坐标系。判断两个投影点之间的距离值,如果超过一定阈值则认为是动态点,需要滤除。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/304619.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java开发工具】windows和mac多版本JDK 安装指南:让你在开发中轻松应对不同版本需求

解决思路 通过动态修改JDK环境变量中的JAVA_HOME 将值改成相应的JDK安装目录,来达到在同一电脑中安装不同版本jdk的效果。 windows系统 安装的jdk目录 右键→属性→高级系统设置→高级→环境变量→系统变量。 新建4个系统变 量变量值,变量名分别为&#xff1a…

kubectlkubeletrancherhelmkubeadm这几个命令行工具是什么关系?

背景 在最近学习k8s的过程中,发现kubectl&kubelet&rancher&helm&kubeadm这几个命令怎么在交错使用,他们究竟是什么关系?他们分别应该在什么情况下使用呢?这里我进行了简单的总结,做个区分。 各工具说…

typora好看的颜色主题包

typora好看的颜色主题包 一、base.user.css二、orangeheart.css三、插入文件 一、base.user.css h1, h2, h3, h4, strong {font-weight: 600; }#write {counter-reset: h2; }h1 {counter-reset: h2; }h2 {counter-reset: h3; }h3 {counter-reset: h4; }h4 {counter-reset: h5; …

UE5 C++(十三)— 创建Character,添加增强输入

文章目录 创建Character第三人称模板添加增强输入引用在脚本中实现移动、旋转 创建Character第三人称模板 创建MyCharacter C类 添加增强输入引用 在DEMO.Build.cs 脚本中添加增强输入模块 有个容易出错的点,这里的设置一定要正确 然后添加引用到C头文件中 …

Lin总线基础:为什么Master节点需要外接上拉电阻

Lin(Local Interconnect Network)总线开发的小伙伴是否有过这样的疑问:为什么主节点(Master)的设计中,需要增加一个1KΩ的上拉电阻呢?如下所示: 提示:本文基于NXP TJA102…

字节8年经验之谈!一文从0到1带你入门接口测试【建议收藏】

扫盲内容: 1.为什么要做接口测试? 2.怎样做接口测试? 3.接口测测试点是什么? 4.接口测试都要掌握哪些知识? 5.其他相关知识? 一.为什么要做接口测试? ①.越底层发现bug,它的修复…

简单易懂的PyTorch激活函数大全详解

目录 torch.nn子模块Non-linear Activations nn.ELU 主要特点与注意事项 使用方法与技巧 示例代码 图示 nn.Hardshrink Hardshrink函数定义 参数 形状 示例代码 图示 nn.Hardsigmoid Hardsigmoid函数定义 参数 形状 示例代码 图示 nn.Hardtanh HardTanh函数…

Master01节点免密钥登录其他节点

1、执行命令 ssh-keygen -t rsa,一直敲回车 2、for i in k8s-master01 k8s-node01 k8s-node02;do ssh-copy-id -i .ssh/id_rsa.pub $i;done 输入yes和对应节点密码

【算法Hot100系列】最长有效括号

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

快手在线查权重源码,附带查询接口

源码介绍 新增了用户访问 IP 和时间的统计功能。要使用此功能,只需将“bygoukai.sql”数据库导入源码中,然后修改“config.php”文件中的数据库用户名、密码和数据库名即可。如果需要修改水印,可以在第40行进行更改。要修改查询限制&#xf…

eclipse正则表达式替换 Find/Replace

Find/Replace 对话框中使用正则表达式 CTRLF 打开 Find/Replace 对话框勾选 Regular expressions ​ 匹配注释 下图中的Find:/.*/ ​ 匹配换行符 换行符:\R 下图中的Find表达式:\R.*Excel.* ​ 新增空行 /** 替换为 \R\t/** ​ 选…

nuxt 不解析HTML结构bug

记录一个本人Vue3迁移Nuxt3的报错 报错信息 [Vue warn]: Failed to resolve directive: top [nitro] [unhandledRejection] TypeError: Cannot read properties of undefined (reading ‘getSSRProps’) 原因是Vue3在迁移到nuxt3的时候有一个自定义指令没有搬过来&#xff0…

色标在matplotlib和plottable中

是这样的,我有一个数组[-4.4, -2.8, -2.6, -2.2, -1.1, 1.1, 1.2, 1.3, 3.6, 6.0, 6.4, 12.3],它需要绘制散点图,点的颜色来代表数值大小;同时,也需要在plottable上作为一列显示,同样用颜色来代表数值的大小…

最新GPT4、AI绘画、DALL-E3文生图模型教程,GPT语音对话使用,ChatFile文档对话总结

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画,文档对话总结DALL-E3文生图,相信对大家应该不感到陌生吧?简单来说,GPT-4技术比之前的GPT-3.5相对来说更加智能,会根据用户的要求生成多种内容甚至也可以和…

自然语言处理-情感分析及数据集

情感分析及数据集 随着在线社交媒体和评论平台的快速发展,大量评论的数据被记录下来。这些数据具有支持决策过程的巨大潜力。 情感分析(sentiment analysis)研究人们在文本中 (如产品评论、博客评论和论坛讨论等)“隐…

conda操作使用教程

一 conda介绍 Conda 是一个开源的包管理系统和环境管理系统,用于在 Linux、Windows 和 macOS 上管理 Python 包和依赖项,java有maven, python有conda,它是python开发者的最爱。 Conda 的核心功能: 包管理:安装、更新、删除 Pytho…

自承载 Self-Host ASP.NET Web API 1 (C#)

本教程介绍如何在控制台应用程序中托管 Web API。 ASP.NET Web API不需要 IIS。 可以在自己的主机进程中自托管 Web API。 创建控制台应用程序项目 启动 Visual Studio,然后从“开始”页中选择“新建项目”。 或者,从“ 文件 ”菜单中选择“ 新建 ”&a…

如何在 Photoshop 中扩展背景

展示一些在 Photoshop 中扩展背景的简单有效的方法 1. 如何在 Photoshop 中扩展具有纯色背景的图像 步骤 1 让我们从打开第一张图片开始。点击 Control-O 并选择图片。 步骤 2 要在 Photoshop 中扩展具有纯色背景的图像的背景,您需要做的就是按 Alt-Control-C 并…

ubuntu安装到vmware

文章目录 最新ubuntu下载地址安装流程之创建虚拟机显示界面成功创建虚拟机安装流程之虚拟机中安装ubuntu 最新ubuntu下载地址 点击此处下载ubuntu 安装流程之创建虚拟机 显示界面成功创建虚拟机 安装流程之虚拟机中安装ubuntu 安装说明:采用ubuntu server版安装,版本号为ubu…

Spark与HBase的集成与数据访问

Apache Spark和Apache HBase分别是大数据处理和分布式NoSQL数据库领域的两个重要工具。在本文中,将深入探讨如何在Spark中集成HBase,并演示如何通过Spark访问和操作HBase中的数据。将提供丰富的示例代码,以便更好地理解这一集成过程。 Spark…