转:SLAM算法解析:抓住视觉SLAM难点,了解技术发展大趋势
SLAM(Simultaneous Localization and Mapping)是业界公认视觉领域空间定位技术的前沿方向,中文译名为“同步定位与地图构建”,它主要用于解决机器人在未知环境运动时的定位和地图构建问题。本次阅面科技资深研究员赵季也将从SLAM方向着手,为大家展现更深层次的技术干货。
赵季:阅面科技资深研究员。2012年获华中科技大学博士学位,2012年至2014年在CMU机器人研究所做博士后。曾在三星研究院从事深度相机、SLAM、人机交互方面的研究。目前专注于空间感知技术的研发。
目前科技发展速度飞快,想让用户在AR/VR、机器人、无人机、无人驾驶领域体验加强,还是需要更多前沿技术做支持,SLAM就是其中之一。实际上,有人就曾打比方,若是手机离开了WIFI和数据网络,就像无人车和机器人,离开了SLAM一样。
SLAM主要解决的是相机在空间中的定位、以及创建环境的地图。在当前比较热门的一些创业方向中,都可以看到它的身影:
在VR/AR方面,根据SLAM得到地图和当前视角对叠加虚拟物体做相应渲染,这样做可以使得叠加的虚拟物体看起来比较真实,没有违和感。
在无人机领域,可以使用SLAM构建局部地图,辅助无人机进行自主避障、规划路径。
在无人驾驶方面,可以使用SLAM技术提供视觉里程计功能,然后跟其他的定位方式融合。
机器人定位导航方面,SLAM可以用于生成环境的地图。基于这个地图,机器人执行路径规划、自主探索、导航等任务。
SLAM技术的发展距今已有30余年的历史,涉及的技术领域众多。由于本身包含许多步骤,每一个步骤均可以使用不同算法实现,SLAM技术也是机器人和计算机视觉领域的热门研究方向。
SLAM技术大解析
SLAM的英文全程是Simultaneous Localization and Mapping,中文称作“同时定位与地图创建”。SLAM试图解决这样的问题:一个机器人在未知的环境中运动,如何通过对环境的观测确定自身的运动轨迹,同时构建出环境的地图。SLAM技术正是为了实现这个目标涉及到的诸多技术的总和。
SLAM技术涵盖的范围非常广,按照不同的传感器、应用场景、核心算法,SLAM有很多种分类方法。按照传感器的不同,可以分为基于激光雷达的 2D/3D SLAM、基于深度相机的RGBD SLAM、基于视觉传感器的visual SLAM(以下简称vSLAM)、基于视觉传感器和惯性单元的visual inertial odometry(以下简称VIO)。
基于激光雷达的2D SLAM相对成熟,早在2005年,Sebastian Thrun等人的经典著作《概率机器人学》将2D SLAM研究和总结得非常透彻,基本确定了激光雷达SLAM的框架。目前常用的Grid Mapping方法也已经有10余年的历史。2016年,Google开源了激光雷达SLAM程序Cartographer,可以融合IMU信息,统一处理2D与3D SLAM 。目前2D SLAM已经成功地应用于扫地机器人中。
2006年使用激光雷达生成的实验室地图
基于深度相机的RGBD SLAM过去几年也发展迅速。自微软的Kinect推出以来,掀起了一波RGBD SLAM的研究热潮,短短几年时间内相继出现了几种重要算法,例如KinectFusion、Kintinuous、Voxel Hashing、DynamicFusion等。微软的Hololens应该集成了RGBD SLAM,在深度传感器可以工作的场合,它可以达到非常好的效果。
视觉传感器包括单目相机、双目相机、鱼眼相机等。由于视觉传感器价格便宜,在室内室外均可以使用,因此vSLAM是研究的一大热点。早期的vSLAM如monoSLAM更多的是延续机器人领域的滤波方法。现在使用更多的是计算机视觉领域的优化方法,具体来说,是运动恢复结构(structure-from-motion)中的光束法平差(bundle adjustment)。在vSLAM中,按照视觉特征的提取方式,又可以分为特征法、直接法。当前vSLAM的代表算法有ORB-SLAM、SVO、DSO等。
视觉SLAM
视觉传感器对于无纹理的区域是没有办法工作的。惯性测量单元(IMU)通过内置的陀螺仪和加速度计可以测量角速度和加速度,进而推算相机的姿态,不过推算的姿态存在累计误差。视觉传感器和IMU存在很大的互补性,因此将二者测量信息进行融合的VIO也是一个研究热点。按照信息融合方式的不同,VIO又可以分为基于滤波的方法、基于优化的方法。VIO的代表算法有EKF、MSCKF、preintegration、OKVIS等。Google的Tango平板就实现了效果不错VIO。
总的来说,相比于基于激光雷达和基于深度相机的SLAM,基于视觉传感器的vSLAM和VIO还不够成熟,操作比较难,通常需要融合其他传感器或者在一些受控的环境中使用。
Visual SLAM为什么比较难?
我们通过分析传感器的测量信息做个定性的分析。激光雷达或者RGBD相机可以直接获取环境的点云。对于点云中的一个点,它告诉我们在某个方位和距离上存在一个障碍点。而视觉传感器获取的是灰度图像或者彩色图像。对于图像中的一个像素,它只能告诉我们在某个方位有障碍点、障碍点周围的表观(local appearance)如何,但它不能告诉我们这个障碍点的距离。要想计算该点的距离,需要把相机挪动一个位置再对它观察一次,然后按照三角测量的原理进行推算。
原理上很清晰,实际做起来并不简单。首先需要在两幅图像中寻找点的对应,这涉及到特征点的提取和匹配、或者准稠密点之间的匹配。计算机视觉发展到今天,其实还不存在性能和速度上很好满足vSLAM的特征提取和匹配算法。常见的特征点提取算法,性能上大致可以认为SIFT>SURF>ORB>FAST,效率上可以认为FAST>ORB>SURF>SIFT(大于号左边代表更优。性能主要包括匹配精度、特征点的数量和空间分布等)。为了在性能和效率上取得折中,通常采用FAST或者ORB,只能舍弃性能更好的SIFT、SURF等。
其次,匹配点的图像坐标与空间坐标之间的关系是非线性的,例如2D-2D点的对应满足对极几何、2D-3D点的对应满足PnP约束。这些匹配数量较多,前后两帧图像中一般有几十至数百的匹配。这些匹配会引入众多约束关系,使得待估计变量的关系错综复杂。为了得到一个较优的估计,通常需要建立优化问题,整体优化多个变量。说起来这无非是一个非线性最小二乘优化问题,但实现起来并不简单,因为存在非线性约束、约束数量很多、存在误差和野值点,并且要将计算时间控制在允许范围。目前广泛采用关键帧技术,并且通过很多方法来控制问题规模、保持问题的稀疏性等。
非线性优化问题的形象图示。圆饼代表待优化的变量(相机姿态、特征点的空间坐标),杆子代表约束(对线几何、PnP等)。
前面分析了vSLAM的两个困难。前者导致了前端的特征跟踪不易,后者导致了后端的优化不易。想做出一个高效率、鲁棒的vSLAM系统还是一个非常有挑战的任务。效率方面,SLAM必须是实时运行的。如果不能做到实时,就不能称作SLAM。不考虑实时性,采用从运动恢复结构(structure-from-motion)效果会更好。鲁棒性方面,一个脆弱的系统会导致用户体验很差,功能有限。
使用structure-from-motion对玲珑塔进行三维重建
vSLAM的核心算法
预备阶段,包括传感器的选型和各种标定。Visual SLAM自PTAM算法以来,框架基本趋于固定。通常包括3个线程,前端tracking线程、后端mapping优化线程、闭环检测(loop closure)线程。
前端tracking线程主要涉及到:
(1) 特征的提取、特征的匹配;
(2) 多视图几何的知识,包括对极几何、PnP、刚体运动、李代数等。
后端优化线程涉及到非线性最小二乘优化,属于数值优化的内容。闭环检测线程涉及到地点识别,本质上是图像检索问题。对于VIO,还涉及到滤波算法、状态估计等内容。
将SLAM算法拆解了看,用到的技术是偏传统的。与当前大热的深度学习“黑箱模型”不同,SLAM的各个环节基本都是白箱,能够解释得非常清楚。但SLAM算法并不是上述各种算法的简单叠加,而是一个系统工程,里面有很多tradeoff。如果仅仅跑跑开源程序,没有什么核心竞争力。不论是做产品还是做学术研究,都应当熟悉各种技术,才能有所创造。
SLAM的未来发展趋势
VSLAM的发展感觉是中规中矩,各个环节在前人的基础上一点点优化,同时不断吸收其他方向的最新成果。短期内肯定会在现有框架下不停地改进。至于长远一些的趋势,IEEE TRO 2016有一篇综述文章Past, present, and future of SLAM: towards the robust-perception age。几位有声望的学者在文中对SLAM的趋势做了非常好的总结。这里仅就自己感兴趣的点提一些个人感想。
新型传感器的出现会不停地为SLAM注入活力。如果我们能够直接获取高质量的原始信息,SLAM的运算压力就可以减轻很多。举例来说,近几年在SLAM中逐渐有使用低功耗、高帧率的event camera(又称 dynamic vision system, DVS)。如果这类传感器的成本能降下来,会给SLAM的技术格局带来许多变化。
自从深度学习在诸多领域所向披靡,不少研究者试图用深度学习中end-to-end的思想重构SLAM的流程。目前有些工作试图把SLAM的某些环节用深度学习代替。不过这些方法没有体现出压倒性优势,传统的几何方法依然是主流。在深度学习的热潮之下,SLAM涉及的各个环节应该会逐渐吸收深度学习的成果,精度和鲁棒性也会因此提升。也许将来SLAM的某些环节会整体被深度学习取代,形成一个新的框架。
SLAM原本只关注环境的几何信息,未来跟语义信息应该有更多的结合。借助于深度学习技术,当前的物体检测、语义分割的技术发展很快,可以从图像中可以获得丰富的语义信息。这些语义信息是可以辅助推断几何信息的,例如已知物体的尺寸就是一个重要的几何线索。
转:SLAM算法解析:抓住视觉SLAM难点,了解技术发展大趋势的更多相关文章
- 三维重建7:Visual SLAM算法笔记
VSLAM研究了几十年,新的东西不是很多,三维重建的VSLAM方法可以用一篇文章总结一下. 此文是一个好的视觉SLAM综述,对视觉SLAM总结比较全面,是SLAM那本书的很好的补充.介绍了基于滤波器的 ...
- 《视觉SLAM十四讲》学习日志(二)——初识SLAM
小萝卜机器人的例子: 就像这种机器人,它的下面有一组轮子,脑袋上有相机(眼睛),为了让它能够探索一个房间,它需要知道: 1.我在哪——定位 2.周围环境怎么样——建图 定位和建图可以理解成感知的 &q ...
- 视觉SLAM算法框架解析(1) PTAM
版权声明:本文为博主原创文章,未经博主允许不得转载. 本系列文章旨在总结主流视觉SLAM算法的框架,对比各个算法在子模块的差异,最终提炼出融合各个算法优点的架构. PTAM[1]是视觉SLAM领域里程 ...
- 视觉SLAM之词袋(bag of words) 模型与K-means聚类算法浅析
原文地址:http://www.cnblogs.com/zjiaxing/p/5548265.html 在目前实际的视觉SLAM中,闭环检测多采用DBOW2模型https://github.com/d ...
- 视觉SLAM之词袋(bag of words) 模型与K-means聚类算法浅析(1)
在目前实际的视觉SLAM中,闭环检测多采用DBOW2模型https://github.com/dorian3d/DBoW2,而bag of words 又运用了数据挖掘的K-means聚类算法,笔者只 ...
- (转) SLAM系统的研究点介绍 与 Kinect视觉SLAM技术介绍
首页 视界智尚 算法技术 每日技术 来打我呀 注册 SLAM系统的研究点介绍 本文主要谈谈SLAM中的各个研究点,为研究生们(应该是博客的多数读者吧)作一个提纲挈领的摘要.然后,我 ...
- SLAM学习笔记(2)SLAM算法
SLAM算法分为三类:Kalman滤波.概率滤波.图优化 Kalman滤波方法包括EKF.EIF:概率滤波包括RBPF,FastSLAM是RBPF滤波器最为成功的实例, 也是应用最为广泛的SLAM方法 ...
- 视觉SLAM中相机详解
视觉SLAM中,通常是指使用相机来解决定位和建图问题. SLAM中使用的相机往往更加简单,不携带昂贵的镜头,以一定的速率拍摄周围的环境,形成一个连续的视频流. 相机分类: 单目相机:只是用一个摄像头进 ...
- 经典视觉SLAM框架
经典视觉SLAM框架 整个视觉SLAM流程包括以下步骤: 1. 传感器信息读取.在视觉SLAM中主要为相机图像信息的读取和预处理. 2. 视觉里程计(Visual Odometry,VO).视觉里程计 ...
随机推荐
- Codeforces Round #586
目录 Contest Info A. Cards B. Multiplication Table C. Substring Game in the Lesson D. Alex and Julian ...
- (转)Linux 磁盘IO性能测试
Linux 如何测试 IO 性能(磁盘读写速度) 这几天做MySQL性能测试,偌大一个公司,找几台性能测试机器都很纠结,终于协调到两台,IO的性能如何还不知道.数据库属于IO密集型的应用,所以还是先评 ...
- [端口安全]Hydra密码爆破
目录 0x01 简介 0x02 常见参数 0x03 使用案例 0x04 密码字典 0x01 简介 Hydra中文名:九头蛇,这是一款相当强大的爆破工具,它基本支持了所有可爆破协议,而且容容错率非常好 ...
- codeforces319C
C. Kalila and Dimna in the Logging Industry time limit per test 2 seconds memory limit per test 256 ...
- Zookeeper简介&应用场景
简介 将zookeeper看作一个服务,为了服务的高可靠,这个服务也是集群组成的,少数(少于n+1)机器挂掉可以通过选举产生一个leader,不会影响这个服务可用性 主要应用场景: 配置文件管理 集群 ...
- Java核心复习——J.U.C AbstractQueuedSynchronizer
第一眼看到AbstractQueuedSynchronizer,通常都会有这几个问题. AbstractQueuedSynchronizer为什么要搞这么一个类? 这个类是干什么的.有什么用? 这个类 ...
- Mininet系列实验(一):Mininet使用源码安装
1 实验目的 掌握Mininet使用源码安装的方法. 2 实验原理 Mininet 是一个轻量级软件定义网络和测试平台:它采用轻量级的虚拟化技术使一个单一的系统看起来像一个完整的网络运行相关的内核系统 ...
- MediaPlayer: 在不同控件之间实现视频的无缝切换的方法
最近使用MediaPlayer + TextureView 实现了一个视频播放器,并且实现了它的横竖屏切换的效果,唯一美中不足的是在横竖屏切换的时候画面会卡顿一下,虽然也不影响播放,但是怕测试会报Bu ...
- 多网卡下如何配置指定IP走某个路由器(适用于外网不通,但是钉钉服务器通的情况)
# 多网卡下如何配置指定IP走某个路由器(适用于外网不通,但是钉钉服务器通的情况) ## 如何查看一个进程建立的网络连接,方式一 - 查看进程pid `ps -ef|grep dingtalk`- 查 ...
- 在主机上如何构建openwrt的编译环境?
答: 请参考官方文档