此篇是东拼西凑来的一篇简介,课程实验所用,仅供自己学习,想认真了解的可以去高博的博客看看.
实验上跟着别人的步子实现了一个开源的的DSO(即Direct Sparse Odometry,采用直接法实现建图的程序),然后简单了解一下 SLAM 还有直接法和间接法的区别,看了下原理代码,好难啊囧

SLAM 技术随着最近几年机器人、VR、AR 的火爆而为人所知,在传感器、算法、软件、硬件等方向都有不同的进展。那么什么是 SLAM?
SLAM,全称叫做 Simultaneous Localization and Mapping,中文叫做同时定位与建图。希望机器人从未知环境的未知地点出发,在运动过程中通过重复观测到的地图特征(比如,墙角,柱子等)定位自身位置和姿态,再根据自身位置增量式的构建地图,从而达到同时定位和地图构建的目的。他解决了两个问题:
1. Where am I?
2. What can I do right here?
这是移动机器人的基础,因为只有知道当前环境及自身状态,机器人才可以进行下一步的任务计划,执行等操作。定位和建图两个问题相互依赖,准确的定位依赖于正确的地图,而构建正确的地图又需要准确的定位,这是一个迭代的过程。

在SLAM理论中,非常强调未知的环境,因此我们主要谈论如何用相机在位置的环境中解决定位和建图问题。

传感器

首先从传感器入手,视觉传感器主要分为三种:
1. 单目摄像头(Monocular Camera)
2. 双目摄像头(Binocular Camera)
3. 深度摄像头(RGB-D Camera)
深度摄像头可以直接获得图像及对应的深度信息,优点在于方便获得深度数据,缺点在于成本高,体积大,室外环境基本报废。
双目摄像头可以通过三角方法计算出深度信息,市面上有一些深度摄像头也是直接基于双摄像头来做的。然而双目摄像头在目标距离较远的时候会退化成单目。因此近年来大量的研究都是围绕单目进行的。
单目SLAM可以通过临近图像匹配计算出摄像头位姿的变换,在两个视角上进行三角测距又可以得出对应点的深度信息。通过这样迭代的过程可以实现定位及建图。

原理听起来很直观,然而现实环境中大量的测量噪声,计算误差造成了SLAM问题的无限复杂。于是解决不确定性问题(后端优化)成为SLAM的核心之一。

定位问题

利用合适的传感器得到每个点的位置之后,根据两帧图像间的差别计算摄像头的位移和相机相对姿态估计。经典的算法是 ICP(Iterative Closest Point,迭代最近点)。这个算法要求知道这两个图像间的一组匹配点,说的通俗点,就是前一帧图像哪些点和当前帧是一样的。这里涉及到两个知识点:
特征点的提取和匹配.
特征点的提取有许多方法,常见的有SIFT, SURF之类,还有效率好一点的FAST方法.FAST的原理非常简单, 具体就是查看点p周围的点的像素值与该点灰度的差别是否够大(灰度值大于某个阈值),如果个数足够大,则认为该候选点位一个特征点。

得到了一组匹配点后,我们就可以计算两个图像间的转换关系, 得到了一组匹配点后,我们就可以计算两个图像间的转换关系,也叫PnP问题。

R为相机的姿态,C为相机的标定矩阵。R是不断运动的,而C则是随着相机做死的。ICP的模型稍有不同,但原理上也是计算相机的姿态矩阵。原则上,只要有四组匹配点,就可以算这个矩阵。

代码实际运行时,可以调用openCV提供的算法,来可以很好地找到匹配点。以下是一个结果的示例。

只要我们引入一个关键帧的结构(发现位移超过一个固定值时,定义成一个关键帧)。然后,把新的图像与关键帧比较就行了而不需要新的图像与之前帧比较。至于建图,就是把这些关键帧的点云拼起来.

SLAM端优化理论

在建图的过程中,最麻烦的问题,就是“噪声”。这种渐近式的匹配方式,和那些惯性测量设备一样,存在着累积噪声。因为我们在不断地更新关键帧,把新图像与最近的关键帧比较,从而获得机器人的位移信息。如果有一个关键帧出现了偏移,那么剩下的位移估计都会多出一个误差。这个误差还会累积,因为后面的估计都基于前面的机器人位置……

前端的工作称为视觉里程计,它可以给出一个增量式的地图,但由于不可避免的误差累计,这个地图在长时间内是不准确的。而SLAM致力于构建一个长生命周期的可靠的解决方案,因此只有前端是远远不够的。当地图增长到一定程度后,累计误差会使后来的数据越来越不准确。这时我们需要把所有地图数据放到一起做一次完整的优化,从而降低各部分的误差。
后端优化有很多种方案,过去采用以扩展卡尔曼滤波(Extended Kalman Filter,EKF)为主的滤波器方案,现在大多都采用非线性优化方案。EKF由于假设了马尔可夫性质,只利用前一状态来估计当前状态的值,这有点像视觉里程计中只考虑相邻两帧的关系一样,很难做到全局的优化。而现在常用的非线性优化方法,则是把所有数据都考虑进来,放在一起优化,虽然会增大计算量,但效果好得多。

常用的Bundle Adjustment的非线性优化方法,同时提供了一个通用的开发包:g2o, 总之,只要把观测和运动信息丢到求解器里,优化器会为我们求出机器人的轨迹和路标位置.(就是一个可以偷懒的开发包)

闭环检测

上面提到,仅用帧间匹配最大的问题在于误差累积,图优化的方法可以有效地减少累计误差。
然而,如果把所有测量都丢进g2o,计算量过大.
如果机器人到达了之前到过的地方,那么我们直接与那时候采集的关键帧做比较即可,这种方法叫做闭环检测.
闭环检测是说,新来一张图像时,如何判断它以前是否在图像序列中出现过?有两种思路:一是根据我们估计的机器人位置,看是否与以前某个位置邻近;二是根据图像的外观,看它是否和以前关键帧相似。
目前主流方法是后一种, 本质上是个模式识别问题.


实验上用的DSO,采用的是直接法

直接法与特征点法的比较

直接法是视觉里程计另一主要分支,它与特征点法有很大不同.
特征点的缺点:
① 关键点的提取与描述子的计算非常耗时。
② 使用特征点时,忽略了除特征点以外的所有信息。一张图像有几十万个像素,而特征点只有几百个。只使用特征点丢弃了大部分可能有用的图像信息。
③ 相机有时会运动到特征缺失的地方,往往这些地方都没有什么明显的纹理信息。例如,有时我们会面对一堵白墙,或者一个空荡荡的走廓。这些场景下特征点数量会明显减少,我们可能找不到足够的匹配点来计算相机运动

使用特征点法估计相机运动时,我们把特征点看作固定在三维空间的不动点。根据它们在相机中的投影位置,在SLAM端优化中通过最小化重投影误差(Reprojection error)来优化相机运动。在这个过程中,我们需要精确地知道空间点在两个相机中投影后的像素位置——这也就是我们为何要对特征进行匹配或跟踪的理由。而在直接法中,我们最小化的不再是重投影误差,而是测量误差(Phometric error)。

直接法的优点:
直接法根据像素来直接计算相机运动,既避免了特征的计算时间,也避免了特征缺失的情况。只要场景中存在明暗变化(可以是渐变,不形成局部的图像特征),直接法就能工作。根据使用像素的数量,直接法分为稀疏、稠密和半稠密三种,具有恢复稠密结构的能力。相比于特征点法通常只能重构稀疏特征点,直接法和稠密重建有更紧密的联系。

直接法的使用:
若点P来自于稀疏特征点,我们称之为稀疏直接法。通常我们使用数百个特征点,,假设它周围像素也是不变的。这种稀疏直接法速度不必计算描述子,并且只使用数百个像素,因此速度最快,但只能计算稀疏的重构。
P来自部分像素。这称之为半稠密(Semi-Dense)的直接法,可以重构一个半稠密结构。
P为所有像素,称为稠密直接法。稠密重构需要计算所有像素(一般几十万至几百万个),因此多数不能在现有的 CPU上实时计算,需要GPU的加速。
可以看到,从稀疏到稠密重构,都可以用直接法来计算。它们的计算量是逐渐增长的。稀疏方法可以快速地求解相机位姿,而稠密方法可以建立完整地图。
直接法的光度误差:
直接法基于灰度不变假设.灰度不变假设,即同一个空间点的像素灰度,在各个图像中是固定不变的。事实上,由于物体的材质不同,像素会出现高光和阴影部分;有时,相机会自动调整曝光参数,使得图像整体变亮或变暗。这些时候灰度不变假设都是不成立的,因此直接法的结果也不一定可靠。

直接法与特征点法比较:

直接法的优点:
① 可以省去计算特征点。
② 可以在特征缺失的场合下使用。比较极端的例子是只有渐变的一张图像。它可能无法提取角点类特征,但可以用直接法估计它的运动。
③ 可以构建半稠密乃至稠密的地图,这是特征点法无法做到的。

另一方面,它的缺点也很明显:
① 非凸性——直接法完全依靠梯度搜索,降低目标函数来计算相机位姿。其目标函数中需要取像素点的灰度值,而图像是强烈非凸的函数。这使得优化算法容易进入极小,只在运动很小时直接法才能成功,在实践中也能感受到。
② 单个像素没有区分度。于是只能计算图像块,或是计算像素间复杂的相关性。由于每个像素对改变相机运动的“意见”不一致。只能少数服从多数,以数量代替质量。
③ 灰度值不变是很强的假设。如果相机是自动曝光的,当它调整曝光参数时,会使得图像整体变亮或变暗。光照变化时亦会出现这种情况。特征点法对光照具有一定的容忍性,而直接法由于计算灰度间的差异,整体灰度变化会破坏灰度不变假设,使算法失败。

参考资料:
http://fengbing.net/
http://www.cnblogs.com/gaoxiang12/
http://36kr.com/p/5049190.html
http://blog.csdn.net/broadview2006/article/details/71158633
http://blog.csdn.net/xuelabizp/article/details/50327393

[创新实践] SLAM简介相关推荐

  1. 蚂蚁金服高级技术专家徐红星 :蚂蚁金服大数据开放式创新实践

    8月30-31日20:00-21:30,一场别开生面的技术大会-- "蚂蚁金服&阿里云在线金融技术峰会"将在线举办.本次将聚焦数据库.应用架构.移动开发.机器学习等热门领域 ...

  2. “创新实践”项目介绍2:《3D点云中的汽车检测》

    指导教师点评 这是一个非常有价值的项目.在自动驾驶/辅助驾驶领域,将来会有很多人使用陈琪男和黄子健同学实现的算法.在这个项目中,他们"逢山开路",遇到没有实现的深度学习算子,就自己 ...

  3. [8月15日更新]南科大计算机系 “创新实践” 选题说明

    TO: 南科大计算机系2019级本科生 如有意选本人为学术导师,进行"创新实践"项目,可以提前从如下题目中选择,并与我沟通选题意向及项目规划,Email: <yusq@sus ...

  4. 阿里聚安全受邀参加SFDC安全大会,分享互联网业务面临问题和安全创新实践

    现今,技术引领的商业变革已无缝渗透入我们的日常生活,「技术改变生活」的开发者们被推向了创新浪潮的顶端.国内知名的开发者技术社区 SegmentFault 至今已有四年多了,自技术问答开始,他们已经发展 ...

  5. “创新实践”项目介绍3:《利用深度学习进行VR手柄光点检测》

    指导教师点评 这个项目来源于企业的实际需求,所采用的技术方案是最新的深度学习物体检测技术.技术方案具有一定的难度,很有挑战.通过这个项目,学生可以接触真正的需求,提升分析问题和解决问题的能力. 项目名 ...

  6. “创新实践”项目介绍7:《看护服务机械狗》

    指导教师点评 这个项目致力于服务机器人的核心算法.如果有一个机器宠物,不掉毛.不撒尿."饿了"自己能去充电,还能为主人提供一些监护服务,肯定大受欢迎.这个项目让机器狗不仅能够识别主 ...

  7. “创新实践”项目介绍8:《无人机跟拍》

    指导教师点评 这个项目涉及高效率低功耗的视觉方案,还涉及无人机控制,难度不低.如果能拥有一个聪明的飞行机器人,应该是很令人振奋的一件事. 项目名称 无人机跟拍 项目成员 刘晋轩,王一帆,刘思语 合作企 ...

  8. 工信部企业信息核查 谋定“互联网+监管”经信研究创新实践

    工信部企业信息核查 谋定"互联网+监管"经信研究创新实践 中国经济和信息化新闻网 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 经信研究 国研智库 国情讲坛 万赢信采编:为贯 ...

  9. GIS创新实践【实验1】郑州市地图制作与发布

    GIS创新实践[实验1]郑州市地图制作与发布 GIS创新实践[实验2]疫情地图制作与发布 目录 一.目的与任务 二.实验内容与安排方式 三.实验环境 四.实验设计与步骤 01.调出ArcGis软件的编 ...

最新文章

  1. MySQL查询进阶之多表查询
  2. c++批量重命名_文件批量重命名?这个方法百试百灵
  3. openjdk17体验
  4. mysql居左查询abcd_MySql速查手册
  5. 笔吧评测室所用测试软件,这是一台假游戏本:笔吧评测室 GIGABYTE 技嘉 Aero15 Classic-XA 游戏本 测评...
  6. hql查询之实体对象查询
  7. win11WiFi驱动如何下载 windows11WiFi驱动下载的步骤方法
  8. HCIE-Security Day6:5个实验深入浅出理解源NAT
  9. tyvj P4879骰子游戏-美国70分
  10. hbuilder调试代码_【移动端】hbuilder创建app并利用真机运行调试
  11. 请求到达时先经过过滤器还是拦截器_上海自动卷绕式过滤器价格_康斐净化
  12. jmeter性能测试之录制脚本
  13. JavaScript中的replace替换
  14. 产品温度冲击检测 VS 实际使用寿命换算详解
  15. python 列表查重_用python对excel查重
  16. (80)FPGA减法器设计(全减法器)
  17. 倒计时第3天,Google Summer of Code报名即将截止(Casbin社区还有空缺名额)
  18. 2022年 maven配置阿里云仓库配置
  19. 解铃还须系铃人—大数据时代的安全交给大数据
  20. 2022年上海市安全员C证考试题库及答案

热门文章

  1. php laravel入口文件,Laravel学习教程之从入口到输出过程详解
  2. \newpage与\clearpage的区别以及分页断行的多种方式,如何构造首字下沉的效果?
  3. 在办公室给智能手机充电怎么做最安全
  4. 87个C#帮助类,各种功能性代码(转载自微信公众号:dotNET全栈开发)
  5. 数字信号处理matlab设计滤波器
  6. 从零开始的java区块链之路(一) 什么是区块链?
  7. micropython四位数码管程序代码(YX55759-+4位数码管模块)
  8. 计算机中2种格式化,什么叫“格式化”?
  9. 数据结构与算法分析----八大排序(暂时缺少堆排序)
  10. PeakDo无线投屏器体验:零延迟无线投屏,这才是真正的黑科技!