SLAM技术已经蓬勃发展起来,这里综述性地介绍下SLAM的主体知识。SLAM的主体技术不多,难点在于细节。来源是:技术分享.ppt

前世

人类惆怅近千年的问题不是:我是谁,我要做什么,我要去哪里!而是:定位、定向、测速、授时

定位是说物体在地球上的方位,定向是物体前进的方向,测速是物体的运行速度,授时是运动经历的时长。而定位和定向就是我们要讨论的话题。

古代智慧的中国人们提出了夜观天象,基于遥远恒星的方位推断自身所处的位置,进而演变出一门博大精深的学科“牵星术”。

直到1964年,美国人彻底打破了大家的游戏规则,建立了全球定位系统GPS。多说几句,GPS是给出物体相对于地心坐标系的经纬度以及相对于水平面的高度(三维信息),且GPS是狭义相对论的应用实例(卫星和地面的时间同步)。

GPS军用的P码可以达到1-2米级精度,开放给大众使用的CA码也能够实现5-10米级的精度。至此已基本上解决了室外的定位和定姿问题,但是室内怎么办?室外怎么优化位姿?

SALM是什么

SLAM的全称是Simultaneous Localization and Mapping,即定位与制图。SLAM和SFM有这千丝万缕的联系。

SFM(Structure From Motion),称之为传统三维重建,这是一门计算机视觉学科的分支,特点是把数据采集回来,离线慢慢处理。常见应用就是重建某建筑物的3d地图,比较炫的成果可见Building Rome in a day (—天重建罗马城)。

SLAM是自动化控制学科的分支,提起SLAM就要提到ROS,网上开源的SLAM技术一般也都是和ROS集成在一起的。ROS是机器人操作系统,用一堆各式各样的传感器组装好一套硬件,采集各个传感器的数据,传送给ROS的处理节点(软件节点)。ROS会并行调度这些节点,这些节点有接受处理某类传感器信号的,有重合处理各项数据的,有展示结果/执行策略的。

所以学习SLAM就要简单了解下ROS,推荐找本入门书翻翻,一天就差不多啦。SLAM要做到的是实时!要做到的是低运算量!

总结便是:二者的数学理论相似,所属学科不同,应用侧重点不同。更直接点,现在的状况是:SFM提供了理论支撑,SLAM真正融入了人们生活。

另一个问题是:SLAM和图像算法是什么关系?

SLAM同步构建周围世界的3d地图,并确定robot所在的位置和方向。16年ICCV大会最后总结致辞:

SLAM是和ConvNets和Deep Learning互补的算法。SLAM专注于几何问题, Deep Learning主要解决感知与识别。
如果想让机器人走到冰箱而不撞墙,你需要SLAM;如果要识别冰箱内的物体,你需要卷积网络。

当然,深度学习的兴起,也会给SLAM/SFM提供新的养料。

SLAM的分支

首先明确三个问题:

  • SLAM可以使用大量不同的硬件
  • SALM是一个概念不是算法
  • SLAM包含多步,每个模块都有多种算法

所以,SLAM有一堆分支。但是整个SLAM框架可以分为前端和后端。根据不同的前端配置采用不同的后端策略,后端也提出了众多的算法理论

前端:涉及传感器的选择以及传感器数据处理。比如里程计时间戳和Lidar点云时间戳的对齐等。按传感器功能,机器人的两个主要模块:

  1. 移动系统:里程计、GPS、IMU惯导等
  2. 测量系统:Laser、sonar、vision等

移动系统中的传感器可以选择一种或多重,甚至“没有”(参考视觉里程计VO,根据图片三维重建,反推摄像机位置,但是计算量大),一般SLAM硬件都会有一两种。

测量系统中,Laser激光精度高,就是价格昂贵,32线程一个30万左右,而且有些场景不适合。声呐雷达价格便宜,技术成熟,就是精度差,水下等特殊场景广泛采用。摄像机信息量丰富直观,但处理量大,对光照敏感。vision又分单目双目等,可见前端方案组合的多样性。

后端:综合前端信息,优化位姿。涉及数学知识较多。

常见的slam算法:vslam、rgbd-salm、monoslam、orb-slam等

SLAM的一般过程

由于运动估计传感器(移动系统)得到的位姿通常具有较大的误差,因而我们希望使用测量系统得到的周围环境信息来优化位姿。

一个完整的处理过程如下:

  1. 机器人使用观测系统测量地标相对于机器人的距离和角度。
  2. 运动一段距离后,达到新的位置,机器人通过运动方程预测新位置。
  3. 在新的位置,通过观测系统重新测量各个地标的距离和角度。
  4. 如此反复

R表示机器人,五角星表示地标。地标的选择是一个研究方向,简单的有特征点(静止点),更鲁棒更高级的是线段,平面都可以作为地标。路标还会涉及到路标的更新。

利用预测值和观测值计算系统状态——卡尔曼滤波。

线性KF方程

u和z是硬件可以提供的,上述中x为系统状态:表示robot的位置,表示robot的姿态(四元组或者3个角度值),为地标的位置

u表示速度/加速度/角加速度等值。z表示测量系统得到的地标相对机器人的距离、角度。w和v表示噪声。

由此,可以根据上一时刻状态和当前时刻观测量更新得到当前时刻状态。这也是卡尔曼滤波所擅长的。

EKF

KF滤波是线性方程,但是距离等显然不是线性的,因此,SLAM中其实用的最多的是EKF(Extended Kalman Filter)。

EKF实质是把差值认为是线性的,思想还是用线性系统代替非线性系统。计算可以参考《An Introduction to the Kalman Filter》。

目前,也有一些slam采用了粒子滤波PF,PF是基于马尔科夫蒙特卡洛方法的抽样滤波,适用非线性系统。PF中要维持所有的可能状态,对资源消耗大。

上述渐进式的匹配方式,存在累计误差。如果有一帧错误,后续又基于这个错误的位置,后果不堪设想。所以最好和前面多帧进行对比(预测方程基于前面多个时刻)。

后端Graph-based SLAM

SLAM借鉴SFM中的捆集优化思想,21世纪走向了图优化的道路。

优化方法和滤波器方法有根本上的不同。它并不是一个迭代的过程,而是考虑过去所有帧中的信息。通过优化,把误差平均分到每一次观测当中。

Graph-based SLAM是无法计算的,图的联结数目巨大,但是其实这是一个稀疏的,正是这个稀疏性,使得优化思路成为了现实。这里要感谢稀疏代数的发展,网上有很多优化库可解上述目标函数。

闭环检测

新来一帧数据,如何判断它在已有序列中是否出现过。

  1. 新帧的位置,如果回到历史位置附近;
  2. 帧的特征和历史关键帧特征相似(常用)。

不用第一种:科学家认为前一种依靠有噪声的位置来减少位置的噪声,有点循环论证的意思。第二种就是:帧帧匹配。

在没有闭环的情况下,[k,k+t]这一段数据进行图优化,如果闭环出现(如绿色),就要把历史数据也考虑进来,入册可以显著减少累计误差。

注意:闭环检测的引入是为了减少误差的,很多场景很难出现闭环这种情况,但是人们有意设计了这种状况,比如扫机器人开启前期,走一段路就绕回来,为得便是制造闭环。

SLAM的应用

  • 扫地机器人,这简直就是SLAM的代言人,除了定位+制图,还需要引入路径规划。
  • 室内移动机器人
  • 无人机
  • 无人驾驶

等等,I am anywhere! SLAM也即将开启超体时代。Google的cartographer也给SLAM添了一把火。

参考

《SLAM for Dummies》

http://www.leiphone.com/news/201605/5etiwlnkWnx7x0zb.html

http://blog.csdn.net/lcj_cjfykx/article/details/46407875

https://www.zhihu.com/question/51348391/answer/125439374

SLAM的前世今生的更多相关文章

  1. SLAM: VSLAM扫盲之旅

    在<机器人手册> 第2卷,这本书里面,第23章讲述了:三维视觉和基于视觉的实时定位于地图重建.在第37章里面,讲述了 同时定位与建图.指出了SLAM的三种基本方法. 一种是EKF的方法,但 ...

  2. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  3. [C#] 回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性

    回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性 序 目前最新的版本是 C# 7.0,VS 的最新版本为 Visual Studio 2017 RC,两者都尚未进入正式阶段.C# 6.0 ...

  4. docker4dotnet #1 – 前世今生 & 世界你好

    作为一名.NET Developer,这几年看着docker的流行实在是有些眼馋.可惜的是,Docker是基于Linux环境的,眼瞧着那些 java, python, node.js, go 甚至连p ...

  5. Atitit 智能云网络摄像机的前世今生与历史 优点  密码默认888888

    Atitit 智能云网络摄像机的前世今生与历史 优点  密码默认888888 用户名admin  密码aaaaaa 网络摄像机是一种结合传统摄像机与网络技术所产生的新一代摄像机,它可以将影像通过网络传 ...

  6. 阿里开源消息中间件RocketMQ的前世今生-转自阿里中间件

    昨天,我们将分布式消息中间件RocketMQ捐赠给了开源软件基金会Apache. 孵化成功后,RocketMQ或将成为国内首个互联网中间件在Apache上的顶级项目. 消息一出,本以为群众的反应是这样 ...

  7. JavaScript的前世今生

    和CSS一样,JavaScript在各浏览器下并非完全一致,它所带来的兼容性问题时常困扰着我们,以至于现在“能否处理流行浏览器的兼容性问题”成为了检验一个程序员是否合格的标准之一.了解JavaScri ...

  8. Slam(即时定位与地图构建) 知识篇

    Slam即时定位与地图构建 技术解释 同步定位与地图构建(SLAM或Simultaneous localization and mapping)是一种概念:希望机器人从未知环境的未知地点出发,在运动过 ...

  9. rplidar & hector slam without odometry

    接上一篇:1.rplidar测试 方式一:测试使用rplidar A2跑一下手持的hector slam,参考文章:用hector mapping构建地图 但是roslaunch exbotxi_br ...

随机推荐

  1. [iOS]有关开发过程中,代码之外的一些东西。

    1.访问相册的权限 Privacy - Photo Library Usage Description //访问相册Privacy - Photo Library Additions Usage De ...

  2. CY7C68013 USB接口相机开发记录 - 第一天:资料下载

    一直觉得从头开发一套东西出来会极大的提升自己的自信心,能够最大化的开发自己的潜能.所以在犹豫很久之后决定学习下CY7C68013 USB接口相机的开发. 通过在网上查找多份资料后,觉得工欲善其事必先利 ...

  3. java里的基本数据类型和引用数据类型

    一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768 ...

  4. OpenCV3.2.0+VS2017环境配置与常见问题(巨细坑爹版)

    目录 安装 常见问题 题外话:首先,配环境一定要有耐心... 本博客是本小白第一次装OpenCV成功后第一时间整理发布.用的是刚下载好的OpenCV3.2.0版,用x64编译器Debug运行(当然Re ...

  5. MDK错误 Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_hd.o). 解决方法

    此错误产生的位置在STM32工程所包含的汇编启动代码文件,如下图 熟悉ARM汇编的朋友一定可以看出,这是一个子程序调用语句,而调用的子程序正是SystemInit.出现错误的原因就是汇编器没有在代码之 ...

  6. 一个ner的bug

    整个机器人代码之前都是好好的,今天启动的时候,就报Initialization failed! 的错误,然后想着其他模块应该没有问题.然后单独运行或者叫测试吧,测试了下 search_eng.py,发 ...

  7. Ubuntu1404 开启定时任务 crontab

    crontab -e 这个 我使用vim编辑,所以选择3,进入到 写了两条,的确隔了一分钟在test.txt文件夹里面会多加一条Good morning进去.而且也会执行dingshi.sh这个she ...

  8. JS_高程6.面向对象的程序设计(2)创建对象_3 构造函数存在的问题

    # 上次讲到用构造函数的模式来创建对象,相对于工厂模式,解决可对象识别的问题. function Person(name,age,job){ this.name=name; this.age=age; ...

  9. leetcode笔记--水箱问题

    类型的引用:Solution *s=new Solution(); 1.Container With Most Water Given n non-negative integers a1, a2, ...

  10. flask之分页插件的使用、添加后保留原url搜索条件、单例模式

    本篇导航: flask实现分页 添加后保留原url搜索条件 单例模式 一.flask实现分页 1.django项目中写过的分页组件 from urllib.parse import urlencode ...