《机器人SLAM导航核心技术与实战》前言
《机器人SLAM导航核心技术与实战》前言
温馨提示:
本篇文章是我最新出版的书籍《机器人SLAM导航核心技术与实战》的前言部分,感兴趣的读者可以购买纸质书籍来进行更加深入和系统性的学习,购买链接如下:
互联网和人工智能技术可以看成是对人类大脑的进一步延展,而机器人技术则可以看成是对人类躯体的进一步延展。如果人工智能技术仅仅停留在虚拟的网络和数据之中,那么其挖掘并利用新知识的能力将很难扩展开来。可以说,机器人是人工智能技术应用能力的有效延展,而能自主移动的机器人更是极大地拓展了人工智能技术的应用范围。SLAM导航技术正是当下实现机器人自主移动的热门研究领域,也是本书内容的核心所在。
为什么写这本书
帮助机器人实现完全自主化的每一种底层技术无疑将成为“机器人时代”的基础设施,其中的自主移动技术在当下备受瞩目,其实质就是解决从地点A到地点B的问题。这个问题看似简单,实则非常复杂。当向机器人下达移动到地点B的命令后,机器人不免会问出三个颇具哲学性的问题,即“我在哪”“我将到何处去”和“我该如何去”。经过近几十年来的研究,业界形成了一套有效解决机器人自主移动的方案,即SLAM导航方案。
目前以SLAM导航技术为支撑的自主移动应用已经十分广泛,涵盖航天、军事、特种作业、工业生产、智慧交通、消费娱乐等众多领域。典型应用包括火星探测车、军事机器人、特种作业机器人、农业领域机器人、自动驾驶汽车、终端物流配送机器人、机器人智慧养老、机器人餐厅、家庭服务机器人等。
虽然SLAM导航技术在许多方面取得了突破,但其仍处于发展阶段且尚未真正落地。这就需要有更多的人参与到这个庞大且深奥的项目中来,以加快技术突破和产品落地的速度。而机器人是多专业知识交叉的学科,通常涉及传感器、驱动程序、多机通信、机械结构、算法等众多领域。这就导致各个领域的研究、开发人员都在自己熟悉的领域内“闭门造车”,缺乏领域之间的必要交流与实践。软件层面的开发者由于缺乏对机器人传感器、机器人主机和机器人底盘的系统性认识,因此往往会在涉及软硬件深度优化方面的问题时束手无策。而硬件层面的开发者由于缺乏软件方面的必备基础,因此经常会在理解软件层需求时出现偏差。由于缺乏相关的数学理论体系,因此ROS及硬件相关领域的开发人员大多只能充当“调参侠”,很难对SLAM导航方面的算法提出实质性的改善建议。缺乏工程思维和实践经验,SLAM算法或导航算法方面的研究人员则很难将研究成果真正落地。
可以说,机器人SLAM导航是一个软硬件相结合、理论加实战的浩大工程性问题。而目前各领域之间还存在很大的交流屏障,这无疑成了机器人SLAM导航技术突破与落地的突出痛点。我由此萌生了写一本兼具理论性和实践性的系统化图书的想法,希望通过这样一本书将机器人SLAM导航中的软件技术、硬件技术、数学理论、工程落地等一系列问题打通。
历经两年多的艰苦创作,这本书终于要完稿了。最开始写这本书的时候,想法其实比较简单。当时自以为对机器人SLAM导航技术很了解,因而有着强烈的欲望想将自己所理解的知识和经验分享给更多有需要的人,为机器人SLAM导航技术的普及与产品落地贡献一份力量。但随着写作的逐步深入,我发现以前的很多理解存在不少偏差和局限,所以这倒逼着自己不断去学习更深层的知识,不断进行自我认知革新。直到写完最后一章回头望时,我发现自己已经超越从前的自己很多很多了。希望大家也能以这样的心态去学习本书,不断进行自我革新,等你学完整本书再回首时一定能发现一个全新的自己。
本书特色
本书的第一大亮点是对SLAM理论体系做了深入浅出的分析。本书先对SLAM理论做了总结性讨论,这作为SLAM讨论的开篇章节有利于读者快速理清学习思路;而更深层的SLAM理论知识则放在后续具体SLAM系统中详细展开讨论,结合实例进行讲解,这样的好处是能大大降低深奥理论知识的理解难度。
本书的第二大亮点是将SLAM与导航两大研究领域有机地串接起来。目前很多资料只侧重于讨论SLAM问题,而很少谈及导航问题。其实对自主移动机器人来说,SLAM技术只相当于给机器人提供了一条腿,而另一条腿则是导航技术。由于本书前几章对机器人硬件、系统、SLAM理论及具体算法实现做了大量铺垫,这就为SLAM与导航相结合内容的讨论提供了土壤。
本书的第三大亮点是对机器学习所涉及的理论基础进行了全面介绍,特别是对与SLAM前沿方向密切相关的深度学习及与自主导航前沿方向密切相关的强化学习进行了深入对比分析。深度学习和强化学习理论知识的讲解为本书学习者后续的持续研究提供了广阔的想象空间,为机器人实现强人工智能提供了技术路线的参考。
读者对象
本书适合的读者范围极为广泛,主要包括:
- 从事自主移动机器人或者无人驾驶方面工作的开发人员;
- 智能机器人方面的市场调研人员、产品经理等;
- 想要转型到机器人算法岗位的开发者;
- SLAM导航领域的本科生或研究生;
- 从事机械设计、机器人底盘研发、AGV算法升级等方面工作的开发人员;
- 对SLAM导航感兴趣的爱好者。
如何阅读本书
本书分为四篇,共13章。
编程基础篇(第1~3章)。本篇带领大家了解ROS的核心概念、大型C++工程的代码组织方式以及图像处理方面的基础知识,为后续学习打好必要的编程基础。
硬件基础篇(第4~6章)。本篇通过对机器人传感器、机器人主机和机器人底盘的讨论,让缺少硬件基础的开发者对机器人的硬件有一个系统的认识并更好地理解软件与硬件之间的协同关系。机器人传感器相当于机器人的眼耳口鼻,机器人主机相当于机器人的大脑,而机器人底盘则相当于集成传感器和主机的躯干。
SLAM篇(第7~10章)。本篇首先总结式地介绍整个SLAM的理论知识体系,接着以各个具体的SLAM系统实现为例进一步介绍SLAM算法的代码框架及核心算法的实现细节。
自主导航篇(第11~13章)。本篇首先给出整个自主导航的理论体系知识的总结,接着以各个具体的自主导航系统实现为例进一步介绍自主导航算法的代码框架以及核心算法的细节实现,最后以一个真实机器人为例介绍应用SLAM导航技术进行开发的完整流程。学完本书的全部内容后,相信大家能够继续进行SLAM导航技术的独立研究和开发。
勘误与支持
由于本人水平有限,因此书中难免会出现一些错误或者表述不严谨的地方,恳请读者朋友批评指正,你可以发邮件到我的邮箱(robot4xiihoo@163.com)或者添加我的个人微信号(xiaohugege277)来与我联系。另外,我还为本书制作了配套的课件文档和教学视频,大家可以关注我的知乎账号(@小虎哥哥爱学习)获取最新课件文档,或者关注我的bilibili账号(@小虎哥哥爱学习)获取最新教学视频。大家还可以前往GitHub仓库(https://github.com/xiihoo/Books_Robot_SLAM_Navigation)下载本书相关实验代码以及课后习题答案。同时大家也可以加入QQ技术交流群(728661815)参与本书的话题讨论,或者前往网站(http://www.xiihoo.com)获取机器人SLAM导航方面的更多相关资料。
致谢
感谢机械工业出版社华章公司的高婧雅编辑在写作方面给予我的细心指导;感谢清华大学的高翔博士为本书作序;感谢亮风台首席架构师侯晓辉、海军工程大学吴中红老师、香港大学博士生王斯煜对本书进行审阅并给予高度评价;感谢广大网友在本书写作过程中提供的众多宝贵建议;感谢在本书写作过程中给予我极大鼓励与关怀的亲朋好友。
最后,希望这本书能陪伴大家走过一段难忘的学习之旅,并收获一份珍贵的成长经历。星辰大海,如你所见,如你所愿。
参考文献
[1] 张虎,机器人SLAM导航核心技术与实战[M]. 机械工业出版社,2022.
购书链接:https://item.jd.com/13041503.html
QQ技术讨论群: 117698356
B站视频教程:https://space.bilibili.com/66815220
Github源码:https://github.com/xiihoo/Books_Robot_SLAM_Navigation
Gitee源码(国内访问速度快):https://gitee.com/xiihoo-robot/Books_Robot_SLAM_Navigation
![](https://pic2.zhimg.com/80/v2-a56c7316ca399840a5d84b310eef81d9_720w.jpg)
![](https://pic2.zhimg.com/80/v2-8bfa1adb791a689cca6b168ebb0e7791_720w.jpg)
序
前言
编程基础篇
第1章 ROS入门必备知识
1.1 ROS简介 2
1.1.1 ROS的性能特色 2
1.1.2 ROS的发行版本 3
1.1.3 ROS的学习方法 3
1.2 ROS开发环境的搭建 3
1.2.1 ROS的安装 4
1.2.2 ROS文件的组织方式 4
1.2.3 ROS网络通信配置 5
1.2.4 集成开发工具 5
1.3 ROS系统架构 5
1.3.1 从计算图视角理解ROS架构 6
1.3.2 从文件系统视角理解ROS架构 7
1.3.3 从开源社区视角理解ROS架构 8
1.4 ROS调试工具 8
1.4.1 命令行工具 9
1.4.2 可视化工具 9
1.5 ROS节点通信 10
1.5.1 话题通信方式 12
1.5.2 服务通信方式 15
1.5.3 动作通信方式 19
1.6 ROS的其他重要概念 25
1.7 ROS 2.0展望 28
1.8 本章小结 28
第2章 C++编程范式
2.1 C++工程的组织结构 29
2.1.1 C++工程的一般组织结构 29
2.1.2 C++工程在机器人中的组织结构 29
2.2 C++代码的编译方法 30
2.2.1 使用g++编译代码 31
2.2.2 使用make编译代码 32
2.2.3 使用CMake编译代码 32
2.3 C++编程风格指南 33
2.4 本章小结 34
第3章 OpenCV图像处理
3.1 认识图像数据 35
3.1.1 获取图像数据 35
3.1.2 访问图像数据 36
3.2 图像滤波 37
3.2.1 线性滤波 37
3.2.2 非线性滤波 38
3.2.3 形态学滤波 39
3.3 图像变换 40
3.3.1 射影变换 40
3.3.2 霍夫变换 42
3.3.3 边缘检测 42
3.3.4 直方图均衡 43
3.4 图像特征点提取 44
3.4.1 SIFT特征点 44
3.4.2 SURF特征点 50
3.4.3 ORB特征点 52
3.5 本章小结 54
硬件基础篇
第4章 机器人传感器
4.1 惯性测量单元 56
4.1.1 工作原理 56
4.1.2 原始数据采集 60
4.1.3 参数标定 65
4.1.4 数据滤波 73
4.1.5 姿态融合 75
4.2 激光雷达 91
4.2.1 工作原理 92
4.2.2 性能参数 94
4.2.3 数据处理 96
4.3 相机 100
4.3.1 单目相机 101
4.3.2 双目相机 107
4.3.3 RGB-D相机 109
4.4 带编码器的减速电机 111
4.4.1 电机 111
4.4.2 电机驱动电路 112
4.4.3 电机控制主板 113
4.4.4 轮式里程计 117
4.5 本章小结 118
第5章 机器人主机
5.1 X86与ARM主机对比 119
5.2 ARM主机树莓派3B+ 120
5.2.1 安装Ubuntu MATE 18.04 120
5.2.2 安装ROS melodic 122
5.2.3 装机软件与系统设置 122
5.3 ARM主机RK3399 127
5.4 ARM主机Jetson-tx2 128
5.5 分布式架构主机 129
5.5.1 ROS网络通信 130
5.5.2 机器人程序的远程开发 130
5.6 本章小结 131
第6章 机器人底盘
6.1 底盘运动学模型 132
6.1.1 两轮差速模型 132
6.1.2 四轮差速模型 136
6.1.3 阿克曼模型 140
6.1.4 全向模型 144
6.1.5 其他模型 148
6.2 底盘性能指标 148
6.2.1 载重能力 148
6.2.2 动力性能 148
6.2.3 控制精度 150
6.2.4 里程计精度 150
6.3 典型机器人底盘搭建 151
6.3.1 底盘运动学模型选择 152
6.3.2 传感器选择 152
6.3.3 主机选择 153
6.4 本章小结 155
SLAM篇
第7章 SLAM中的数学基础
7.1 SLAM发展简史 158
7.1.1 数据关联、收敛和一致性 160
7.1.2 SLAM的基本理论 161
7.2 SLAM中的概率理论 163
7.2.1 状态估计问题 164
7.2.2 概率运动模型 166
7.2.3 概率观测模型 171
7.2.4 概率图模型 173
7.3 估计理论 182
7.3.1 估计量的性质 182
7.3.2 估计量的构建 183
7.3.3 各估计量对比 190
7.4 基于贝叶斯网络的状态估计 193
7.4.1 贝叶斯估计 194
7.4.2 参数化实现 196
7.4.3 非参数化实现 202
7.5 基于因子图的状态估计 206
7.5.1 非线性最小二乘估计 206
7.5.2 直接求解方法 206
7.5.3 优化方法 208
7.5.4 各优化方法对比 218
7.5.5 常用优化工具 219
7.6 典型SLAM算法 221
7.7 本章小结 221
第8章 激光SLAM系统
8.1 Gmapping算法 223
8.1.1 原理分析 223
8.1.2 源码解读 228
8.1.3 安装与运行 233
8.2 Cartographer算法 240
8.2.1 原理分析 240
8.2.2 源码解读 247
8.2.3 安装与运行 258
8.3 LOAM算法 266
8.3.1 原理分析 266
8.3.2 源码解读 267
8.3.3 安装与运行 270
8.4 本章小结 270
第9章 视觉SLAM系统
9.1 ORB-SLAM2算法 274
9.1.1 原理分析 274
9.1.2 源码解读 310
9.1.3 安装与运行 319
9.1.4 拓展 327
9.2 LSD-SLAM算法 329
9.2.1 原理分析 329
9.2.2 源码解读 334
9.2.3 安装与运行 337
9.3 SVO算法 338
9.3.1 原理分析 338
9.3.2 源码解读 341
9.4 本章小结 341
第10章 其他SLAM系统
10.1 RTABMAP算法 344
10.1.1 原理分析 344
10.1.2 源码解读 351
10.1.3 安装与运行 357
10.2 VINS算法 362
10.2.1 原理分析 364
10.2.2 源码解读 373
10.2.3 安装与运行 376
10.3 机器学习与SLAM 379
10.3.1 机器学习 379
10.3.2 CNN-SLAM算法 411
10.3.3 DeepVO算法 413
10.4 本章小结 414
自主导航篇
第11章 自主导航中的数学基础
11.1 自主导航 418
11.2 环境感知 420
11.2.1 实时定位 420
11.2.2 环境建模 421
11.2.3 语义理解 422
11.3 路径规划 422
11.3.1 常见的路径规划算法 423
11.3.2 带约束的路径规划算法 430
11.3.3 覆盖的路径规划算法 434
11.4 运动控制 435
11.4.1 基于PID的运动控制 437
11.4.2 基于MPC的运动控制 438
11.4.3 基于强化学习的运动控制 441
11.5 强化学习与自主导航 442
11.5.1 强化学习 443
11.5.2 基于强化学习的自主导航 465
11.6 本章小结 467
第12章 典型自主导航系统
12.1 ros-navigation导航系统 470
12.1.1 原理分析 470
12.1.2 源码解读 475
12.1.3 安装与运行 479
12.1.4 路径规划改进 492
12.1.5 环境探索 496
12.2 riskrrt导航系统 498
12.3 autoware导航系统 499
12.4 导航系统面临的一些挑战 500
12.5 本章小结 500
第13章 机器人SLAM导航综合实战
13.1 运行机器人上的传感器 502
13.1.1 运行底盘的ROS驱动 503
13.1.2 运行激光雷达的ROS驱动 503
13.1.3 运行IMU的ROS驱动 504
13.1.4 运行相机的ROS驱动 504
13.1.5 运行底盘的urdf模型 505
13.1.6 传感器一键启动 506
13.2 运行SLAM建图功能 506
13.2.1 运行激光SLAM建图功能 507
13.2.2 运行视觉SLAM建图功能 508
13.2.3 运行激光与视觉联合建图功能 508
13.3 运行自主导航 509
13.4 基于自主导航的应用 510
13.5 本章小结 511