【动态SLAM】快速入门(原理介绍及经典算法)

article/2025/8/28 4:50:37

【动态SLAM】快速入门(原理介绍及经典算法)

  • 0 简介
  • 1. 传统视觉SLAM技术的局限
  • 2. 常用算法:
    • 2.1 基于深度学习的分割方法
      • 2.1.1 目标检测(Object Detection)
      • 2.1.2 语义分割(INstance Segmentation)
    • 2.2 基于多视图几何的方法
    • 2.3 基于光流/场景流的方法
      • 2.3.1 光流方法
      • 2.3.2 场景流方法
    • 2.4 基于残差的方法
  • 3. 性能比较

0 简介

  博文首发自我的古月居社区博客:https://www.guyuehome.com/34296,定期“动态环境下SLAM问题”的相关内容。

1. 传统视觉SLAM技术的局限

  大部分视觉定位与建图(SLAM)算法假设环境中的物体是静态或者低运动的,对应用环境有严格的限制,这种假设影响了视觉SLAM 系统在实际场景中的适用性,当环境中存在动态物体时,例如走动的人,反复开关的门窗等,都会给系统带来错误的观测数据,降低系统的精度和鲁棒性。通过RANSAC算法(随机采样一致性)的外点处理机制能够解决部分异常点对算法的影响,但是如果动态对象占据大部分图像区域时,依然会影响位姿跟踪。所以需要检测运动的物体、剔除动态区域的特征点(或者降低其在优化位姿时的权重),以减少物体运动对视觉定位的影响。

图1 去除动态的特征点

2. 常用算法:

  随着深度学习的发展,动态场景下SLAM问题受到了广泛的关注,并涌现除了很多优秀的方法,尤其在17年之后陆续发布了很多开源的系统(DS-SLAM、Dyna-SLAM、Co-Fusion)。目前大部分的动态SLAM系统都是在ORB-SLAM2或者KinectFusion基础上改进得到的,很少部分会涉及到边缘SLAM的方法。
  用于检测动态区域或者特征点的常用方法有以下几种:

2.1 基于深度学习的分割方法

  利用深度学习技术能够很好地识别图像中特定的物体,结合运动物体的先验知识(汽车、行人、动物),能够很好的去除潜在的动态区域,实验结果证明该方法是最为简单高效的方案,也是目前主流的技术方案。需要注意的是,对于移动的椅子、停在路边的汽车,该方法往往会做出错误的判断。
  深度学习在动态SLAM中的应用有两种形式:目标检测与实例分割(语义分割)。

图2 目标检测与实例分割

2.1.1 目标检测(Object Detection)

  目标检测的目标是找到图像中所有的待检测物体,并用边界框标出该物体的位置,如左图所示。该方法的优点是检测速度快,但是缺点也很明显,其只能用方框标出物体大概位置,不能实现精确分割,如果直接将方框内的特征点去掉,会因特征点过少而影响定位精度。为了克服此问题,会通过图割法对方框中的图像进行进一步修剪,以得到更加准确的物体区域。

  常用的用于目标检测的网络包括Yolo系列、SSD等。

2.1.2 语义分割(INstance Segmentation)

  语义分割的目标是对物体进行像素级别的分割,如右图所示。该方法的优点在于精度较高,但是分割速度并不高,一般来说达不到实时的要求。为了解决效率问题,一些论文提到只在关键帧中进行实例分割,然后通过传播模型得到普通帧的结果。

  常用的用于语义分割的网络包括SegNet、Mask-RCNN等。

2.2 基于多视图几何的方法

  多视图几何检测动态特征点的原理是用多帧图像的位姿约束,剔除误差较大的特征点。常用的方法为极线约束

图3 对极几何

  假设相机从不同的角度观测到同一个空间点 P。根据针孔相机模型,它在两个图像上的像素坐标 x = [ u , v , 1 ] T x=[u, v, 1]^T x=[u,v,1]T,即 x 1 x_1 x1, x 2 x_2 x2满足:

s 1 x 1 = K p s_1x_1 = Kp s1x1=Kp

s 2 x 2 = K ( R p + t ) s_2x_2 = K(Rp+t) s2x2=K(Rp+t)

  其中 K K K为相机内参矩阵, R R R t t t表示两图像之间的平移旋转矩阵。在理想情况下,两张图片中匹配的点对的坐标符合约束:

x 2 T F x 1 = [ u 2 , v 2 , 1 ] F [ u 1 , v 1 , 1 ] T x_2^TFx_1=[u_2,v_2,1]F[u_1,v_1,1]^T x2TFx1=[u2,v2,1]F[u1,v1,1]T

  其中,F 为基础矩阵(Fundamental matrix)。而在真实 的场景下,由于相机采集的照片并非理想图片,存在一定程度的畸变和噪声,使得相邻帧间的点无法完美匹配上极线 l l l

l 1 = [ X , Y , Z ] T = F x 1 = F [ u 1 , v 1 , 1 ] T l_1=[X,Y,Z]^T=Fx_1=F[u1,v1,1]^T l1=[X,Y,Z]T=Fx1=F[u1,v1,1]T

  点 x 2 x_2 x2到极线 L 1 L_1 L1的距离D为:

D = ∣ x 2 T F x 1 ∣ ∥ X ∥ 2 + ∥ Y ∥ 2 D=\displaystyle\frac{|x_2^TFx_1|}{\sqrt{\Vert X \Vert^2 + \Vert Y \Vert^2 } } D=X2+Y2 x2TFx1

  若距离 D 大于阈值,则认为该点不符合极线约束,被认为是动态的点。
  需要注意的是,当物体沿着极线的方向运动时,该方法会失效。

2.3 基于光流/场景流的方法

2.3.1 光流方法

  对于两个张图像,稠密光流很好地描述了每个像素在二维平面中运动的情况,是检测运动区域很好的方法,一般来说运动物体的区域所产生的光流会远高于静态的背景区域。但是除了物体本身运动会产生光流,相机的运动也会产生光流,为了消除相机运动的影响,通常会采用以下两种方案:

  1. 通过特征匹配计算二者之间的仿射变换,然后对第一张图像进行校正,用校正后的图像与第二张图像计算稠密光流。
  2. 结合语义信息得到初始静态背景的区域;计算两张图像之间的光流场;计算初始背景区域光流场的平均运动方向;光流场减去背景光流场得到最后的光流结果。

  OpenCV有很多关于稠密光流的函数,如DeepFlow。

2.3.2 场景流方法

  所谓场景流(Scene Flow),就是光流(Optical Flow)的三维版本,表述了图像/点云中每个点在前后两帧的变化情况。光流由两帧图像即可得到,场景流则需要两帧双目图像或者RGBD图像来得到。目前对场景流的研究还局限在实验室阶段,由于缺乏实际数据(打标成本太高)以及客观的评价指标,离工程应用还有不小的距离。

图4 光流与场景流的关系

  正如论文FlowFusion中所介绍的,场景流反映了世界坐标系下物体点云的3D运动情况,也就是我们想要检测的东西;光流是二维图像中像素运动产生的,并不简单是场景流投影至二维平面的结果,其还受相机运动(Ego motion)的印象,也就是说,相机运动产生的Ego Flow和物体本身运动产生的Secne Flow叠加,并投影至相机图像平面上,便得到了我们观测的Optical Flow。

O p t i c a l F l o w = S c e n e F l o w + E g o F l o w Optical Flow = Scene Flow + Ego Flow OpticalFlow=SceneFlow+EgoFlow

  场景流Secne Flow反应了物体的真实运动情况,求得场景流便知道了运动的物体。具体方法为:

  1. 计算两帧图像的初始位置,并进一步计算Ego Flow
  2. 计算两帧图像的光流场
  3. 二者相减得到3D场景流,投影至2D图像平面即得到了运动区域

2.4 基于残差的方法

  该方法最朴素的想法是计算每个点的误差大小(光度、重投影误差等),根据误差的大小来判断是否属于动态物体,可以应用在特征点上也可以应用在整个图像上,需要注意的是,因为要计算误差,所以需要计算一个初始的位姿,计算位姿时一般会将当前图像与所维护的静态地图进行比较,因为每一帧图像都会对静态地图进行更新和维护,所以位姿计算也是比较准确地。
  如下图所示,首先计算整张图像的残差,然后通过自适应阈值分割即可得到大致的动态区域,最后经过形态学处理去除噪声影响即可。

图5 通过残差寻找动态区域

3. 性能比较

  TUM提供了相关数据集,用来验证算法的性能。受运动物体的影响,传统的SLAM系统比如ORB-SLAM2通常达不到很好地效果,如红色轨迹所示。而动态SLAM算法因为能够很大程度上消除动态物体的消极影响,在定位精度上可以得到很大提升。

图6 传统SLAM算法与动态SLAM算法的轨迹对比

http://chatgpt.dhexx.cn/article/dEE2bOGQ.shtml

相关文章

Visual SLAM算法笔记

MulinB按:最近在学习SLAM算法,这里作为阅读笔记记录和总结一下。这里关注的主要是基于视觉的Visual SLAM或Visual Odometry,也包括一部分图像和IMU融合的Visual-Inertial Odometry相关算法。 注:下文中部分链接指向Google Schola…

一起自学SLAM算法:8.2 Cartographer算法

连载文章,长期更新,欢迎关注: 写在前面 第1章-ROS入门必备知识 第2章-C编程范式 第3章-OpenCV图像处理 第4章-机器人传感器 第5章-机器人主机 第6章-机器人底盘 第7章-SLAM中的数学基础 第8章-激光SLAM系统 8.1 Gmapping算法 8.2 Cartographe…

开源3D激光(视觉)SLAM算法汇总(持续更新)

目录 一、Cartographer 二、hdl_graph_slam 三、LOAM 四、LeGO-LOAM 五、LIO-SAM 六、S-LOAM 七、M-LOAM 八、livox-loam 九、Livox-Mapping 十、LIO-Livox 十一、FAST-LIO2 十二、LVI-SAM 十三、FAST-Livo 十四、R3LIVE 十五、ImMesh 十六、Point-LIO 一、Car…

SLAM | 激光SLAM中开源算法对比

点击上方“AI算法修炼营”,选择加星标或“置顶” 标题以下,全是干货 前面的话 好久没有更新SLAM系列的文章了,前面我们讲到了激光SLAM技术。基于激光雷达的同时定位与地图构建技术(simultaneous localization and mapping&#xf…

激光SLAM算法学习(一)——激光SLAM简介

激光SLAM算法学习(一) 激光SLAM简介 1、SLAM是什么 SLAM是同步定位与地图构建(Simultaneous Localization And Mapping)的缩写,最早由Hugh Durrant-Whyte 和 John J.Leonard提出。SLAM主要用于解决移动机器人在未知环境中运行时定位导航与地…

SLAM算法

一、概述 Simultaneous Localization and Mapping (SLAM)原本是Robotics领域用来做机器人定位的,最早的SLAM算法其实是没有用视觉camera的(Robotics领域一般用Laser Range Finder来做SLAM)。本文主要关注基于camera图像做SLAM的算法&#xf…

SLAM算法(一)即同步定位与地图构建了解

文章目录 一、SLAM 简介二、SLAM 技术简介三、slam算法实现的几个要点有趣的事,Python永远不会缺席培训说明 一、SLAM 简介 SLAM(Simultaneous Localization and Mapping同步定位与地图构建) 是业界公认视觉领域空间定位技术的前沿方向,它主要的作用是让…

盘点机器人常用的几大主流SLAM算法

SLAM可以说是近几年最火的机器人技术之一,也是机器人领域的关键技术。不少同学表示,学了几年还在「爬坑」,甚至感觉「越学越难」。本文通过整理机器人领域常用的SLAM算法架构及特点,希望为大家的方向选择提供一些参考。 01 SLAM是…

一起自学SLAM算法:7.7 典型SLAM算法

连载文章,长期更新,欢迎关注: 写在前面 第1章-ROS入门必备知识 第2章-C编程范式 第3章-OpenCV图像处理 第4章-机器人传感器 第5章-机器人主机 第6章-机器人底盘 第7章-SLAM中的数学基础 7.1 SLAM发展简史 7.2 SLAM中的概率理论 7.3 估计理论 …

slam原理介绍和经典算法

1.传统slam局限性 slam算法假设的环境中的物体都是处于静态或者低运动状态的,然而,现实世界是复杂多变的,因此这种假设对于应用 环境有着严格的限制,同时影响视觉slam系统在实际场景中的应用性。当环境中存在动态物体时&#xff0…

【漫画】程序员系列苏大强版表情包

点击上方“ 程序IT圈 ”,选择“置顶公众号” 关键时刻,第一时间送达! 整理来源于菜鸟要飞 今天抽空给大家收集了一份苏大强版程序员系列表情包,分享给大家,希望你能够喜欢 。下面做个投票,看看你最喜欢哪个…

10 张令人泪牛满面的程序员趣图

(给程序员的那些事加星标,每天看趣图) 0、没事,我已经全部注释掉了 1、好好的现有库你不用,非得造轮子了! 2、HR 和程序员都是如何看简历的? 3、程序员的灾难曲线图 4、用钉钉子解释软件测试 5、…

[转] 程序员才懂的58张图片,哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈

来源:程序员最幽默(ID:humor1024)编译配字 01 Java VS C 02 功能先上了再说 03 高级开发人员作为一个团队进行编程 04 调试CSS 05 高级开发人员重构代码 06 能一个手指完成的绝不用两只手 07 看实习生编码的时候,我的表…

趣图:程序员某场景的样子--开心一笑

几组幽默的图片,真实的解释了程序员在一些特定场景时候的样子…… 往运行服务器上直接上传文件时程序员的样 当老板说项目如果能赶在最后期限前开发完成将会有一笔奖金时程序员的样子 当凌晨3点还在修改bug时程序员的样子 当发现没有按CTRL-S就关闭了文件时程序员的…

趣图:程序员的那些事(一)

关注很久了《程序员的那些事》公众号,发现特别有意思的就是 ‘趣图’ 了。 分享给大家,在烦躁的工作中 , 笑上一笑!! 0、趣图是出自美剧《黑客军团》 上图右边那位是主演拉米马雷克,他就是 2019 年奥斯卡影…

【转帖】程序员才懂的58张图片

程序员才懂的58张图片,哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 2019年02月02日 21:15:00 大数据v 阅读数:16226 https://blog.csdn.net/zw0Pi8G5C1x/article/details/86762134 导读:春节快到了!你的假期都安排上了吗?今天我们…

10 张有关程序员的趣图,图图戳心

0、没事,我已经全部注释掉了 1、好好的现有库你不用,非得造轮子了! 2、HR 和程序员都是如何看简历的? 3、程序员的灾难曲线图 4、用钉钉子解释软件测试 5、听说你是 CSS 高手 6、客户需求 vs 最终实现 7、程序员的 8 种层级 ↓↓↓…

关于做人处事最火的 6 张图片,改变无数程序员!

1、拥有源码资源的多少并不重要,如果你不懂得去哪抄和如何改,永远都是不够的。 2、修改bug时,多坚持一下,很可能只是差了那么一点点 3、当一名程序员,要懂得自得其乐! 4、锤炼自己学习新技术的能力&#xf…

趣图:用户眼中的程序员 VS 程序员眼中的用户

IT程序猿 微博网友评论: 黑猫喵喵喵喵喵:用户经常可逗了~ UC震惊组:用户经常干些傻事触各种发莫名其妙的Bug 内心毫无波澜的阿仁:哎...熊孩子用户,把程序员心爱键盘玩碎都不能满足其需求 Cui_l2&#xff1a…