点击上方“计算机视觉life”,选择“星标”
快速获得最新干货
本文由深话AI整理,仅作为学术分享,侵删。原文链接:
https://www.zhihu.com/question/52634751
鉴于题主是激光SLAM入门,就以下面这样一个思路来答一下吧。
1.SLAM与ROS的关系
1.1.关于SLAM
1.2.关于ROS
1.3.SLAM与ROS的关系2.ROS移动机器人的整体构造
2.1.硬件构造解析
2.2.电机解析
2.3.电机驱动板解析
2.4.底盘驱动方式的解析
2.5.IMU模块解析
2.6.激光雷达解析
2.7.ROS主机解析
2.8.摄像头解析3.商业应用ROS机器人
3.1.SLAM建图导航的应用案例
3.2.商业ROS机器人相关公司
3.3.商业ROS机器人两大发展思路4.科研学习ROS机器人
4.1.科研学习ROS机器人与商业应用ROS机器人的区别
4.2.淘宝上科研学习ROS机器人相关产品
4.3.选购ROS机器人入门指南
---------------分割线-----------------
在了解SLAM之前,需要先对机器人有一个整体的认识。一个典型的机器人的模样,执行机构:轮式运动底盘、机械手臂、音响和显示屏,感知机构:激光雷达、声呐、摄像头、IMU、轮式里程计编码盘、麦克风、触摸感应,决策机构:自我认知、环境认知、思想。
机器人通常借助感知装置持续跟外部环境进行交互,从而来获取机器人的状态和环境的状态,我们可以简单的把机器人获取自身状态的行为叫做自我认知,把机器人获取环境状态的行为叫做环境认知。由于目前的机器人智能还比较低级,所以这里讲到的机器人认知也是低级别的,例如人脸识别、语音识别、机器人定位、环境障碍物探测。有了认知,机器人就可以帮人类完成很多工作了,例如搬运货物、照看小孩、陪伴闲聊、帮忙管理家里的智能设备、查询天气交通新闻资讯等等。我们可以把机器人帮助人类完成的这些个工作叫做机器人的技能,机器人拥有的这些个技能我们可以简单的理解为机器人低级别的思想。机器人的躯壳+机器人的认知+机器人的思想,基本上就是机器人该有的模样了。图1.1.1 一个典型机器人的模样
咋一看机器人是个超级复杂的东东,但是作为机器人开发人员来说就那么几个关键技术。其实,学界和工业界热门的研究和开发也是围绕这几个关键技术展开的。
关键技术1:机器人移动底盘
关键技术2:机械手臂
关键技术3:SLAM导航
关键技术4:语音交互
关键技术5:物体识别
本人在这里总结归纳了机器人上的5大关键技术,由于个人能力和篇幅限制原因,接下来的内容将主要涉足机器人SLAM导航领域的相关技术。大家别以为SLAM是一个很新的技术,只是最近借着人工智能的风突然就火了起来。其实SLAM研究已经有几十年的历史了,SLAM最早是出现在军事应用中,比如勇气号火星探测车,在不能实时遥控的未知环境行星上的探测车为了执行任务,需要借助SLAM技术来导航和避障。后来慢慢的SLAM技术就从军用转民用了,有了我们现在看到的小到家里的扫地机器人大到无人驾驶汽车的各种SLAM应用,还有各种AR和VR应用很多也用到了SLAM技术。
SLAM是用来解决同时建图和定位问题的,单独的定位技术已经在日常生活很多见了(比如GPS定位技术、wifi定位技术、磁条导轨定位技术),单独的环境建图技术也很成熟了(比如学中的CT、电影制作特效、隧道勘探测绘等)。
但是面对机器人这样一个复杂的应用,单独的定位技术和单独的环境建图技术都不能很好的解决问题,于是结合了定位与建图的SLAM技术就出现了。接下来,简单的梳理一下定位、建图、SLAM同时定位于建图、SLAM导航技术的理论发展过程。
机器人所处的环境存在大量不可预测性,传感器测量误差、电机控制的不稳定性、软件方面的近似处理。。。简单点说,就是通过对机器人的概率建模,可以对机器人的不确定性进行明确的可计算性的表示。
处理机器人中的这种不确定性的概率技术我们称之为概率机器人技术,其核心是用传感器数据来估计状态的思路。图1.1.2 机器人与环境交互这就是机器人与环境交互的一个过程,传感器负责从环境测量信息,控制机构负责用来作用于环境。用概率模型来表示这个交互过程,就是大名鼎鼎的贝叶斯迭代网络。图1.1.3 贝叶斯迭代网络
通过对机器人中状态估计的了解,我们知道了贝叶斯概率法则起着重要的作用,而且大部分计算置信度的通用算法都是由贝叶斯算法给出的。算法其实就是两个步骤预测和更新。贝叶斯滤波的具体实现算法可以分为参数化实现算法和非参数化实现算法两种,由于贝叶斯滤波理论及各种具体实现算法涉及到大量深奥的数学知识,由于篇幅和个人能力受限,就不展开了,有兴趣的朋友可以参阅《概率机器人》这本书。图1.1.4 贝叶斯滤波及各种具体实现算法
模型了解了机器人中的状态估计及各种滤波概率算法后,我们发现机器人的运动和测量概率模型对算法中的预测和更新步骤起着至关重要的作用。图1.1.10 机器人的运动概率模型图1.1.11 机器人的测量概率模型
透过贝叶斯迭代网络,不难发现,进行机器人位姿估计,求解位姿置信度分布的过程其实就是机器人的定位问题;进行环境状态估计,求解地图置信度分布的过程就会机器人的建图问题。
上面已经单独的提出了机器人定位与机器人建图的方法,但是独立的定位问题是建立在地图已知的情况下的,单独的建图问题也是建立在定位已知的情况下的。当机器人不能得到环境地图,也不知道自身位姿的时候,SLAM问题就出现了。也就是说SLAM要同时的进行机器人定位和建图,这个问题比单独的定位和单独的建图都要难得多。图1.1.13 在线SLAM问题和全SLAM问题
在线SLAM算法的代表是EKF SLAM,历史上最早并可能是最有影响力的SLAM算法,可以说是SLAM研究的元老级算法。EKF SLAM中的地图是基于特征的,地图由点地标组成。除了估计机器人当前的位姿,EKF SLAM算法还估计路径上遇到的所有地标的坐标,也就是机器人位姿和地图地标点包含进联合状态矢量里,算法对该联合状态矢量进行估计。
全SLAM算法的代表是GraphSLAM,该算法将机器人的运动路径和测量组件成一个软约束的图,利用图论中的优化算法对整个图中的轨迹点和测量点进行估计。由于图的稀疏性特点,可以大大加快计算。
EKF SLAM和GraphSLAM是两个极端。EKF SLAM需要取得每一时刻的信息,把信息分解为概率分布,因此每一步的计算代价都非常昂贵。而GraphSLAM刚好相反,只是简单的积累每一时刻的信息,也就是简单的将收到的信息存储下来,然后可以离线的进行推理的步骤,加之存储下来的信息的稀疏性,因此GraphSLAM计算的开销是比较小的,但是随着地图规模扩大算法会消耗越来越多的内存直至崩溃。面对这两个极端问题,当然就会有介于EKF SLAM和GraphSLAM是两个极端之间的折中的方法,就是SEIF SLAM。SEIF SLAM算法继承了EKF SLAM信息表示的高效性,也保留了GraphSLAM计算代价小的优点,可以说SEIF SLAM是高效和可实现的SLAM算法。还有另外一种高效和可实现的SLAM算法,就是FastSLAM,该算法使用粒子滤波估计机器人的路径,我们都知道粒子滤波和众多基于参数化的滤波算法相比存在计算开销小和便于处理非线性模型的优势,基于FastSLAM的多个变种算法在机器人已经得到广泛的应用了,比如gmapping等等,由于篇幅限制就不展开了。
现今在机器人上使用最广泛的应该算激光SLAM了,在扫地机器人、服务机器人、AGV智能车上普遍搭载了单线激光雷达SLAM算法,像无人驾驶汽车、户外机器人则普遍搭载了多线激光雷达SLAM。另一种热门的研究是视觉SLAM,视觉SLAM有配备单目、双目、深度相机的多种形态,并且根据采用视觉特征点的区别还有直接法、半直接法、稀疏法之分。然后还有就是各种复合式的SLAM算法,比如激光与视觉融合的SLAM、融合了IMU的视觉SLAM。最后,就是一些最新颖的SLAM算法,比如用深度学习来做的端到端的SLAM、基于物体识别的语义SLAM。由于本文的重点不是SLAM综述,所以具体的算法性能比较就不展开了,有兴趣的朋友可以参阅相关SLAM综述文章。图1.1.16现今主流的SLAM算法
机器人用SLAM构建出了环境的地图,在已知了环境地图的情况下,可以用SLAM的重定位功能或者单独的基于已知地图的定位算法比如AMCL来进行机器人的定位。环境地图和机器人位姿都有了,就可以开始来做自主导航和避障了。机器人自主导航可以分成两个实现部分,第一个部分就是路径规划,第二个部分就是控制策略。路径规划利用地图信息寻找一条能到达目标的全局路径,全局路径在机器人导航过程中起到全局战略性的指导。理想情况是,机器人完全按照全局路径移动到目标,但是实际环境往往是多变和复杂的,而且机器人实际控制也会存在偏差,所以机器人的实际运动控制需要有一套控制策略来最终实现。控制策略需要尽量逼近全局路径、尽量远离障碍物、最快时间到达目标等因素,这些因素可以用一个回报函数来评价,寻找最佳控制策略的过程中递归的计算每一次行动的回报函数值。这样控制策略在回报函数的指引下,就可以给出最佳的控制策略,控制策略控制机器人完成实际的移动。图1.1.17 主流路径规划算法
大家一听到ROS机器人操作系统,就被操作系统几个字给吓到了。其实,ROS就是一个分布式的通信机制,帮助程序进程之间更方便的通信。搞懂了ROS的通信机制后,机器人的各种算法的开发还是基于我们常见的C++和Python的。图1.2.2 ROS网络通信的架构
SLAM最核心的地方在算法,侧重点在于如何构建出效果好的地图,并为机器人导航提供更好的数据保障。ROS帮忙解决传感器驱动、显示、各种核心算法间的沟通协调问题。如果做商用产品就另当别论了,商业的产品一般会专门开发自己的一套驱动、调度、显示的系统,或者拿ROS系统来裁剪以保障稳定性和效率。
图2.1.1 一个典型的ROS移动机器人的硬件构造这个就是一个典型的ROS移动机器人的硬件构造,由于篇幅限制,就不具体展开了,有兴趣的朋友可以去我的专栏阅读更详细的文章:SLAM导航+语音交互机器人DIY
为了增加学习动力,还是有必要了解下商业上都有什么具体的用途。这里就举几个有趣的例子吧。
当然也有很多做的很不错的机器人公司,也可以了解一下他们的最新动态。
最后谈一谈创业公司都是怎么来下手做机器人的,主要介绍两种发展思路:核心部件和系统集成。
就是集中力量研究机器人上的一项关键技术,比如激光雷达、底盘、SLAM导航主板方案。
及时自己本身没有特别的核心技术,购买各种别人的机器人零部件,然后自己集成成整机,主要精力是解决用户的实际应用场景的需求。
商业ROS机器人都是面向具体的产品落地,设计上考虑的是紧凑耦合和降低成本,最求软件的精简和稳定。
科研学习ROS机器人正是为了学习开发者而设计的,当然是硬件模块化设计,软件和硬件接口尽量开放出来。
(1)提供系统的开发和使用教程的重要性
(2)外形结构可扩展的重要性
(3)硬件模块化的重要性
(4)别太迷信软件开源
(5)技术支持的重要性
---------------分割线-----------------
激光SLAM入门视频,by Cyrill Stachniss
链接:https://http://pan.baidu.com/s/1gn2SG57Zgqo2f9jILOVn8g 密码:ax0qSLAM蓝宝书 《Probabilistic Robotics》 Sebastian Thrun et al. (2005)
《Robotic Mapping and exploration》Cyrill Stachniss
接下来建议结合一个激光SLAM的算法实例进行学习,比如GMapping、HectorSLAM。可以在http://www.openslam.org 找到相关的源码。Google开源的Cartographer,目前来看还是非常成熟和完善的激光SLAM系统,可以作为重点进行学习。
国内也已经有很多的社团有相关的教学视频出现。如泡泡机器人,高翔博士的博客和B章上有一些公开的免费课程也可以关注一下个人资源索引 - 半闲居士 - 博客园