连载文章,长期更新,欢迎关注:
大家如有任何技术问题,欢迎加入QQ技术群(117698356),进群一起交流讨论
试想一下如果人类拥有一个非常聪明的脑瓜子但却被限制在固定的地方不能移动,那么人与人之间的交流将很大程度地被阻断,人类的分工协作、社会生产、认识并改造自然的能力也将不复存在。可以说人类的躯体延展了人类的智能,特别是躯体的可移动性极大地扩展了人类智能的作用范围。
而互联网技术的普及是对人类智能的又一次延展,我们可以借助互联网巨大的信息存储以及检索能力来管理我们的知识(以前靠人脑维护这些知识则需要消耗掉我们很大一部分的心智),同时互联网提供的便捷交流渠道加速了人类认识并改造自然的进程。伴随着互联网技术而兴起的人工智能技术则是对人类智能的进一步延展,如果将传统互联网技术看成是信息存储、检索和传播的载体,那么人工智能技术则可以看成是对载体上的信息进行挖掘并应用新信息的一种工具。简单点说就是传统互联网技术本身并不生产信息而只是起到信息传播的作用,信息仍然由使用它的人产生;而人工智能技术则可以从人产生的信息中生成新信息,即机器能发掘出人不知道的一些知识经验。
如果拿上面人类的脑瓜子和躯体来作比喻,那么人工智能技术和机器人也相当于脑瓜子和躯体的关系。如果人工智能技术仅仅停留在虚拟的网络和数据之中,那么其挖掘并利用新知识的能力很难扩展开来。可以说机器人是人工智能技术应用能力的有效延展,特别是能自主移动的机器人极大地扩展了人工智能技术的应用范围。而SLAM导航技术正是当下实现机器人自主移动的热门研究领域,这也正是本书讨论内容的核心所在。
写作动力
上面已经说了,人类的躯体延展了人类的智能,互联网技术和人工智能技术则是对人类智能的又一次延展,而机器人又对人工智能技术进行了延展。这种延展性,是机器人对于人类的重要意义。通常可以将人类的社会活动归结为人适应自然环境并改造自然环境的过程,站在技术的角度讲就是人的社会活动是人与自然环境时时刻刻发生的交互行为的总和。机器人作为人类与自然环境发生交互行为的重要工具,机器人的行为当然也就要围绕与自然环境的交互而展开。机器人通过搭载的传感器对环境进行感知,即传感器是机器人系统的输入端;机器人通过搭载的执行机构与环境进行交互,即执行机构是机器人系统的输出端;决策作为机器人的中枢系统连接输入端和输出端,决策由低智能的认知层和高智能的逻辑推理层构成,常见的人脸识别、语音识别、机器人定位、机器人避障等都属于低智能的认知层,而复杂的逻辑推理在机器人中还很难实现。
虽然我们还没有彻底搞清楚人类智能的本质以及生命存在的意义这个终极哲学问题,但就目前取得的进展而言,人工智能技术和机器人无疑极大地增加了人与自然环境交互的可能性。让机器人成为人的第二躯体,能极大地延展人与自然环境交互的范围和速度。当从量变发展为质变时,就有可能让人类摆脱自身躯体的局限而取得跨越式的发展。而这样的机器人应该具备高度的自主性,让机器人实现完全自主化也就成了人类一直以来的梦想。所谓完全自主化,就是在没有外界指令的干预下,机器人能通过传感器和执行机构与环境自动发生交互,并完成特定的任务。比如,自主与人类发生语言和情感交流,自主识别、抓取和操控物体,自主移动等。完成这些特定任务的每一种底层技术都可以认为是机器人时代的一种基础设施,比如由语音识别、语音合成、自然语言理解等技术组成的语音交互基础设施,由目标识别、运动规划、行为决策等技术组成的物体抓取基础设施,由建图、定位、路径规划等组成的自主移动基础设施等。而将这些机器人的基础设施整合到一起时,机器人所能发挥的作用将具有巨大的想像空间。比如具有物体抓取能力的工业机械臂机器人在工业产线的应用极大地提高了工业生产的自动化程度,如果这种机械臂能自主移动的话,其未来的应用前景将更加广阔。由于我们生活在一个三维空间环境中,在环境空间中移动是机器人与环境发生交互最基本的形式之一,因此自主移动也被誉为机器人自主化的“圣杯”。到这里,应该就不难理解为什么要研究自主移动技术以及自主移动对于机器人的重要意义了吧。
自主移动实质上就是解决从地点A到地点B的问题,这个问题看似简单,实则非常复杂。当向机器人下达移动到地点B的命令后,机器人不免会问出3个颇具哲学性的问题,即“我在哪”、“我将到何处去”和“我该如何去”。经过近几十年来的研究,形成了一套有效解决机器人自主移动的方案,即SLAM导航方案。SLAM导航方案由建图(mapping)、定位(localization)和路径规划(path planning)3大基本问题组成,这3大问题互相重叠和嵌套又组成新的问题,也就是SLAM问题、导航问题、探索问题等。
SLAM用于解决建图和定位两个问题,也就是常说的同时定位与建图。对于单独的定位问题来说,是在已知全局地图的条件下,通过机器人传感器测量环境,利用测量信息与地图之间存在的关系求解机器人在地图中的位姿。而对于单独的建图问题来说,是在已知机器人全局位姿的条件下,通过机器人传感器测量环境,利用测量地图路标时刻的机器人位姿和测量距离与方位信息,很容易求解出观测到的地图路标点坐标值。定位问题的关键点是必须事先给定环境地图,比如分拣仓库中地面粘贴的二维码路标,就是人为提供给机器人的环境地图路标信息,机器人只需要识别二维码并进行简单推算就能求解出当前所处的位姿。而建图问题的关键点是必须事先给定机器人观测时刻的全局位姿,比如装载了GPS定位的测绘飞机,飞机由GPS提供全局定位信息,测量设备基于GPS定位信息完成对地形的测绘。很显然,这种建立在环境先验基础之上的定位和建图具有很大的局限性。将机器人放置到未知环境(比如火星探测车、地下岩洞作业等场景),前面这种上帝视角般的先验信息将不再存在,机器人将陷入一种进退两难的局面,即所谓的“先有鸡还是先有蛋”的问题。如果没有全局地图信息,机器人位姿将无法求解;没有机器人位姿,地图又将如何求解呢?于是将机器人位姿量与地图路标点作为统一的估计量进行整体状态估计,这是SLAM问题研究的起源。一般可将SLAM分为两个时期,即古典SLAM和现代SLAM。在古典SLAM时期,将机器人定位和建图问题转换成状态估计问题,在概率框架之中展开研究,然后利用扩展卡尔曼滤波(EKF)、粒子滤波(PF)等滤波方法来求解。而在现代SLAM时期,采用优化方法求解,优化方法的思路与滤波方法恰恰相反,它只是简单地累积获取到的信息,然后利用之前所有时刻累积到的全局性信息离线计算机器人的轨迹和路标点。按照状态估计量的不同,SLAM可以分为在线SLAM系统和完全SLAM系统两种;而按照状态估计求解方法的不同,SLAM又可以分为滤波法和优化法。基于滤波方法的在线SLAM系统的典型代表是EKF-SLAM,基于滤波方法的完全SLAM系统的典型代表是Fast-SLAM。而目前主流的SLAM系统大都属于基于优化方法的完全SLAM系统范畴,比如激光SLAM系统的典型代表Cartographer、视觉SLAM系统的典型代表ORB-SLAM、混合SLAM系统的典型代表VINS、基于深度学习的端到端SLAM以及语义SLAM等。
仅仅依靠SLAM技术所提供的建图和定位功能还无法实现机器人的自主移动,还需要将SLAM与导航算法以及人工规则等相结合,这种结合也就是所谓的SLAM导航。SLAM一方面为导航算法中的路径规划提供机器人定位信息,另一方面为导航算法提供可动态更新的全局地图。而导航算法主要解决序贯决策问题,包括障碍物度量、路径规划、运动控制等研究课题。虽然环境地图的表示方法有很多种(比如特征地图、点云地图、几何地图、栅格地图、拓扑地图等),但由于导航过程中需要避开障碍物,所以导航中一般采用栅格地图进行障碍物度量。路径规划其实就是在地图上寻找到一条从起点到目标点可行通路的问题,常见的路径规划算法有Dijkstra、A*、D*、PRM、RRT等。运动控制负责生成动作量实现执行器的最终操控,PID、MPC和强化学习是几种比较流行的运动控制算法。
由于SLAM和导航是两个相对独立的系统,通常SLAM在导航应用中有两种模式。第一种模式,SLAM先运行建图模式构建好环境地图后将地图保存,接着载入已保存的全局地图并启动SLAM重定位模式提供定位信息。第二种模式,SLAM直接运行在线建图模式,建图过程中直接提供地图和定位信息。后一种模式下的SLAM导航也称为环境探索,利用已有地图进行导航,然后导航控制机器人移动的过程又反过来更新了地图。
目前以SLAM导航技术为支撑的自主移动应用领域已经十分广泛了,涵盖航天、军事、特种作业、工业生产、智慧交通、消费娱乐等众多领域。航天领域的典型应用要属火星探测车,在遥远的星球上自主移动无疑是一项必备的技能。军事上借助自主移动的坦克、机器人士兵、飞机等,可以打一场无人化战争。在特种作业场合的自主移动机器人将发挥无可替代的作用,比如管道清洗、矿井作业、抢险救援、排爆、安防巡检、深海勘探等。农业上的应用,比如自主栽培、自主除草、自主施肥、自主采摘等。还有自动驾驶汽车、机器人终端物流配送、全自动化工厂、机器人智慧养老、机器人餐厅、家庭服务机器人等。总之,就是去替代人类的各种体力活。室内场合的自主移动应用主要以单线激光雷达、传感器融合、工作环境限定等为技术路线,然后以视觉里程计、语义地图、人工路标等为辅助。室外自主移动应用主要有两大技术路线,一条是以多线激光雷达结合城市高精三维地图的技术路线,另一条是以视觉避障结合人工智能算法、边缘计算、云端大数据等的技术路线。而仿生则是一个不可忽视的前沿方向,比如移动方式的仿生和导航仿生。最近很热的四足机器狗就属于移动方式的仿生,这其实是对移动能力的提升,因为腿足移动方式比轮式移动方式能适应更多地形环境。基于老鼠大脑导航细胞的模型,可以建立能直接存储机器人环境空间、视觉、时间、行为等信息的仿生导航细胞网络模型,这是导航仿生的一个典型代表。
虽然SLAM导航技术在许多方面取得了突破,但其仍处于发展阶段且尚未真正落地。这就需要有更多的人参与到这项庞大且深奥的项目中来,以加快技术突破和产品落地的速度。而机器人是多专业知识交叉的学科,通常涉及到传感器、驱动程序、多机通信、机械结构、算法等众多领域。很多初学者在学习完ROS之后,就不知道下一步该干什么了。而对于搞嵌入式及传感器的底层开发者来说,对ROS上层及算法层面软件的具体工作原理又非常困惑,常常有了解的好奇心但却无从下手。对于专门研究SLAM算法或导航算法的研究人员,他们往往专注于算法层面的某个很细分的领域,一般比较缺乏全局性的工程思维,至于将某项研究成果部署到实际的机器人上落地运行难度就更大了。这就导致各个领域的研究开发人员都在自己熟悉的领域内闭门造车,而缺乏领域之外的必要交流与实践。软件层面的开发者由于缺乏对机器人传感器、机器人主机和机器人底盘的系统性认识,往往在软件性能优化过程中涉及到软硬件深度优化方面的问题时就束手无策了。而硬件层面的开发者由于缺乏软件方面的必备基础,经常在理解软件层需求时出现偏差。由于缺乏相关的数学理论体系,ROS及硬件相关领域的开发人员大多只能充当调参侠,对SLAM导航方面的算法很难有实质性的改善。由于缺乏工程思维和实践经验,SLAM算法或导航算法方面的研究人员则很难将研究成果落地到实际机器人,甚至SLAM算法研究人员与导航算法研人员也存在不小的交流障碍。
可以说机器人SLAM导航是一个软硬件相结合,理论加实战的浩大工程性问题。而目前各领域之间还存在很大的交流屏障,这无疑成了机器人SLAM导航技术突破与落地的突出痛点。我由此萌生出了写这样一本并兼理论性和实践性的系统化归纳整理的书籍的想法,希望通过这样一本书将机器人SLAM导航中的软件技术、硬件技术、数学理论、工程落地等一些列问题一起打通。当时敢有这样一个宏大的想法也与我自身的经历密不可分,下面是我的一个学习成长经历。
在上初中时,我第一次接触到了计算机。那个时候的计算机使用的还是那种大脑袋的显像管显示器,微机课老师教我们如何开关机、使用Word编辑文档、使用搜索引擎搜索感兴趣的东西。当时对计算机这个新事物充满了好奇,苦苦思索着一个小小的显示屏幕里面为何尽藏着如此巨大的魔力。在上高中时,我又接触到了VB编程。那时老师教我们用VB语言编写一个捉弄人的程序,大致效果就是在桌面显示一个输入框,输入一些字符后会继续弹出一个对话框或者别的动作,老师让我们按照这个思路编写出自己的程序。有同学写出的效果是无论输入什么字符窗口都会无限弹下去;有同学写出了一个信息录入效果,就是先让你输入“我是xxx”,然后立马弹出一个显示“xxx是小狗”的窗口;我还记得我写出来的是一个随机触发关机的程序,就是先让你输入一段字符,然后弹出一个倒计时关机的对话框,实际第一次不会关机,第二次同样的操作后就会真正触发关机。老师让我们把程序写好后请同桌来使用,当我的同桌点击了我写的程序并按照步骤操作后突然屏幕就黑了,我的那个同桌当时露出了惊恐的表情,而我却在旁边乐个不停。就在那个时候,我被计算机程序所迸发出来的无穷魅力所深深吸引,也为我今后正真踏入这扇大门埋下了一颗种子。而在上大学时,我接触到了51单片机,于是这颗种子发芽了。由于大一新生被安排在郊外的新校区就读,那时除了上课能打发时间外,业余时间十分无聊,于是我们有大概五六个同学就开始到一个叫电子协会的学校社团内定期开展活动。其中有个大神级的同学在高中时学习过51单片机,社团活动就是跟着这个大神学习51单片机。当时的学习氛围非常浓厚,没多久我们就学会了用51单片机点亮LED灯、控制电机转动、控制喇叭发出声音等有趣的小实验。51单片机刷新了我对计算机的认知,计算机除了可以用来完成检索信息、编辑文档、打游戏、看电影等事情之外,原来还可以用来做控制,夸张点说可以用来控制一切你想控制的东西。从51单片机为切入点,随着学习的深入又逐步接触到了STM32、ARM-Linux嵌入式系统、FPGA、模拟电路、数字电路、PCB设计等方面的知识。从逻辑门电路构建出中央处理器芯片,从芯片到指令集,从指令集到软件编译器,从软件编译器到C、C++、Java、Python等编程语言,从编程语言到RTOS、Linux等操作系统,从操作系统到形形色色的软件应用产品(比如Web、聊天软件、文档编辑软件、影音播放器等),总算刨根问底式地彻底搞懂了计算机的整个工作原理,解开了我第一次接触计算机时那个大大的疑惑。当时除了学习这些工程技术方面的知识外,还学了一大堆看似没有用处的数学理论(比如微积分、线性代数、概率论、复变函数与积分变换、数学物理方程、信号与线性系统、随机过程、信息论、自动控制原理、通信原理、数论、矩阵论等),现在我以一个SLAM研究开发人员的视角回头再来看这些数学理论时,发现它们简直太有用了。由于我们通过电子协会而开展的一系列科技创新方面的社团活动在全校师生中得到了广泛的传播与关注,我们中的一些积极份子被学校选中,然后组建成专门的团队用以参加国内外的学科竞赛、创业创新大赛、科技节等活动。此后我们得到了学校给予的资金、场地、人员等方面的大量支持,在这段宝贵的时光里个人能力得到了突飞猛进的提升。我了应对即将参加的学科竞赛之需,我学习和调研了大量的前沿技术,其中就包括计算机视觉、ROS、SLAM、惯性导航、PID控制、神经网络、深度学习等内容。那时候的ROS、SLAM、深度学习这些概念可真算得上是个稀奇玩意,只能隐隐约约从国外的论坛上看到一些简短的介绍,国内知道的人就更加稀少了。调研归调研,作为一个学生直接上来就搞这些前沿的东西肯定不现实,于是制作一台能靠红外和超声波智能避障的小车就成了我们第一个练手的项目。自从做了这台相当简单的智能避障小车之后,我就迷上了这种靠计算机控制来自主移动的东西,虽然其中的自主化程度还相当低。由于种种原因,生物识别、卫星导航、机器人求解魔方等陆续成了我们的参赛课题,而没有选机器人自主导航方面的课题。虽然通过大大小小的比赛我们收获了很多的奖项,但现在已经很难记清当时所使用的具体技术和编写的具体代码是怎么的了,而从中学到的团队协作精神、工程化思维以及项目管理能力却成了我一生中宝贵的财富。
正是由于学生时代对那个智能避障小车的迷恋,我选择了从事机器人相关的工作,并在工作中对之前有所了解的ROS、SLAM、深度学习等知识进行了系统性学习。在工作期间养成了撰写博客的习惯,以笔名“小虎哥哥爱学习”在知乎上撰写专栏文章以及在B站上发布相关视频教程。还记得那个时候国内的ROS、SLAM、深度学习方面的研究还处于起步阶段,中文资料非常少,我在发表了几篇博客后,就收到了很多网友的回复,有的说我写的东西正好解开了自己的心头疑惑,有的感慨说后悔没有早点阅读到我的文章,他们的鼓励让我更加坚定了自己的研究方向并下定决心写成更多的好文章。另外不得不感谢机器人研究院宽松自由的学术氛围,让我拥有了更多属于自己的时间来对感兴趣的SLAM导航技术的细分领域进行独立深入的研究,这也是我后来在SLAM导航上能不断获取新的认知与实践的动力源泉。
由于工作中参加了大量机器人方面的展会、实地研讨、学术交流等活动,从而接触到了大量的潜在客户以及客户的需求与痛点。随后便创办了公司,开启了创业之旅。创业除了需要专业技术方面的知识,还涉及管理、经济学、商业模式、销售、运营等领域的常识。为了弥补技术以外的短板,我如饥似渴地阅读了大量的相关书籍,其中就包括《精益创业》、《增长黑客》、《上瘾》、《敏捷开发》、《口碑营销》、《创新与企业家精神》等。从中汲取了大量有关用户体验、需求分析、产品设计、商业模式、项目管理等方面的养分,为我在创业实践中提供了有效的指引,并帮我规避掉了大量的误区和陷阱。在求学和工作期间,我是在不断攀登技术高点,而创业后则是从技术高点逐步向下探索落地。这样一上一下的经历,让我对整个行业有了更深的认识。
正是由于拥有这样一番经历,加之SLAM导航领域存在的软件技术、硬件技术、数学理论、工程落地等一系列技术亟待打通的痛点,于是我鼓起勇气起笔开始书写《机器人SLAM导航:核心技术与实战》这本书。历经两年多的艰苦创作,这本书终于要完稿了。我的心情既激动又平静,激动是因为不敢相信自己能完成从前想都不敢想的写书这样一件事情;平静是因为随着了解到的知识的逐渐深入,对知识本身多了一份敬畏,对学术研究的态度变得更加谦逊了。最开始写这本书的时候,想法其实比较简单。当时自以为对机器人SLAM导航技术很了解,有着强烈的欲望想将自己所理解的知识和经验分享给更多有需要的人,提升整个行业的认识水平,为机器人SLAM导航技术的产品尽快落地贡献一份力量。但是随着写作的逐步深入,发现以前的很多理解存在不少的偏差和局限。这不得不逼着我去重新学习一些更深更广的内容,不断进行自我认知的革新。直到写完最后一章回头望时,发现已经超越从前的自己很多很多了。也希望大家能以这样的心态去学习本书,不断进行自我革新,等你学完整本书再回首时一定能发现一个全新的自己。
特色内容
本书一大亮点是对SLAM理论体系做到了深入浅出的分析,在1~6章的铺垫完成后,第7章对SLAM理论做了总结性讨论,其作为SLAM讨论的开篇章节在内容安排上详略得当,有利于读者快速地理清学习思路。而更深层的SLAM理论知识则放在后续具体SLAM系统中详细展开讨论,结合实例的好处是能大大降低深奥理论知识的理解难度。比如在第8章所讨论的激光SLAM系统中对Gmapping的RBPF粒子滤波和Cartographer闭环搜索中所涉及的分支界定法进行了比较详细的分析;在第9章所讨论的视觉SLAM系统中对特征点法的重投影误差、直接法的光度误差、半直接法、三维空间刚体运动涉及的基础知识(包括欧拉角、旋转矩阵、四元数、李群李代数等)、多视图几何涉及的基础知识(包括对极几何、三角化重建、DLT、PnP、ICP、BA、SVD等)、视觉词袋模型等内容进行了比较详细的分析;在第10章所讨论的其他SLAM系统中对VIO所涉及的传感器联合标定、松紧耦合、预积分等内容进行了比较详细的分析。
本书的第二大亮点是将SLAM与导航两大研究领域有机的串接起来了,目前市面上的大部分相关书籍都只侧重于讨论SLAM问题而很少谈及导航问题。其实对自主移动机器人来说,SLAM技术只相当于给机器人提供了一条腿,而另一条腿则是导航技术。由于本书靠前章节对机器人硬件、系统、SLAM理论及具体算法实现做了大量铺垫,这就为在导航章节中对SLAM与导航相结合的内容进行讨论提供了土壤,这是其他同类书籍所不能及的。
本书的第三大亮点是对机器学习所涉及的理论基础进行了全面的介绍,特别是对与SLAM前沿方向密切相关的深度学习(包括统计学习、误差反向传播、CNN、RNN等)和与自主导航前沿方向密切相关的强化学习(包括马尔可夫决策过程、贝尔曼方程、动态规划、蒙特卡洛、时间差分、价值函数逼近、策略搜索、用于大规模自主导航控制的自动强化学习AutoRL等)进行了深入地对比分析。深度学习和强化学习理论知识的讲解为本书学习者后续的持续研究提供了广阔的想像空间,为机器人实现强人工智能提供了技术路线的参考。
学习对象
这本书的定位是普及SLAM导航理论原理并且引导读者在实际机器人上进行部署,这也正是书名中所包含的“核心技术与实战”几个字的用意所在。目前机器人SLAM导航的一大痛点正是理论与实战相结合的缺乏。SLAM导航技术严格上来说是一个浩大的工程性问题,虽然SLAM导航理论方面的研究人员已经很多了,但他们大都只专注于具体的一些技术,而SLAM导航问题的突破不是靠单个技术的突破能解决的。而学生或工程师大都只会调用ROS里面的现成算法包以及简单地调调参数,他们缺乏对理论原理的深入理解。想要将SLAM导航的理论与工程问题打通、想要让自主移动技术尽快走出实验室、想全盘了解移动机器人这个领域、对机器人智能产业感兴趣的广大人群等都可以阅读本书。可以说本书所适合的读者范围极为广泛,如下:
- SLAM导航领域的本科生或研究生
- 从事自主移动机器人或者无人驾驶方面工作的开发人员
- 智能机器人方面的创业者、市场调研人员、产品经理等
- 想要从传统的Android、Java、嵌入式、ROS等岗位转型升级到机器人算法岗位的开发者
- 从事机械设计、机器人底盘研发、AGV算法升级等方面工作的开发人员
- 对无人驾驶、送餐机器人、服务机器人、物流机器人、智慧农业、智慧工厂、智慧养老等感谢兴趣的广大消费者
学习窍门
本书分为编程基础、硬件基础、SLAM以及自主导航这四大部分,正文共计13个章节。
第一部分为编程基础篇,包含第1~3章的内容。带领大家了解ROS的核心概念、大型C++工程的代码组织方式以及图像处理方面的基础知识,为后续学习打好必要的编程基础。
第1章,讨论ROS入门必备知识。由于本书中机器人SLAM导航算法和实战案例的编码都基于ROS框架,所以需要大家首先了解ROS的核心概念并熟练使用ROS进行编程开发。考虑到ROS官方Wiki文档的详尽,这里就将讨论的重心放在了ROS系统架构、调试工具以及节点通信这些核心概念上,便于新手快速掌握学习要领。至于ROS的更多技术细节,可以在后续接触到实际项目时慢慢熟悉。
第2章,讨论C++编程范式。整本书所涉及的代码基本都采用C++编码,而且后面SLAM算法和导航都是C++的大型项目。对于初学者来说,不懂C++编译和编码方面的规范知识,很难一下子快速入手这些大型C++项目。因此这里介绍了ROS代码的C++底层代码组织方式,以及程序框架的设计思路(也就是CMake方面的内容),为后面讲具体SLAM代码或导航代码这种大型程序框架做好预备。不管大家之前有没有学过C++编程方面的基础知识(特别是大型C++项目的基础知识),花一点点时间快速通读本章内容将对后续章节的源码解读非常有帮助。
第3章,讨论OpenCV图像处理。这里从认识图像数据、图像滤波、图像变换和图像特征点提取逐步对OpenCV图像处理的知识进行了讨论,其中需要重点掌握图像特征点提取中的SIFT、SURF和ORB三种特征点。由于本书后续视觉SLAM相关章节中大量使用了OpenCV库,因此本章先高屋建瓴让大家对OpenCV有一个整体的把握,以便于大家后续能对涉及OpenCV的算法进行优化改进。
第二部分为硬件基础篇,包含第4~6章的内容。通过对机器人传感器、机器人主机和机器人底盘的讨论,能帮助缺少硬件基础的开发者对机器人的硬件有一个系统的认识并更好地理解软件与硬件之间的协同关系。机器人传感器相当于机器人的眼耳口鼻,机器人主机则相当于机器人的大脑,而机器人底盘则是集成传感器和主机的躯干。
第4章,讨论机器人传感器。这里对SLAMD导航中会用到的4种关键传感器(IMU、激光雷达、相机和带编码器的减速电机)的原理及在ROS中的使用方法进行了讨论。其中与IMU数据融合相关的卡尔曼滤波和互补滤波算法是需要重点掌握的内容,因为IMU在整个机器人中扮演着非常核心的角色,IMU可以跟轮式里程计、相机、激光雷达等多种传感器进行融合并发挥出巨大的作用。另外
IMU、激光雷达、相机和轮式里程计的数据校正也是需要重点掌握的内容,因为各传感器测量数据的可靠性是后续算法正确运行的前提保障。
第5章,讨论机器人主机。本书讨论范畴下的机器人主机是一个能搭载ROS系统的计算机,这里以时下较流行的三款主机(树莓派3B+、RK3399和Jetson-tx2)为例对主机系统安装、ROS安装以及系统常用配置等内容进行了讲解,以帮助大家快速搭建起机器人的开发环境。
第6章,讨论机器人底盘。底盘是机器人传感器和机器人主机的载体,主要分为轮式底盘和足式底盘。这里主要对轮式底盘进行讨论,讨论涵盖底盘运动学模型、底盘性能指标和典型机器人底盘搭建等内容。通过本章的学习,很容易就能搭建出自己的移动底盘,并用于后续SLAM导航学习之中。
第三部分为SLAM篇,包括第7~10章的内容。经过上面编程基础篇和硬件基础篇打下的必要基础后,再来讨论SLAM问题就更加容易理解了。首先通过总结的方式完整介绍整个SLAM的理论体系知识,接着以各个具体的SLAM系统实现为例进一步介绍SLAM算法的代码框架以及核心算法细节实现。
第7章,讨论SLAM中的数学基础。这里首先对SLAM发展历史进行了回顾,并给出了学习动向图,帮助读者快速把握学习的整体脉络。然后讨论了SLAM中所涉及到的最基础概率理论,包括概率运动模型、概率观测模型以及将运动与观测联系在一起的概率图模型。根据概率图模型中的贝叶斯网络和因子图两类表示方法,将引出滤波方法和优化方法两大SLAM求解方法。为了将SLAM问题的来龙去脉讲清楚,我在写作本章时花费了大量时间研究整理这些基础理论及其内在的联系,并根据SLAM讨论的需要对各种符号和概念尽量做到统一性地表述。虽然这些年SLAM研究取得了无数举世瞩目的成果,但是国内的研究状态还处于起步阶段,相关专业学习资料很少,并兼理论性和实践性的系统化归纳整理资料就更少了。为了帮助国内的广大学习者更深入地理解SLAM技术,本章对SLAM数学理论进行了系统性梳理,通过对SLAM数学理论发展演进过程的介绍,帮助广大学习者把握SLAM技术背后的本质。想要学好SLAM,需要在全局性把握理论本质的基础上,将具体的SLAM实现算法在机器人本体上用起来。单纯地学习理论知识,或单纯地跑跑SLAM实现算法,都无法达到融会贯通的效果,更不用说依据实际需求修改完善开源SLAM代码或编写自己的SLAM代码了,这也正是接下来的章节要着力介绍各种具体SLAM系统实现的原因所在。本章是整本书最核心的章节,涉及到的很多数学理论对于初学者来说确实难理解,但是大家要克服畏难情绪,可以在学习完整本书后,回头再来看之前一些不懂的地方。
第8章,讨论激光SLAM系统。这里介绍了3种流行的激光SLAM系统实现,即Gmapping、Cartographer和LOAM。Gmapping是ROS中最经典的基于粒子滤波的算法,缺点是无法构建大规模的地图。而Cartographer是时下非常流行的基于优化的算法,可以构建大规模的地图,并且Cartographer算法在工程应用上的价值非常高。不管是Gmapping还是Cartographer,都只能在室内环境构建2D地图,LOAM是一种用在室外环境的激光SLAM算法,该算法利用多线激光雷达,能构建出3D点云地图。
第9章,讨论视觉SLAM系统。激光雷达的优点在于数据稳定性好、测距精度高、扫描范围广,但缺点是价格昂贵、数据信息量低、安装部署位置不能有遮挡、雨天烟雾等环境容易失效;视觉传感器价格便宜许多、所采集到的图像数据信息量更高、室内室外场景都能适用并且雨天烟雾场景影响较小,这些正是本章所讨论的视觉SLAM所具有的巨大价值。这里按照视觉SLAM的特征点法、直接法和半直接法的分类原则,对ORB-SLAM2、LSD-SLAM和SVO这样3种相应的代表性系统实现进行
了介绍。
第10章,讨论其他SLAM系统。除了上面讲到的激光SLAM和视觉SLAM这两大主流SLAM系统外,还有其他一些SLAM方案也备受关注。比如将激光与视觉融合的SLAM、视觉和IMU融合的SLAM、基于深度学习的端到端SLAM、基于模式识别的语义SLAM等,这些内容在本章进行讨论。
第四部分为自主导航篇,包括第11~13章的内容。通过上述章节的学习,相信大家对机器人的软硬件构造以及SLAM原理有了基本的了解。,基于此再来讨论自主导航算法及其具体应用就顺理成章了。首先通过总结的方式完整介绍整个自主导航的理论体系知识,接着以各个具体的自主导航系统实现为例进一步介绍自主导航算法的代码框架以及核心算法细节实现,最后以一个真实机器人为案例教给大家应用SLAM导航技术进行开发的完整流程。学完本书的全部内容后,相信大家已经具备继续进行SLAM导航技术的独立研究和开发的能力了吧。
第11章,讨论自主导航中的数学基础。这里首先对自主导航发展历史进行了回顾,并给出了自主导航问题的本质,即“我在哪”、“我将到何处去”和“我该如何去”。然后通过讨论环境感知、路径规划和运动控制这几个核心技术,以帮助大家理清自主导航中的数学基础知识。
第12章,讨论典型自主导航系统。这里介绍了3种流行的自主导航系统实现,即ros-navigation、riskrrt和autoware。通过代码讲解帮助大家更深入地理解机器人自主导航的工作原理,以便于大家日后能根据实际需求修改和完善开源导航代码。
第13章,讨论机器人SLAM导航综合实战。这里用一个真实机器人SLAM导航案例来回顾前面所有章节的内容,并帮助大家建立起今后能继续进行SLAM导航方面独立研究和开发的能力。
另外还要和大家解释一下书中所出现的大量数学公式的原因,就像一门外语或计算机编程语言一样,数学公式也是一门表述问题的语言工具。因为有些专业性的问题用数学公式这种语言表述更严谨且方便,所以数学公式的重要作用是表述一些抽象概念,所以大家在阅读本书时大可不必拘泥于数学公式中的各种奇怪符号。
源码仓库
-
Gitee下载(国内访问速度快):gitee.com/xiihoo-robot/Books_Robot_SLAM_Navigation