机器人开发是一项复杂的系统工程,ROS 2为智能机器人开发提供了强有力的支持,极大地提高了机器人软件开发效率。本书首先对ROS 2的基础概念、通信机制、常用库和工具进行介绍,带领读者入门ROS 2机器人开发;接着引导读者完成移动机器人的建模和仿真、建图和导航、自定义控制器和规划器等一系列实践;然后在真机实战环节,通过制作一个基于ROS 2的真实机器人,帮助读者打通仿真与真机之间的壁垒;最后,本书深入讲解了ROS 2进阶使用的相关知识,为读者进一步在实战中使用ROS 2进行机器人开发打下夯实基础。考虑读者基础,书中示例均以C 和Python两种语言实现,同时加入了关于C 新特性、Git工具、多线程和回调函数等基础知识的讲解。
不同于其他书籍,本书更加以读者的需求为导向。在编写过程中,作者根据原在线教程动手学ROS 2的读者反馈,对本书内容进行了大量的打磨。针对很多ROS 2 初学者容易受阻的编程,本书在前面几章穿插介绍了Linux和Git等知识;针对很多小伙伴反馈学完ROS 2不知道怎么用,本书加入了大量实践环节,例如,结合ROS 2 实现语音合成、人脸识别和界面绘制等,让读者可以真正学以致用;针对需要仿真的小伙伴,本书着重介绍了ROS 2仿真建模的过程,同时结合仿真介绍了ros2_control 的使用;针对对实体机器人硬件开发感兴趣的小伙伴,本书引入了micro-ROS 框架,从零介绍了实体机器人的软件开发流程;针对需要深入使用ROS 2 的小伙伴,本书在最后一章深入探讨了ROS 2 进阶相关知识,让你可以轻松地在实际项目中使用ROS 2。
前 言
为什么写这本书
大家好,我是本书的作者小鱼。我在学生时代就开始接触并使用ROS,随后参加工作,在工作中又进一步使用ROS进行机器人开发。2020年一个偶然的机会,公司安排我来调查ROS的缺陷,以及替代方案,就在那时我被ROS 2的强大功能所吸引,为其提供的机器人开发工具而兴奋,于是开始学习ROS 2。
在后续的学习和使用过程中,我深感ROS 2的中文资料少之又少,于是在2021年7月发起了鱼香ROS社区,开始分享机器人和ROS 2的相关知识。在学习ROS 2的过程中,我深知动手实践的重要性,就发布了动手学ROS 2一系列在线教程,希望读者可以通过动手实践来掌握 ROS 2,同年又与睿慕课合作发布了相应的视频教程。
随着学习动手学ROS 2课程的小伙伴越来越多,我收到了大量的反馈,通过反馈深知初学者入门ROS 2和机器人开发的困难,以及动手学ROS 2系列课程的不足之处。恰逢此时,编辑找到我,我们一拍即合,打算从ROS 2入门角度出发写一本书,带领读者通过学习ROS 2来入门机器人系统开发。所以在本书中,不仅有ROS 2的基础知识、机器人建模和仿真知识、还有从零实现一个真实机器人系统的开发教程。
本书主要内容
本书的内容按照知识结构可以分为五个部分。
第一部分对应第1~5章,主要讲解ROS 2的基础软件库和工具集的使用,通过该部分的学习,可以让你快速掌握ROS 2的核心部分。
第二部分对应第6章,主要结合ROS 2常用的建模工具,从零创建一个移动机器人模型,然后在仿真工具中完成模型仿真,同时结合仿真机器人讲解ros2_control开源框架。
第三部分对应第7章和第8章,主要介绍基于ROS 2的导航框架Navigation 2,同时在第6章仿真移动机器人的基础上实现导航,最后在第8章介绍如何在Navigation 2中部署测试自定义的规划算法和控制算法。
第四部分对应第9章,主要讲解如何搭建一个实体机器人,着重介绍移动机器人控制系统实现和使用micro-ROS接入ROS 2,最后介绍实体机器人的建图和导航实现方法。
第五部分对应第10章,主要介绍ROS 2进阶相关知识,包括服务质量QoS、执行器和回调组、生命周期节点、消息过滤器和ROS 2中间件DDS的进阶使用。
本书的目标读者
对于非机器人行业中对机器人感兴趣并且想要入门机器人开发的读者,本书穿插讲解了学习ROS 2所需的Linux和编程的基础知识,让基础薄弱的读者也可以轻松学习。
对于机器人从业者,不仅可以从本书中学习到ROS 2的基础知识,还可以通过本书深入学习ROS 2,并将其应用到实际工程中。
对于机器人相关专业的高校师生,本书中每一章都涉及大量的动手实践环节,可以把本书当作机器人操作系统的学习实验教材。
对于那些对机器人感兴趣的读者,可以通过本书学习如何制作属于自己的仿真和实体移动机器人,并在此基础上实现自主移动导航。
本书特色
不同于其他书籍,本书更加以读者的需求为导向。在编写过程中,我根据原在线教程动手学ROS 2的读者反馈,对本书内容进行了大量的打磨。针对很多ROS 2初学者容易受阻的编程,本书在前面几章穿插介绍了Linux和Git等知识;针对很多小伙伴反馈学完ROS 2不知道怎么用,本书加入了大量实践环节,例如,结合ROS 2实现语音合成、人脸识别和界面绘制等,让读者可以真正学以致用;针对需要仿真的小伙伴,本书着重介绍了ROS 2仿真建模的过程,同时结合仿真介绍了ros2_control的使用;针对对实体机器人硬件开发感兴趣的小伙伴,本书引入了micro-ROS框架,从零介绍了实体机器人的软件开发流程;针对需要深入使用ROS 2的小伙伴,本书在最后一章深入探讨了ROS 2进阶相关知识,让你可以轻松地在实际项目中使用ROS 2。
阅读指南和配套资源
本书用到的部分开源库托管到了GitHub,读者在学习过程中如遇到网络问题,可以使用本书提供的专用代理工具,工具地址为http://github.fishros.org。在本书的代码块中,以$ 开头表示命令行,使用---分割命令和执行结果,对于非命令行的代码块,粗体部分表示重点更新,...表示被省略掉的不重要代码。
本书提供了大量的配套资源,如配套视频、ROS 2中文文档、官方资料网站等,这些都统一放到了本书的交流社区:https://fishros.org.cn。ROS如此璀璨,本人自知才疏学浅,本书难免有错误和不足之处,读者可以在社区中提出,除此之外,若在学习过程中遇到相关问题,也可以通过社区和我交流。
很多小伙伴都是从公众号鱼香ROS开始认识我的,小鱼每天都会在公众号分享机器人和 ROS 2相关的文章。因为篇幅所限,本书中删减掉的内容都会以文章的形式在公众号中发表,欢迎订阅获取。
致谢
本书能够编写完成和出版,最要感谢的是广大鱼粉对我的支持,没有你们的反馈和鼓励,我很难将本书完成。其次要感谢的是一直站在我身边的家人,感谢来自父亲、母亲和姐姐的鞭策,感谢帮助我整理稿件的鱼嫂马靖雯(也是本书的第一个读者)的无条件支持。还要感谢在我的成长路上提供很大帮助的老师,他们是高中时期带我学习编程和参加比赛的老师赵言言、大学时期的老师殷华博士、工作时的导师陈养斌博士,以及赵洋、苏琦、曾凡国、覃建州等为我提供过帮助的老师。同时感谢机械工业出版社对本书的大力支持。最后要感谢的是机器人和ROS生态的前行者和赶路人,他们是张新宇教授、胡春旭老师、张瑞雷老师、金海华、张鹏、熊颖、侯燕青、李德永等。除此之外,还有很多和我一起交流成长和做出贡献的爱好者、开发者和教育者,此处无法一一列举,但我都感恩
在心。
小鱼
2024年1月于广东广州
桑欣
鱼香ROS机器人社区(公众号、B站、知乎)发起人,一键安装ROS等机器人开源库作者,拥有多年机器人与自动化开发经验。他在网上发布有动手学ROS2等机器人教程,还制作了开源机器人FishBot,获得了广大机器人爱好者的一致好评,深受机器人开发者的喜爱。
目 录 Contents
推荐序一
推荐序二
前言
第1章 启程让你的第一个
机器人动起来 1
1.1 ROS部落的自我介绍 1
1.1.1 机器人与ROS 2
1.1.2 ROS 2系统架构 3
1.1.3 ROS 2的已发布版本 4
1.1.4 ROS 2机器人开发特色 4
1.2 开发环境搭建 5
1.2.1 准备所需软件 6
1.2.2 安装虚拟机VirtualBox 6
1.2.3 在虚拟机中安装
Ubuntu 22.04 7
1.2.4 安装ROS 2 11
1.3 运行你的第一个机器人 14
1.3.1 启动海龟模拟器 14
1.3.2 使用键盘控制海龟 15
1.3.3 海龟例子的简单分析 16
1.4 ROS 2基础之Linux 17
1.4.1 Linux终端基础操作 17
1.4.2 在Linux中安装软件 20
1.4.3 在Linux中编写Python
程序 23
1.4.4 在Linux中编写C 程序 26
1.4.5 Linux基础之环境变量 28
1.5 小结与点评 29
第2章 ROS 2基础入门
从第一个节点开始 30
2.1 编写你的第一个节点 30
2.1.1 Python示例 30
2.1.2 C 示例 33
2.2 使用功能包组织Python节点 37
2.2.1 在功能包中编写Python
节点 37
2.2.2 功能包结构分析 40
2.3 使用功能包组织C 节点 41
2.3.1 在功能包中编写C 节点 41
2.3.2 功能包结构分析 44
2.4 多功能包的最佳实践Workspace 44
2.5 ROS 2基础之编程 46
2.5.1 面向对象编程 46
2.5.2 用得到的C 新特性 53
2.5.3 多线程与回调函数 58
2.6 小结与点评 62
第3章 订阅和发布话题通信
探索 63
3.1 话题通信介绍 63
3.2 Python话题订阅与发布 66
3.2.1 通过话题发布小说 66
3.2.2 订阅小说并合成语音 69
3.3 C 话题订阅与发布 71
3.3.1 发布速度控制海龟画圆 71
3.3.2 订阅Pose实现闭环控制 74
3.4 话题通信最佳实践 77
3.4.1 完成工程架构设计 77
3.4.2 自定义通信接口 78
3.4.3 系统信息获取与发布 81
3.4.4 在功能包中使用Qt 83
3.4.5 订阅数据并用Qt显示 84
3.5 ROS 2基础之Git入门 87
3.5.1 新建代码仓库 87
3.5.2 学会提交代码 88
3.5.3 学会使用Git忽略文件 90
3.6 小结与点评 90
第4章 服务和参数深入
ROS 2通信 92
4.1 服务与参数通信介绍 92
4.1.1 服务通信介绍 92
4.1.2 基于服务的参数通信 95
4.2 用Python服务通信实现人脸检测 97
4.2.1 自定义服务接口 98
4.2.2 人脸检测 100
4.2.3 人脸检测服务实现 102
4.2.4 人脸检测客户端的实现 104
4.3 用C 服务通信做一个巡逻
海龟 106
4.3.1 自定义服务接口 107
4.3.2 服务端代码实现 107
4.3.3 客户端代码实现 109
4.4 在Python节点中使用参数 111
4.4.1 参数声明与设置 112
4.4.2 订阅参数更新 113
4.4.3 修改其他节点的参数 114
4.5 在C 节点中使用参数 116
4.5.1 参数声明与设置 117
4.5.2 接收参数事件 117
4.5.3 修改其他节点的参数 119
4.6 使用launch启动脚本 121
4.6.1 使用launch启动多个节点 121
4.6.2 使用launch传递参数 123
4.6.3 launch使用进阶 124
4.7 小结与点评 126
第5章 ROS 2常用开发工具 127
5.1 坐标变换工具介绍 127
5.1.1 通过命令行使用TF 128
5.1.2 对TF 原理的简单探究 131
5.2 Python中的手眼坐标变换 133
5.2.1 通过Python发布静态TF 133
5.2.2 通过Python发布动态TF 136
5.2.3 通过Python查询TF关系 137
5.3 C 中的地图坐标系变换 139
5.3.1 通过C 发布静态TF 139
5.3.2 通过C 发布动态TF 141
5.3.3 通过C 查询TF关系 143
5.4 常用可视化工具rqt与RViz 145
5.4.1 GUI框架rqt 145
5.4.2 数据可视化工具RViz 147
5.5 数据记录工具ros2 bag 149
5.6 ROS 2基础之Git进阶 153
5.6.1 查看修改内容 153
5.6.2 学会撤销代码 154
5.6.3 进阶掌握Git分支 156
5.7 小结与点评 158
第6章 建模与仿真创建
自己的机器人 160
6.1 机器人建模与仿真概述 160
6.1.1 移动机器人的结构介绍 160
6.1.2 常用机器人仿真平台 161
6.2 使用URDF创建机器人 162
6.2.1 帮机器人创建一个身体 162
6.2.2 在RViz中显示机器人 165
6.2.3 使用Xacro简化URDF 170
6.2.4 创建机器人及传感器部件 173
6.2.5 完善机器人执行器部件 177
6.2.6 贴合地面,添加虚拟部件 179
6.3 添加物理属性让机器人更真实 180
6.3.1 为机器人部件添加碰撞
属性 180
6.3.2 为机器人部件添加质量
与惯性 181
6.4 在Gazebo中完成机器人仿真 183
6.4.1 安装与使用Gazebo构建
世界 184
6.4.2 在Gazebo中加载机器人
模型 189
6.4.3 使用Gazebo标签扩展
URDF 191
6.4.4 使用两轮差速插件控制
机器人 193
6.4.5 激光雷达传感器仿真 197
6.4.6 惯性测量传感器仿真 200
6.4.7 深度相机传感器仿真 203
6.5 使用ros2_control驱动机器人 205
6.5.1 ros2_control介绍与安装 205
6.5.2 使用Gazebo接入
ros2_control 209
6.5.3 使用关节状态发布控制器 213
6.5.4 使用力控制器控制轮子 216
6.5.5 使用两轮差速控制器控制
机器人 218
6.6 小结与点评 221
第7章 自主导航让机器人
自己动起来 222
7.1 机器人导航介绍 222
7.1.1 同步定位与地图构建 222
7.1.2 机器人导航 224
7.2 使用slam_toolbox完成建图 225
7.2.1 构建第一张导航地图 225
7.2.2 将地图保存为文件 227
7.3 机器人导航框架Navigation 2 229
7.3.1 Navigation 2介绍与安装 229
7.3.2 配置Navigation 2参数 231
7.3.3 编写launch并启动导航 232
7.3.4 进行单点与路点导航 234
7.3.5 导航过程中进行动态避障 236
7.3.6 优化导航速度和膨胀半径 237
7.3.7 优化机器人到点精度 239
7.4 导航应用开发指南 240
7.4.1 使用话题初始化机器人
位姿 240
7.4.2 使用TF获取机器人实时
位置 243
7.4.3 调用接口进行单点导航 244
7.4.4 使用接口完成路点导航 250
7.5 导航最佳实践之做一个自动巡检
机器人 253
7.5.1 完成机器人系统架构设计 253
7.5.2 编写巡检控制节点 253
7.5.3 添加语音播报功能 258
7.5.4 订阅图像并记录 261
7.6 ROS 2基础之Git仓库托管 262
7.6.1 添加自描述文件 262
7.6.2 将代码托管在Gitee 265
7.6.3 将代码托管在GitHub 266
7.7 小结与点评 270
第8章 使用自己的规划器和
控制器导航 271
8.1 掌握ROS 2插件机制 271
8.1.1 pluginlib介绍与安装 271
8.1.2 定义插件抽象类 272
8.1.3 编写并生成第一个插件 272
8.1.4 编写插件测试程序 275
8.2 自定义导航规划器 276
8.2.1 自定义规划器介绍 276
8.2.2 搭建规划器插件框架 279
8.2.3 实现自定义规划算法 283
8.2.4 配置导航参数并测试 284
8.3 自定义导航控制器 286
8.3.1 自定义控制器介绍 286
8.3.2 搭建控制器插件框架 287
8.3.3 实现自定义控制算法 292
8.3.4 配置导航参数并测试 294
8.4 小结与点评 295
第9章 搭建一个实体移动
机器人 296
9.1 移动机器人系统设计 296
9.1.1 机器人传感器 296
9.1.2 机器人执行器 297
9.1.3 机器人决策系统 298
9.2 单片机开发基础 298
9.2.1 开发平台介绍与安装 298
9.2.2 第一个HelloWorld工程 301
9.2.3 使用代码点亮LED灯 303
9.2.4 使用超声波测量距离 304
9.2.5 使用开源库驱动IMU 305
9.3 机器人控制系统的实现 306
9.3.1 使用开源库驱动多路
电动机 307
9.3.2 电动机速度测量与转换 308
9.3.3 使用PID控制轮子转速 311
9.3.4 运动学正逆解的实现 315
9.3.5 机器人里程计计算 320
9.4 使用micro-ROS接入ROS 2 322
9.4.1 第一个节点 323
9.4.2 订阅话题控制机器人 327
9.4.3 发布机器人里程计话题 329
9.5 移动机器人建图与导航实现 333
9.5.1 驱动并显示雷达点云 334
9.5.2 移动机器人的坐标系框架
介绍 337
9.5.3 准备机器人URDF 338
9.5.4 发布里程计TF 341
9.5.5 完成机器人建图并保存
地图 343
9.5.6 完成机器人导航 347
9.6 小结与点评 348
第10章 ROS 2使用进阶 349
10.1 消息服务质量之QoS 349
10.1.1 QoS策略介绍 349
10.1.2 QoS的兼容性 352
10.1.3 Python QoS兼容性测试 353
10.1.4 C QoS兼容性测试 354
10.2 执行器与回调组 356
10.2.1 执行器与回调组介绍 356
10.2.2 在Python中使用回
调组 358
10.2.3 在C 中使用回调组 361
10.3 生命周期节点 364
10.3.1 生命周期节点介绍 364
10.3.2 在Python中编写生命
周期节点 367
10.3.3 在C 中编写生命周期
节点 369
10.4 同一进程组织多个节点 371
10.4.1 使用执行器组织多个
节点 371
10.4.2 使用组件运行组合
节点 375
10.4.3 编写自己的组件 378
10.5 使用消息过滤器同步数据 380
10.5.1 消息过滤器介绍 380
10.5.2 在Python中同步传感器
数据 380
10.5.3 在C 中同步传感器
数据 381
10.6 DDS中间件进阶 384
10.6.1 使用不同的DDS进行
通信 384
10.6.2 配置局域网通信 386
10.6.3 调整DDS配置 386
10.6.4 使用DDS共享内存 388
10.7 小结与点评 390