视觉SLAM技术应用

  • SLAM技术背景

SLAM技术全称Simultaneous localization and mapping,中文为“同时定位与地图构建”。SLAM可以在未知的环境中实时定位自身的位置,并同时构建环境三维地图,是计算机视觉领域以及机器人领域中非常关键的一项技术,有着非常广泛的应用,例如VR、AR、机器人、自动驾驶等领域。

SLAM技术在机器人领域应用广泛,可以采用各种各样的传感器,例如激光雷达,深度摄像头,单目、双目、多目摄像头,惯性传感器等等。

根据传感器的信息,SLAM可以实时计算自身位置(在空间中的位置和朝向),并同时恢复场景的三维结构,构建环境三维地图。根据这个三维结构恢复的稀疏程度,可以分为稀疏SLAM和稠密SLAM,其中稠密SLAM是把场景的三维几何结构都恢复出来。

SLAM技术经过多年的发展,整体框架相对稳定,目前主流SLAM系统采用的是2007年牛津大学提出的并行跟踪与建图框架。首先,前台线程根据输入的传感器信息,实时计算设备位姿。同时后台线程持续构建地图,并对三维点云进行优化,以减少实时计算带来的误差累积。一旦存在回路,需要把回路检测出来并进行闭合。

PTAM是第一个真正接近实际应用的技术,后面的SLAM系统基本延续这个框架,像DTAM主要是做小场景比较稠密的几何重建,ORB-SLAM对PTAM框架做了进一步改进,包括自动初始化,采用ORB特征,以及有回路闭合功能。有一些直接法(例如DSO)还能够做到大场景半稠密的重建。

  • 视觉SLAM的技术挑战

视觉SLAM,主要使用单目、双目或多目摄像头。从广义上讲,也可以以视觉传感器为主,加上其他传感器作为辅助。视觉SLAM最主要的优势是成本比较低廉,目前已经被证明至少在小范围内可以实现较高的定位精度,可以满足AR的应用要求。

视觉SLAM的基本原理是多视图几何。空间上的三维点,如果从某个视角看不被遮挡,那就有对应的投影点。另外,它有对应的二维观测点,理论上三维点的投影点跟二维的观测点应该是重合的,但实际上由于噪声等原因不会严格重合,这时通过最小化目标函数,可以把这里的投影矩阵P和三维点X都解出来。

在实际应用中,视觉SLAM面临精度和稳定性,以及实时性这两大关键挑战。精度和稳定性方面,因为环境往往是动态变化的,弱纹理和重复纹理问题很容易造成视觉特征匹配不准确,从而导致优化计算不稳定。实时性方面,主要是在大规模场景下,SLAM计算复杂度高,而低功耗设备的计算能力有限,如何做到实时计算。

关键思路在于,对SLAM稳定求解,这可以从约束的正确性和约束的稳定性这两个方面考虑。SLAM本质上就是一个目标函数构造和优化问题。为此,我们要保证目标函数里的约束项都是正确的,这就需要尽可能把错误的匹配剔除掉。在弱纹理情况下,匹配点过少使得约束项不足,优化求解不稳定。解决这个问题一般有两方面的思路,一个是可以通过添加一些运动先验的约束,使约束方程变得比较稳定。另一个是添加场景的先验结构约束,比如一些平面结构约束,把这样的先验结构约束加入到这个目标函数里,也会使得它变得稳定。

基于这两个思路,我们开展了面向复杂场景的视觉SLAM技术的研究工作。比如在2013年的RDSLAM这个工作,我们会在线地检测哪些特征点发生了改变,同时排除遮挡造成的情况。通过在线持续的检测变化,及时更新地图,使得地图里的三维点都是有效的,从而能够处理场景动态变化甚至逐渐改变的情况。2016年,我们提出的RKSLAM工作,能够在移动设备做到实时。它主要是通过视觉方法估计出连续帧之间的运动角度得到角速度的估计,然后把这些运动约束加入到目标函数里进行优化求解,从而大大提升了位姿估计的稳定性,即使在晃动比较剧烈的情况下依然比较稳定。另外,从速度上来看,我们的RKSLAM速度是ORB-SLAM的将近五倍。

第二个关键思路是如何解决计算效率的问题。这里非常关键的技术就是集束调整,通过最小化一个目标函数来对所有相机的参数和三维点进行同时优化。相机参数和三维点数目可能非常多,复杂度非常高,非线性优化的每次迭代都是在求解一个线性方程组。我们发现这个Hessian矩阵是高度稀疏的,如果充分利用这个稀疏性来求解,效率会高很多。

但即使充分利用了稀疏性,求解效率依然是集束调整的一大挑战。对于大尺度三维场景重建,无论是内存、效率都会遇到这样的瓶颈,而采用局部优化策略很容易陷入局部最优解。对于实时SLAM来说,还面临功耗问题以及如何在精度和效率之间取舍的问题。

可以从分治求解和增量式计算这两个思路对集束调整进行加速。

分治求解主要有两类方式,一类是基于分段的BA,比如将一个长序切分为若干段短序列,每段序列整体做一个7DoF的相似变换。如果优化后误差大于阈值,则继续分裂再优化。通过这样的由粗到细的优化策略,来实现累积误差的快速分散和优化。另一类思路是分布式BA,将整体切分成若干个子地图,各地图独立优化,然后通过共享变量的方式来实现整体的优化。

很多时候SLAM往往是新来一个关键帧就要BA优化一下。增量式BA的代表性方法有iSAM、iSAM2,以后我们提出的EIBA、ICE-BA。增量式BA方法的主要思想是充分利用前面构造好的信息,仅对新加入的变量或需要更新的变量所对应的矩阵元素进行更新计算,这可以大幅降低计算复杂度。可以说,增量式BA在很多时候其计算复杂度跟局部BA差不多,但精度是跟全局BA几乎是一样的。

这是ICE-BA跟传统的BA方法的效率对比。分为局部BA(固定帧数)和全局BA(帧数随时间增长)两类。可以看到,无论是局部BA还是全局BA,ICE-BA都比传统的方法快一个数量级,甚至更多。这部分工作的代码已经开源。

  • 视觉SLAM应用落地

我们和商汤科技合作开发的SenseAR平台,能够方便实现各种AR应用。今年新推出的SenseAR 2.0主要是在1.0的基础上增加了云-端结合的功能,并融合了AI能力,而且一些模块的性能也有明显的提升。通过结合云端的高精度地图,可以实现比如室内外定位与AR导航,以及AR多人共享。比如,几个玩家拿着各自的手机,可以在真实的场景下玩设定的游戏,这对SLAM的跟踪精度以及重定位能力要求很高。

AR的应用场景复杂多变,由于用户拿着手机,其运动类型非常复杂,而且场景有动态物体,并存在遮挡、弱纹理以及重复纹理等问题。因此,要保证良好的AR用户体验,就需要保证精确且一致的跟踪注册,而且尽量保证跟踪成功率高,若跟踪失败,需要能够快速恢复正常状态。

为了解决这个问题,我们构建了一个面向AR的单目视觉惯性数据集。我们用两款手机拍摄数据,一个是iPhone X,还有一个是小米8,这是它们的图像和分辨率的参数。我们采用VICON运动捕捉系统来获得手机的运动轨迹真值。

为了模拟AR运动的情况我们选了五种运动类型。我们分别用小米8手机录了A系列序列,iPhone X录了B系列序列。

我们来看一下这些序列的情况。A系列序列还是属于比较正常的运动类型,就是我刚才说的几种常规的运动,主要是用来测试跟踪精度的;而B系列序列是测试鲁棒性的,相对来说比较极端,比如说突然手去挡住相机,或者突然把图像变成黑色,强迫SLAM系统跟踪丢失进入重定位状态。

视觉SLAM技术应用的更多相关文章

  1. (转) SLAM系统的研究点介绍 与 Kinect视觉SLAM技术介绍

          首页 视界智尚 算法技术 每日技术 来打我呀 注册     SLAM系统的研究点介绍 本文主要谈谈SLAM中的各个研究点,为研究生们(应该是博客的多数读者吧)作一个提纲挈领的摘要.然后,我 ...

  2. 如何从零开始系统化学习视觉SLAM?

    由于显示格式问题,建议阅读原文:如何从零开始系统化学习视觉SLAM? 什么是SLAM? SLAM是 Simultaneous Localization And Mapping的 英文首字母组合,一般翻 ...

  3. 视觉SLAM关键方法总结

    点"计算机视觉life"关注,置顶更快接收消息! 最近在做基于激光信息的机器人行人跟踪发现如果单独利用激光信息很难完成机器人对行人的识别.跟踪等功能,因此考虑与视觉融合的方法,这样 ...

  4. 转:SLAM算法解析:抓住视觉SLAM难点,了解技术发展大趋势

    SLAM(Simultaneous Localization and Mapping)是业界公认视觉领域空间定位技术的前沿方向,中文译名为“同步定位与地图构建”,它主要用于解决机器人在未知环境运动时的 ...

  5. 漫谈 SLAM 技术(上)

    欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:解洪文 导语 随着最近几年机器人.无人机.无人驾驶.VR/AR的火爆,SLAM技术也为大家熟知,被认为是这些领域的关键技术之一.本文对S ...

  6. 经典视觉SLAM框架

    经典视觉SLAM框架 整个视觉SLAM流程包括以下步骤: 1. 传感器信息读取.在视觉SLAM中主要为相机图像信息的读取和预处理. 2. 视觉里程计(Visual Odometry,VO).视觉里程计 ...

  7. 视觉SLAM漫谈 (三): 研究点介绍

    1. 前言 读者朋友们大家好!(很久很久)之前,我们为大家介绍了SLAM的基本概念和方法.相信大家对SLAM,应该有了基本的认识.在忙完一堆写论文.博士开题的事情之后,我准备回来继续填坑:为大家介绍S ...

  8. 视觉SLAM实战(一):RGB-D SLAM V2

    写在前面 首先打个广告.SLAM研究者交流QQ群:254787961.欢迎各路大神和小白前来交流. 看了前面三篇博文之后,是不是有同学要问:博主你扯了那么多有用没用的东西,能不能再给力一点,拿出一个我 ...

  9. SLAM技术在国内的发展现状

    近年来,由于扫地机的出现使得SLAM技术名声大噪,如今,已在机器人.无人机.AVG等领域相继出现它的身影,今天就来跟大家聊一聊国内SLAM的发展现状. SLAM的多领域应用 SLAM应用领域广泛,按其 ...

随机推荐

  1. adb、adb shell am、adb shell pm命令的详细使用说明

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/64183248 1.在命令行终端执行下面的命令: adb >adb.txt 2 ...

  2. Python socket编程(阻塞) --基于SocketServer

    SocketServer模块是Python对socket常规通信的一个经过封装的模块,使用简单,基于面向对象的设计模式,但功能有限,可用于快速开发. Tips: 默认端口:6767 默认本地ip:12 ...

  3. hdu3255 线段树扫描线求体积

    题意:       给你n个矩形,每个矩形上都有一个权值(该矩形单位面积的价值),矩形之间可能重叠,重叠部分的权值按照最大的算,最后问这n个矩形组成的图形的最大价值. 思路:       线段树扫描线 ...

  4. Portswigger web security academy:Server-side request forgery (SSRF)

    Portswigger web security academy:Server-side request forgery (SSRF) 目录 Portswigger web security acad ...

  5. Day006 方法的定义和调用

    方法的定义 Java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段,一般情况下,定义一个方法包含以下语法: 方法包含一个方法头和一个方法体.下面是一个方法的所有部分: 修饰符:修饰符,这 ...

  6. LeetCode 26. 删除有序数组中的重复项

    双指针法 分析: 设置两个指针:p1,p2,初始p1指向数组的第一个元素,p2指向第二个元素 1)如果p1的值 == p2的值,就让p2后移一位 2)如果p1的值 != p2的值,修改p1的下一个元素 ...

  7. 附近的人?你zao吗?

    前几天收到一个新的需求,需要实现类似"附近的人"的功能:根据自己当前的定位,获取距离范围内的所有任务地点.刚看到这个需求时有点懵逼,第一想到的就是要利用地球的半径公式去计算距离,也 ...

  8. .NET之API版本控制

    1. 优点 有助于保护原有系统,不受影响,并及时修改问题 可以实现用户的私人定制(比如是付费接口) 快速迭代 2. API版本控制 在URL中追加版本或者作为查询字符串参数 通过自动以标头和通过接受标 ...

  9. Kubernetes入门,使用minikube 搭建本地k8s 环境

    这是一篇 K8S 的 HelloWorld,在学习K8S官方文档时搭建环境搭建的一个记录,照着文档下来还是比较顺利的. 一.安装kubectl 下载 kubectl curl -LO "ht ...

  10. FHD 4K 8K分辨率

    4K(2160P,即4096×2160的像素分辨率)和8K(4320P,即7,680 × 4,320的像素分辨率)属于UHDTV. FHD是FULL HD(Full High Definition)的 ...