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

news2024/11/24 23:05:48

参考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投影到图像坐标系。判断两个投影点之间的距离值,如果超过一定阈值则认为是动态点,需要滤除。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【python】爬取知乎热榜Top50保存到Excel文件中【附源码】

欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 一、导入必要的模块: 这篇博客将介绍如何使用Python编写一个爬虫程序,从斗鱼直播网站上获取图片信息并保存到本地。我们将使用requests模块发送HTTP请求和接收响应,以及os模块处理文件…

MySQL 8.0 InnoDB Tablespaces之Temporary Tablespaces(临时表空间)

文章目录 MySQL 8.0 InnoDB Tablespaces之Temporary Tablespaces(临时表空间)会话临时表空间会话临时表空间的磁盘分配和回收会话临时表空间的创建创建临时表和查看临时表信息会话临时表空间相关的设置参数innodb_temp_tablespaces_dir 全局临时表空间查…

「MCU」SD NAND芯片之国产新选择优秀

文章目录 前言 传统SD卡和可贴片SD卡 传统SD卡 可贴片SD卡 实际使用 总结 前言 随着目前时代的快速发展,即使是使用MCU的项目上也经常有大数据存储的需求。可以看到经常有小伙伴这样提问: 大家好,请问有没有SD卡芯片,可以…

RT-Thread 线程管理

线程管理 在日常生活中,我们要完成一个大任务,一般会将它分解成多个简单、容易解决的小问题,小问题逐个被解决,大问题也就随之解决了。 在多线程操作系统中,也同样需要开发人员把一个复杂的应用分解成多个小的、可调…

C#上位机与三菱PLC的通信01--搭建仿真环境

1、三菱PLC介绍 三菱PLC是三菱电机生产的主力产品。 它采用一类可编程的存储器,用于其内部存储程序,执行逻辑运算、顺序控制、定时、计数与算术操作等面向用户的指令,并通过数字或模拟式输入/输出控制各种类型的机械或生产过程。三菱PLC在中国…

软件测试|深入理解Python的encode()和decode()方法

简介 在Python中,字符串是不可变的序列对象,它由Unicode字符组成。当我们需要在字符串和字节之间进行转换时,Python提供了两个非常重要的方法:encode()和decode()。这两个方法允许我们在Unicode字符和字节之间进行相互转换&#…

网络报文分析程序的设计与实现(2024)

1.题目描述 在上一题的基础上,参照教材中各层报文的头部结构,结合使用 wireshark 软件(下载地址 https://www.wireshark.org/download.html#releases)观察网络各层报文捕获,解析和分析的过程(如下 图所示&a…

计算机毕业设计——SpringBoot 个人博客管理系统(附源码)

1,绪论 1.1 背景调研 在互联网飞速发展的今天,互联网已经成为人们快速获取、发布和传递信息的重要渠道,它在人们政治、经济、生活等各个方面发挥着重要的作用。互联网上发布信息主要是通过网站来实现的,获取信息也是要在互联网中…

智能网联汽车安全相关标准汇总

目录 1.标准方向分析 2.智能驾驶域相关标准 3.智能座舱域相关标准 3.汽车通用规范 1.标准方向分析 当前汽车行业的内卷态势已经蔓延至项目立项,导致如今开发模式都尽可能地左移,例如瑞萨提出的虚拟ECU开发模式可以极大节省ECU的实车验证资源&#xf…

Open3D 基于统计滤波去除噪点(5)

Open3D 基于统计滤波去除噪点(5) 一、什么是统计滤波二、具体实现1.代码 一、什么是统计滤波 统计滤波是一种常用的点云滤波方法,用于去除噪声和异常点。在统计滤波中,通过计算每个点邻域内的统计特征(如平均值和标准…

院士专家齐聚 京彩未来联合重点研究院创建数字空间联合实验室

1月6日,京彩未来与北京大学数字中国研究院华南分院暨广东省数字广东研究院共同创建的“数字空间共同体联合室验室”正式挂牌运营。 著名经济学家管清友博士、北京大学数字中国研究院华南分院暨广东省数字广东研究院常务副院长李鹰教授,广东省数字广东研…

MFC Socket和合信CTMC M266ES 运动控制型PLC通信进行数据交换

前言 1、前两篇文章通过对Snap7和S7-1200/S7-1500PLC的通信进行了详细的介绍。Snap7的优点开源性强、使用方便易于上手,跨平台和可移植性性强。但是Snap7也有个缺点就是只能访问PLC的DB、MB、I、Q区进行数据读写,不能对V区进行读写,有人说可以读写V区&am…

Spring AOP(详解)

目录 1.AOP概述 2.AOP相关术语 3.Spring AOP的原理机制 3.1JDK动态代理 3.2 CGLIB动态代理 3.3简单代码展示 3.3.1JDK动态代理 3.3.2CGLIB动态代理 4.Spring的AOP配置 4.1pom.xml 4.2增强方法 4.3切点 4.4切面 5.基于注解的AOP配置 5.1.创建工程 5.2.增强 5.3AOP…

抖去推账号矩阵+无人直播+文案引流系统开发搭建--开源

核心技术 1. AI自动直播: 智能系统通过丰富可定制的文案库, 拥有有料有趣的灵魂。不仅能自动语音讲解内容,还可以在直播中和用户灵活互动。直播中可将团购商品同话术自动上下架。 2. AI剪辑 可一键智能批量成片,也可跟着模板剪…

苹果IOS如何支持微信小程序分享

各位同学们好!我是咕噜铁蛋!,我们经常需要与读者分享有关移动应用的使用方法和技巧。微信小程序是一种便捷的应用形式,可以在微信内部直接使用,而无需下载和安装。本文铁蛋讲详细介绍iOS苹果支持微信小程序类型分享的使…

简单几步,实现餐厅扫码点餐

越来越多的人选择外出就餐,而餐厅的点餐方式也随着科技的发展而不断进步。其中,扫码点餐是最为常见的一种方式,它不仅方便快捷,还能节省人力成本。本文将介绍一种简单易行的餐厅扫码点餐解决方案。 打开乔拓云平台,登录…

【React】02-如何理解React通过对DOM的模拟,最大限度地减少与DOM的交互

如何理解React通过对DOM的模拟,最大限度地减少与DOM的交互 背景分析关于虚拟DOM 背景 在学习React的过程中,发现很多文档上关于React的高效都有这么一句话的描述——React通过对DOM的模拟,最大限度地减少与DOM的交互,对于我这种前…

Spark---RDD算子(单值类型转换算子)

文章目录 1.RDD算子介绍2.转换算子2.1 Value类型2.1.1 map2.1.2 mapPartitions2.1.3 mapPartitionsWithIndex2.1.4 flatMap2.1.5 glom2.1.6 groupBy2.1.7 filter2.1.8 sample2.1.9 distinct2.1.10 coalesce2.1.11 repartition2.1.12 sortBy 1.RDD算子介绍 RDD算子是用于对RDD进…

Redis(三)持久化

文章目录 RDB(Redis Database)自动触发保存频率修改dump文件保存路径修改文件保存名称dump恢复 手动触发save![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a56fdff44aee4efa96c2ce3615b69dc1.png)bgsave 优劣优点缺点 检查修复dump文件会触…

算法基础之耍杂技的牛

耍杂技的牛 核心思想&#xff1a; 贪心 推公式&#xff1a; 将 i 和 i1 个奶牛交换位置 比较交换位置后的危险系数最大值若Wi Si > Wi1 Si1 则交换前大 交换后更优 需要交换因此 按照WS从小到大排序 就是最优解 再计算危险系数 #include<iostream>#include<…