首页IT科技slam算法matlab代码(slam原理介绍和经典算法)

slam算法matlab代码(slam原理介绍和经典算法)

时间2025-08-01 07:17:19分类IT科技浏览4473
导读:1.传统slam局限性 slam算法假设的环境中的物体都是处于静态或者低运动状态的,然而,现实世界是复杂多变的,因此这种假设对于应用 环境有着严格的限制,同时影响视觉slam系统在实际场景中的应用性。当环境中存在动态物体时,会给系统带来错误的观测数据,同时降低...

1.传统slam局限性

        slam算法假设的环境中的物体都是处于静态或者低运动状态的              ,然而                     ,现实世界是复杂多变的        ,因此这种假设对于应用 环境有着严格的限制       ,同时影响视觉slam系统在实际场景中的应用性              。当环境中存在动态物体时                     ,会给系统带来错误的观测数据               ,同时降低系统的精度和鲁棒性                      。通过RANSAC算法(随机采样一致性)的外点处理机制能够解决部分异常点对于算法的影响       。但是当动态物体占据空间的大部分时       ,依然会影响位姿跟踪                     ,所以需要检测运动的物体              、剔除动态区域的特征点               ,亦或者是降低在优化位姿的权重,减少对视觉定位的影响              。

 人身上为动态特征点                     ,要尽可能的去除                      。

2.常用算法:

开源的系统(DS-SLAM                      、Dyna-SLAM       、Co-Fusion)目前大部分的动态SLAM系统都是在ORB-SLAM2或者KinectFusion基础上改进得到的                      ,很少部分会涉及到边缘SLAM的方法       。

用于检测动态区域或者特征点的常用方法有以下几种:

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

利用深度学习技术能够很好地识别图像中特定的物体,结合运动物体的先验知识(汽车              、行人                      、动物)              ,能够很好的去除潜在的动态区域       。 需要注意的是                      ,对于移动的椅子       、停在路边的汽车        ,该方法往往会做出错误的判断                      。

深度学习在动态SLAM中的应用有两种形式:目标检测与实例分割(语义分割)              。

2.1.1目标检测(Object Detection)

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

2.1.2语义分割(INstance Segmentation)

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

2.2基于多视图几何的方法

检测动态特征点的原理是用多帧图像的位姿约束,剔除误差较大的特征点                      。

极线约束:需要注意的是                      ,当物体沿着极线的方向运动时        ,该方法会失效                      。

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

2.3.1光流方法

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

1.通过特征匹配计算二者之间的仿射变换       ,对第一张图像进行校正                     ,用校正后的图像与第二张图像计算稠密光流              。

2.结合语义信息得到初始静态背景的区域;计算两张图像之间的光流场;计算初始背景区域光流场的平均运动方向光流场减去背景光流场得到最后的光流结果                      。

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

2.3.2场景流方法

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

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

OpticalFlow=SceneFlow+EgoFlow

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

1.计算两帧图像的初始位置                     ,并进一步计算Ego Flow(相机)

2.计算两帧图像的光流场

3.二者相减得到3D场景流               ,投影至2D图像平面即得到了运动区域

2.4基于残差的方法

        最朴素的想法是计算每个点的误差大小(光度                      、重投影误差等)              。可以应用在特征点上也可以应用在整个图像上,因为要计算误差                     ,所以需要计算一个初始的位姿                      ,计算位姿时一般会将当前图像与所维护的静态地图进行比较,因为每一帧图像都会对静态地图进行更新和维护              ,所以位姿计算也是比较准确地       。

首先计算整张图像的残差                      ,然后通过自适应阈值分割即可得到大致的动态区域        ,最后经过形态学处理去除噪声影响即可                      。

 3.性能比较

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

作者:Mr Qin。如若转载              ,请注明出处:古月居 https://www.guyuehome.com/34296

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
网站排名优化的方法(提升你的网站排名:SEO排名优化教学) 电脑机箱要怎么选(电脑机箱怎么选?电脑机箱选购技巧之机箱机构)