slam算法matlab代码(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版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!