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. 事务(transaction )

    事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit). 事务是恢复和并发控制的基本单位. 事务有4个特性:原子性.一致性.隔离性.持久性.(即ACID) 原子 ...

  2. Scrapy基础(十)———同步机制将Item中的数据写在Mysql

      前面讲解到将Item中的所有字段都已经填写完成,那么接下来就是将他们存储到mysql数据库中,那就用到了pipeline项目管道了:  对项目管道的理解:做一个比喻,爬取好比是开采石油,Item装 ...

  3. Hibernate的核心接口

    Hibernate5个核心接口 所有Hibernate应用中都会访问Hibernate的5个核心接口 Configuration接口:配置Hibernate,根启动Hibernate,创建Sessio ...

  4. AC自动机相关Fail树和Trie图相关基础知识

    装载自55242字符串AC自动机专栏 fail树 定义 把所有fail指针逆向,这样就得到了一棵树 (因为每个节点的出度都为1,所以逆向后每个节点入度为1,所以得到的是一棵树) 还账- 有了这个东西, ...

  5. [USACO18DEC]The Cow Gathering

    Description: 给定一棵树,每次删去叶子,有m个限制,分别为(a,b)表示a需要比b先删,为每个点能否成为最后被删的点 Hint: \(n,m \le 10^5\) Solution: 手模 ...

  6. div height 自适应高度 占满剩余高度的方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. shell脚本使用--sleep

    #!/bin/bash #filename.sh echo -n Count: tput sc count=; while true; do ]; then let count++; ; tput r ...

  8. TypeScript语法学习--变量的声明

    JavaScript里相对较新的变量声明方式是let和const.let在很多方面与var是相似的,但是可以帮助大家避免在JavaScript里常见一些问题. const是对let的一个增强,它能阻止 ...

  9. mvc中AntiForgeryToken的实现方式--看Mvc源码

    通过 AntiForgeryWorker的GetHtml()方法生成html --input hide元素--value=要验证的值,并生成cookie--用于保存需要验证的值. 类中的AntiFor ...

  10. 【组合数】微信群 @upcexam6016

    时间限制: 1 Sec 内存限制: 128 MB 题目描述 众所周知,一个有着6个人的宿舍可以有7个微信群(^_^,别问我我也不知道为什么),然而事实上这个数字可以更大,因为每3个或者是更多的人都可以 ...