一文彻底搞懂slam技术(代码片段)

小麦大叔 小麦大叔     2022-12-24     189

关键词:

什么是SLAM?

SLAM (simultaneous localization and mapping),也称为CML (Concurrent Mapping and Localization), 即时定位与地图构建,或并发建图与定位。

问题可以描述为:将一个机器人放入未知环境中的未知位置,是否有办法让机器人一边逐步描绘出此环境完全的地图,同时一边决定机器人应该往哪个方向行进。

例如扫地机器人就是一个很典型的SLAM问题,所谓完全的地图(a consistent map)是指不受障碍行进到房间可进入的每个角落。

SLAM最早由Smith、Self和Cheeseman于1988年提出。

由于其重要的理论与应用价值,被很多学者认为是实现真正全自主移动机器人的关键。

当你来到一个陌生的环境时,为了迅速熟悉环境并完成自己的任务(比如找饭馆,找旅馆),你应当做以下事情:

  • a.用眼睛观察周围地标如建筑、大树、花坛等,并记住他们的特征(特征提取)

  • b.在自己的脑海中,根据双目获得的信息,把特征地标在三维地图中重建出来(三维重建)

  • c.当自己在行走时,不断获取新的特征地标,并且校正自己头脑中的地图模型(bundle adjustment or EKF

  • d.根据自己前一段时间行走获得的特征地标,确定自己的位置trajectory

  • e.当无意中走了很长一段路的时候,和脑海中的以往地标进行匹配,看一看是否走回了原路(loop-closure detection)。实际这一步可有可无。

以上五步是同时进行的,因此是simultaneous localization and mapping

离不开这两类传感器

目前用在SLAM上的Sensor主要分两大类,激光雷达摄像头

这里面列举了一些常见的雷达和各种深度摄像头。激光雷达有单线多线之分,角分辨率及精度也各有千秋。

SICK、velodyne、Hokuyo以及国内的北醒光学、Slamtech是比较有名的激光雷达厂商。他们可以作为SLAM的一种输入形式。

这里展示的就是一种简单的2D SLAM。

这个小视频是宾大的教授kumar做的特别有名的一个demo,是在无人机上利用二维激光雷达做的SLAM。

而VSLAM则主要用摄像头来实现,摄像头品种繁多,主要分为单目双目单目结构光双目结构光ToF几大类。

他们的核心都是获取RGB和depth map(深度信息)。

简单的单目和双目(Zed、leapmotion)我这里不多做解释,我主要解释一下结构光和ToF。

最近流行的结构光和TOF

结构光原理的深度摄像机通常具有激光投射器、光学衍射元件(DOE)、红外摄像头三大核心器件。

这个图(下图)摘自primesense的专利。

可以看到primesense的doe是由两部分组成的,一个是扩散片,一个是衍射片。

先通过扩散成一个区域的随机散斑,然后复制成九份,投射到了被摄物体上。根据红外摄像头捕捉到的红外散斑,PS1080这个芯片就可以快速解算出各个点的深度信息。

这儿还有两款结构光原理的摄像头。

第一页它是由两幅十分规律的散斑组成,最后同时被红外相机获得,精度相对较高。但据说DOE成本也比较高。

还有一种比较独特的方案(最后一幅图),它采用mems微镜的方式,类似DLP投影仪,将激光器进行调频,通过微镜反射出去,并快速改变微镜姿态,进行行列扫描,实现结构光的投射。(产自ST,ST经常做出一些比较炫的黑科技)。

ToFtime of flight)也是一种很有前景的深度获取方法。

传感器发出经调制的近红外光,遇物体后反射,传感器通过计算光线发射和反射时间差或相位差,来换算被拍摄景物的距离,以产生深度信息。

类似于雷达,或者想象一下蝙蝠,softkineticDS325采用的就是ToF方案(TI设计的)。

但是它的接收器微观结构比较特殊,有2个或者更多快门,测ps级别的时间差,但它的单位像素尺寸通常在100um的尺寸,所以目前分辨率不高。

在有了深度图之后呢,SLAM算法就开始工作了,由于Sensor和需求的不同,SLAM的呈现形式略有差异。

大致可以分为激光SLAM(也分2D和3D)和视觉SLAM(也分SparsesemiDenseDense)两类,但其主要思路大同小异。

这个是Sparse(稀疏)的

这个偏Dense(密集)的

SLAM算法实现的4要素

SLAM算法在实现的时候主要要考虑以下4个方面吧:

  1. 地图表示问题,比如dense和sparse都是它的不同表达方式,这个需要根据实际场景需求去抉择

  2. 信息感知问题,需要考虑如何全面的感知这个环境,RGBD摄像头FOV通常比较小,但激光雷达比较大

  3. 数据关联问题,不同的sensor的数据类型、时间戳、坐标系表达方式各有不同,需要统一处理

  4. 定位与构图问题,就是指怎么实现位姿估计和建模,这里面涉及到很多数学问题,物理模型建立,状态估计和优化

其他的还有回环检测问题,探索问题(exploration),以及绑架问题(kidnapping)。

640-3

这个是一个比较有名的SLAM算法,这个回环检测就很漂亮。但这个调用了cuda,gpu对运算能力要求挺高,效果看起来比较炫。

以VSLAM举个栗子

我大概讲一种比较流行的VSLAM方法框架。

整个SLAM大概可以分为前端和后端

前端

前端相当于VO(视觉里程计),研究帧与帧之间变换关系。

首先提取每帧图像特征点,利用相邻帧图像,进行特征点匹配,然后利用RANSAC去除大噪声,然后进行匹配,得到一个pose信息(位置和姿态),同时可以利用IMU(Inertial measurement unit惯性测量单元)提供的姿态信息进行滤波融合后端则主要是对前端出结果进行优化,利用滤波理论(EKF、UKF、PF)、或者优化理论TORO、G2O进行树或者图的优化。最终得到最优的位姿估计。

后端

后端这边难点比较多,涉及到的数学知识也比较多,总的来说大家已经慢慢抛弃传统的滤波理论走向图优化去了。

因为基于滤波的理论,滤波器稳度增长太快,这对于需要频繁求逆的EKF(扩展卡尔曼滤波器),PF压力很大。

而基于图的SLAM,通常以keyframe(关键帧)为基础,建立多个节点和节点之间的相对变换关系,比如仿射变换矩阵,并不断地进行关键节点的维护,保证图的容量,在保证精度的同时,降低了计算量。

列举几个目前比较有名的SLAM算法:PTAM,MonoSLAMORB-SLAM,RGBD-SLAM,RTAB-SLAM,LSD-SLAM

RGBD-SLAM

MonoSLAM

LSD-SLAM

所以大家如果想学习SLAM的话,各个高校提高的素材是很多的,比如宾大、MIT、ETH、香港科技大学、帝国理工等等都有比较好的代表作品,还有一个比较有前景的就是三维的机器视觉,普林斯顿大学的肖剑雄教授结合SLAM和Deep Learning做一些三维物体的分类和识别,实现一个对场景深度理解的机器人感知引擎。

http://robots.princeton.edu/talks/2016_MIT/RobotPerception.pdf

SLAM技术从最早的军事用途(核潜艇海底定位就有了SLAM的雏形)到今天,已经逐步走入人们的视野,扫地机器人的盛行更是让它名声大噪。

同时基于三维视觉的VSLAM越来越显主流。在地面/空中机器人VR/AR/MR汽车/AGV自动驾驶等领域,都会得到深入的发展,同时也会出现越来越多的细分市场等待挖掘。

SLAM技术的应用领域

1)室内机器人 扫地机要算机器人里最早用到SLAM技术这一批了。

国内的科沃斯、塔米扫地机通过用SLAM算法结合激光雷达或者摄像头的方法,让扫地机可以高效绘制室内地图智能分析和规划扫地环境,从而成功让自己步入了智能导航的阵列。

不过有意思的是,科沃斯引领时尚还没多久,一大帮懂Slam算法的扫地机厂商就开始陆陆续续地推出自己的智能导航,直到昨天雷锋网还看到一款智能扫地机新鲜出炉,而这追逐背后的核心,大家都知道就是SLAM技术的应用。

而另一个跟SLAM息息相关的室内移动机器人,因为目前市场定位和需求并不明确,我们目前只能在商场导购室内机器人和Buddy那样的demo视频里才能看到,国内Watchhhh SlamSlam Tech两家公司都是做这方面方案提供的,以现实的观点看,现在室内移动机器人市场定位和需求没落地的时候,由方案商公司推动,商用室内移动机器人先行,这反而是一种曲线救国的发展方式。

2)AR 目前基于SLAM技术开发的代表性产品有微软的Hololens,谷歌的Project Tango以及同样有名的Magic Leap,后者4月20号公布它的新一代水母版demo后,国内的AR公司更加看到了这个趋势。

比如进化动力近期就公布了他们的SLAM demo, 用一个小摄像头实现VR头显空间定位,而易瞳去年10月雷锋网去试用新品的时候,就发现已经整合SLAM技术了,国内其他公司虽然没有正式公布,但我们可以肯定,他们都在暗暗研发这项技术,只等一个成熟的时机就会展现给大家。

进化动力CTO聂崇岭向雷锋网表示,如果用一个准确的说法

很多VR应用需要用到SLAM技术,定位只是一个feature,路径记录、3D重构、地图构建都可以是SLAM技术的输出。

3)无人机 国外的话,原来做 Google X Project Wing 无人机的创始人 MIT 机器人大牛 Nicholas Roy 的学生 Adam Bry 创办的 Skydio,挖来了 Georgia Tech 的 Slam 大牛教授 Frank Dellaert 做他们的首席科学家。

国内大家非常熟悉的大疆精灵四避障用的双目视觉+超声波,一位大疆工程师徐枭涵在百度百家的撰文里坦率承认“P4里面呈现的主动避障功能就是一种非常非常典型的Slam的弱应用,无人机只需要知道障碍物在哪,就可以进行 Planning,并且绕开障碍物

当然Slam能做的事情远远不止这些,包括灾区救援,包括探洞,包括人机配合甚至集群,所有的关于无人机的梦想都建立在Slam之上,这是无人机能飞(具有定位,姿态确定以后)的时代以后,无人机最核心的技术。”

而近期另一个号称刷爆美国朋友圈的hover camera无人机,因为其创始人的的计算机视觉背景,正式把SLAM技术应用进来了,在介绍他们无人机的主要产品技术时,提到了

●SLAM(即时定位与地图构建):通过感知自身周围环境来构建3D增量式地图,从而实现自主定位和导航。

4)无人驾驶 因为Google无人驾驶车的科普,很多人都知道了基于激光雷达技术的Lidar Slam。

Lidar Slam是指利用激光雷达作为外部传感器,获取地图数据,使机器人实现同步定位与地图构建

虽然成本高昂,但目前为止是最稳定、最可靠、高性能的SLAM方式。

另外,2011 年,牛津大学Mobile Robotics Group 首次向公众展示他们的第一辆无人驾驶汽车野猫(Wildcat),这是一辆由 Bowler Wildcat 4X4 改装而成的车。汽车头顶的相机和激光能够搜集信息然后即时分析导航,已经成功通过了测试。

2014 年,他们改装的一辆 Nissan 的 Leaf 也成功路测。

Mobile Robotics Group主要研究领域是大规模的导航和对自然场景理解。

据称,团队所拥有的技术非常牛逼,其复杂和先进性远远超过一般的同步定位与地图构建(SLAM)算法。

可圈可点的是,对于无人驾驶技术,他们并没有使用 GPS 或者是嵌入式的基础设施(信标之类的),而是使用算法来导航,包括机器学习和概率推理来建立周围的地图等。

—— The End ——

推荐好文  点击蓝色字体即可跳转

 没想到靠股市,我差点成功逆袭

☞ 分享一下嵌入式 HarmonyOS 的学习思路 

☞ 推荐一款我私藏已久的串口示波神器

☞ 一位老电子工程师的十年职场感悟

☞ 优雅地用宏实现环形缓冲区

欢迎转发、留言、点赞、分享给你的朋友,感谢您的支持!

长按识别二维码关注我

一文彻底搞懂zookeeper(代码片段)

本文是基于CentOS7.9系统环境,进行Zookeeper的学习和使用1.Zookeeper简介1.1什么是ZookeeperZookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目。本质上,就是文件系统+通知机制1.2Zookeeper工作机制Zookeepe... 查看详情

一文彻底搞懂zookeeper(代码片段)

本文是基于CentOS7.9系统环境,进行Zookeeper的学习和使用1.Zookeeper简介1.1什么是ZookeeperZookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目。本质上,就是文件系统+通知机制1.2Zookeeper工作机制Zookeepe... 查看详情

一文彻底搞懂前端沙箱(代码片段)

什么是“沙箱”沙箱(Sandbox)[1]也称作:“沙箱/沙盒/沙盘”。沙箱是一种安全机制,为运行中的程序提供隔离环境。通常是作为一些来源不可信、具破坏力或无法判定程序意图的程序提供实验之用。沙箱能够安全的执行不受信... 查看详情

一文彻底搞懂docker中的namespace(代码片段)

什么是namespacenamespace是对全局系统资源的一种封装隔离。这样可以让不同namespace的进程拥有独立的全局系统资源。这样改变一个namespace的系统资源只会影响当前namespace中的进程,对其它namespace中的资源没有影响。以前Linux也... 查看详情

一文彻底搞懂kafka(代码片段)

Kafka的学习和使用本文是基于CentOS7.9系统环境,进行Kafka的学习和使用一、Kafka的简介1.1Kafka基本概念(1)什么是KafkaKafka是一个分布式的基于发布/订阅模式的消息队列,主要应用于大数据实时处理领域(2)消息队列点对点模式... 查看详情

一文彻底搞懂hbase(代码片段)

本文是基于CentOS7.9系统环境,进行HBase的学习和使用一、HBase的简介1.1HBase基本概念HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库,可以解决HDFS随机写的问题1.2HBase数据模型逻辑上,HBase的数据模型同关系... 查看详情

一文彻底搞懂hbase(代码片段)

本文是基于CentOS7.9系统环境,进行HBase的学习和使用一、HBase的简介1.1HBase基本概念HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库,可以解决HDFS随机写的问题1.2HBase数据模型逻辑上,HBase的数据模型同关系... 查看详情

一文彻底搞懂leveldb架构(代码片段)

leveldbleveldb是一个写性能十分优秀的存储引擎,是典型的LSM-tree的实现。LSM的核心思想是为了换取最大的写性能而放弃掉部分读性能。那么,为什么leveldb写性能高?简单来说它就是尽量减少随机写的次数。leveldb首先将... 查看详情

一文彻底搞懂leveldb架构(代码片段)

leveldbleveldb是一个写性能十分优秀的存储引擎,是典型的LSM-tree的实现。LSM的核心思想是为了换取最大的写性能而放弃掉部分读性能。那么,为什么leveldb写性能高?简单来说它就是尽量减少随机写的次数。leveldb首先将... 查看详情

一文彻底搞懂leveldb架构(代码片段)

leveldbleveldb是一个写性能十分优秀的存储引擎,是典型的LSM-tree的实现。LSM的核心思想是为了换取最大的写性能而放弃掉部分读性能。那么,为什么leveldb写性能高?简单来说它就是尽量减少随机写的次数。leveldb首先将... 查看详情

一文彻底搞懂cookiesessiontoken到底是什么(代码片段)

点击上方关注“终端研发部”设为“星标”,和你一起掌握更多数据库知识责编:架构君 | 来源:不学无数的程序员链接:https://my.oschina.net/u/4030990/blog/3136476上一篇好文:MySQL数据库的优化,你知道有哪... 查看详情

字符串匹配,一文彻底搞懂(代码片段)

1暴力破解法在主串A中查找模式串B的出现位置,其中如果A的长度是n,B的长度是m,则n>m。当我们暴力匹配时,在主串A中匹配起始位置分别是0、1、2….n-m且长度为m的n-m+1个子串。暴力匹配对应代码是:#inc... 查看详情

mybatis缓存专题-一文彻底搞懂mybatis二级缓存(代码片段)

文章目录1.二级缓存概念2.二级缓存使用2.1.配置二级缓存2.2.分开关2.3.实体类实现序列化接口2.4.测试方法3.cache有一些可选的属性3.1.type3.2.eviction3.3.flushInterval3.4.size3.5readOnly3.6blocking4.MyBatis的缓存机制整体设计以及二级缓存的工作... 查看详情

一文让你彻底搞懂多线程(代码片段)

如果对什么是线程、什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内。用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现。说这个话其... 查看详情

一文带你彻底搞懂docker中的cgroup(代码片段)

前言进程在系统中使用CPU、内存、磁盘等计算资源或者存储资源还是比较随心所欲的,我们希望对进程资源利用进行限制,对进程资源的使用进行追踪。这就让cgroup的出现成为了可能,它用来统一将进程进行分组࿰... 查看详情

一文带你彻底搞懂springboot-rabbitmq(代码片段)

一、环境搭建采用maven多module模式,共计创建三个子modulecommon:通用实体信息rabbitmq-publisher:消息发布者,基于SpringBootrabbitmq-subscriber:消息订阅者,基于SpringBoot在消息发布者和订阅者两个项目中加入rabbitm... 查看详情

mybatis缓存专题-一文彻底搞懂mybatis一级缓存(代码片段)

文章目录1.缓存的概念1.1.什么是缓存1.2.为什么使用缓存1.3.什么样的数据能使用缓存,什么样的数据不能使用2.什么是一级缓存3.什么情况下会命中一级缓存4.Mybatis的一级缓存机制详解5.MyBatis关闭一级缓存6.Mybatis的一级缓存机... 查看详情

mybatis缓存专题-一文彻底搞懂mybatis一级缓存(代码片段)

文章目录1.缓存的概念1.1.什么是缓存1.2.为什么使用缓存1.3.什么样的数据能使用缓存,什么样的数据不能使用2.什么是一级缓存3.什么情况下会命中一级缓存4.Mybatis的一级缓存机制详解5.MyBatis关闭一级缓存6.Mybatis的一级缓存机... 查看详情