博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SLAM的前世今生
阅读量:5954 次
发布时间:2019-06-19

本文共 3035 字,大约阅读时间需要 10 分钟。

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

前世

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

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

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

直到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为系统状态:[x_{r},y_{r},z_{r}]表示robot的位置,\theta_{r}表示robot的姿态(四元组或者3个角度值),[x_{n},y_{n}]为地标的位置

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://bwoxx.baihongyu.com/

你可能感兴趣的文章
nginx实现rtmp,flv,mp4流媒体服务器
查看>>
46.tornado绑定域名或者子域名泛域名的处理
查看>>
文本过滤--sed 1
查看>>
PHP CURL并发,多线程
查看>>
ES 概念及动态索引结构和索引更新机制
查看>>
iOS 开发百问(2)
查看>>
MySQL for Mac 安装和基本操作(包含后期的环境变量设置)
查看>>
Linux及windows下常见压缩程序的压缩能力对比
查看>>
JAVAEE-junit测试hibernate里的方法(hibernate交给spring管理)的问题
查看>>
MOTO MB860 国行2.3.5优化增强ROM_Top_T5_end(经典收藏版)
查看>>
C#学习经典(二)---MVC框架(Model view Controller)
查看>>
log4j配置文件说明
查看>>
Maven: 为Compiler插件设置source和target版本
查看>>
linux下永久添加静态路由
查看>>
android 全局变量和局部变量命名规则
查看>>
Ubuntu Sub-process /usr/bin/dpkg
查看>>
详解DNS的常用记录(下):DNS系列之三
查看>>
linux的日志服务器关于屏蔽一些关键字的方法
查看>>
事情的两面性
查看>>
只要会营销,shi都能卖出去?
查看>>