本书是针对ROS(机器人操作系统)初学者的入门教程,内容聚焦于ROS的使用和开发。以Ubuntu操作系统安装和使用为起点,依次介绍了ROS安装、实体/仿真机器人搭建、机器视觉、SLAM建图、导航、多机器人系统等知识,*终引导读者独立完成机器人应用开发的任务。本书中的实验环境和代码基于ROS的Noetic版本。
本书为读者提供了全部案例源代码和学习资料,读者可以直接扫描二维码下载。
本书适合ROS用户及其编程开发人员使用,也可以作为高等学校或培训学校相关专业的参考教材。
实操性高,以案例形式深入浅出地介绍了ROS开发相关知识和具体流程。
配套资源丰富,提供了全部案例源代码和学习资料,读者可以直接扫描二维码下载。
随着科技的发展,机器人已经从科幻小说走进了人们的日常生活中,如房间里用来清洁地板的扫地机器人,餐厅中穿梭往来送餐的服务机器人,商场中引导顾客的引导机器人,园区中配送快递的无人快递配送车,道路上的自动驾驶汽车等。伴随而来的是行业对于机器人相关技术人才的需求愈加旺盛。而面对着功能各异、形态千差万别的机器人,它们之间有着什么差异?有着什么共性?应该从哪里开始了解它们?怎样才能掌握机器人开发相关的技术?
机器人操作系统(Robot Operating System,ROS)就是一个很好的入手方向,ROS是一套应用于机器人开发的软件框架,开始应用于科学研究领域,由于其强大的功能、开源的特性和良好的社区环境,逐渐被越来越多的商业公司应用到产品开发中。ROS经过了多年的发展,已经成为机器人行业的事实标准。
提到ROS的学习,人们常听到的一个说法是学习曲线很陡峭,这是指ROS在入门学习阶段比较艰难。而结合相关的学习经验和众多学生的反馈,可以发现导致 ROS 学习入门难的几个原因如下:
1)ROS目前主流使用的操作系统平台为Linux操作系统的发行版,例如 Ubuntu,而多数非计算机专业的学生在此前并没有了解过Linux操作系统,加上Linux中的主要操作都是通过终端命令行输入指令完成的,和日常广泛使用的Windows操作系统依赖图形化界面的操作方式有很大的区别,这就导致了很多用户没法熟练地使用,而Linux操作系统是ROS运行的基础环境,不能熟练使用必然会给ROS的学习带来很大的阻碍。
2)对于ROS中常用的工具掌握不熟练,甚至不知道有这些工具的存在,正所谓工欲善其事必先利其器,而利其器的前提则是知有器,ROS 为开发者提供了很多用于调试和诊断问题的工具,每种工具有各自擅长分析和解决的问题,不会灵活地使用各类工具来辅助机器人的开发和调试,必然会极大地影响开发和学习的效率。
3)目前很多 ROS 相关的教程是基于仿真软件或者一款特定的机器人硬件而展开的,对于仿真软件中的机器人与实体机器人之间的区别和联系,以及怎样去移植和适配,并没有做出很好的阐述,这就使用户在学习完成后想要搭建自己的机器人平台或者将教程中的软件移植到其他机器人平台上时存在一定的难度。
第四,现在已经有很多个人或组织开源了自己所开发的ROS功能包软件并配套了详细的使用教程,初学者可以根据文档或视频教程去运行这些软件实现相应的功能,或者基于开源的软件做一些修改来快速实现自己的功能,但是当初学者想要实现一些新的功能,并且没有现成的开源软件可以参考时就会无从下手。究其原因是对 ROS 的编程思想缺乏了解,开源的软件通常只是给出了一套实现功能的代码和使用教程,但是对于功能实现的分析过程和思路却鲜有提及,即告诉了怎么做但没有告诉为什么这样做。
针对以上几个问题,本书在内容选取和结构编排上做了一些针对性的设计。
第 1 章为学习ROS必备的Linux知识,介绍Linux操作系统的安装、使用,为后面在Linux中使用ROS打下基础。
第 2 章为认识ROS,介绍ROS的安装,梳理ROS中众多概念的联系,通过官方提供的例程来熟悉各种工具的使用。
第 3 章为ROS编程基础,介绍ROS开发环境的搭建和编程的基本方式,巩固第2章中的ROS概念和工具知识点。
第 4 章为ROS机器人平台搭建,介绍ROS机器人的主要构成部件和选型参考,以及组建一套可以用于开发学习的机器人。
第 5 章为机器人仿真环境搭建,介绍在机器人仿真软件中搭建机器人仿真平台以及与实体机器人和仿真环境中机器人的区别与联系,为第6、7、8三个章节中的机器人例程运行做准备。
第 6 章为ROS中的OpenCV和机器视觉,介绍机器人中的机器视觉,机器视觉是目前机器人研究中一个重要的组成部分,本章介绍ROS和OpenCV结合方法以及经典的机器视觉实验。
第 7 章为激光雷达SLAM建图和自主导航,介绍机器人使用激光雷达完成SLAM构建地图和在地图中导航的实验。
第8章为ROS多机器人系统,介绍该系统的搭建和控制。
第 9 章为自己编写程序控制机器人,结合实例分析ROS机器人应用开发的思路,以及相关API接口的查找、使用方法,并编写代码来实现相应功能。
由于作者水平有限,书中难免有疏漏之处,敬请读者批评指正。
前言
二维码清单
第1章 学习ROS必备的Linux知识1
1.1 Linux操作系统介绍1
1.1.1 Linux的诞生1
1.1.2 Linux、UNIX、系统、内核和发行版2
1.2 Ubuntu环境搭建3
1.2.1 VMWare的安装使用3
1.2.2 安装Ubuntu系统5
1.3 Ubuntu桌面使用10
1.3.1 Ubuntu的桌面布局10
1.3.2 安装VMware Tools工具11
1.4 shell和常用命令12
1.4.1 shell、终端和命令12
1.4.2 常用shell命令14
1.5 Ubuntu安装和卸载软件17
1.5.1 使用国内软件源提升下载速度17
1.5.2 通过apt管理软件19
1.5.3 通过应用商店安装卸载软件19
1.6 vim编辑器使用21
1.7 Linux文件系统22
1.7.1 Linux文件系统结构22
1.7.2 目录内容存放规则24
1.8 root用户和权限管理24
1.8.1 Linux中的权限概念25
1.8.2 文件/目录权限查看和修改25
1.8.3 启用root用户26
1.9 嵌入式单板计算机和Linux27
第2章 认识ROS30
2.1 ROS是什么30
2.1.1 ROS从何而来30
2.1.2 为什么要使用ROS31
2.2 如何安装ROS32
2.3 ROS通信结构37
2.3.1 节点和主节点38
2.3.2 话题(Topic)39
2.3.3 服务(Service)40
2.3.4 动作(Action)41
2.3.5 参数服务器42
2.4 ROS常用shell命令43
2.5 ROS常用图形工具50
2.5.1 rqt工具箱51
2.5.2 rviz52
2.6 ROS坐标系和tf变换53
2.6.1 ROS中的坐标定义53
2.6.2 ROS中的tf变换54
2.7 ROS工作空间56
2.7.1 ROS工作空间是什么57
2.7.2 创建并使用一个工作空间58
第3章 ROS编程基础60
3.1 ROS开发环境搭建60
3.1.1 Ubuntu下安装VSCode60
3.1.2 VSCode常用插件安装61
3.2 新建一个ROS功能包62
3.3 编写一对发布订阅节点(C )64
3.3.1 编写发布节点(C )64
3.3.2 编写订阅节点(C )66
3.4 编写一对发布订阅节点(Python)67
3.4.1 编写发布节点(Python)67
3.4.2 编写订阅节点(Python)68
3.5 编写launch文件用于启动节点70
3.5.1 通过launch文件启动C 编译的节点70
3.5.2 通过launch文件启动Python节点71
3.5.3 在launch文件中调用launch文件72
3.6 创建新消息类型并编写节点发布消息73
3.6.1 编写自定义消息74
3.6.2 验证消息正常产生75
3.6.3 编写节点发布自定义消息类型(C )76
3.6.4 编写节点订阅自定义消息类型(Python)76
3.7 创建一个服务类型并编写服务端/客户端节点77
3.7.1 定义并编写一个自定义服务77
3.7.2 通过rossrv验证服务产生78
3.7.3 编写自定义服务的服务端(C )79
3.7.4 编写自定义服务的服务端(Python)80
3.7.5 编写自定义服务的客户端(C )80
3.7.6 编写自定义服务的客户端(Python)81
3.8 tf变换编程入门82
3.8.1 通过static_transform_publisher发布静态坐标变换82
3.8.2 编写节点实现动态tf变换(Python)84
3.8.3 编写节点实现动态tf变换(C )85
第4章 ROS机器人平台搭建87
4.1 机器人系统的典型构成87
4.2 几种常见的机器人底盘运动学模型88
4.2.1 差速转向结构89
4.2.2 阿克曼转向结构90
4.2.3 全向运动结构92
4.3 驱动和电池系统95
4.3.1 驱动系统电动机95
4.3.2 电池系统97
4.4 控制系统底盘控制器98
4.5 控制系统车载计算机100
4.5.1 车载计算机需要实现的功能100
4.5.2 车载计算机的选择100
4.5.3 将车载计算机和底盘控制器连接起来102
4.6 机器人上常用的传感器105
4.6.1 获取机器人运动状态编码器和IMU105
4.6.2 让机器人看见世界摄像头107
4.6.3 让机器人感知世界的深浅立体相机108
4.6.4 让机器人具备全向感知能力激光雷达109
4.7 远程连接车载计算机111
4.7.1 路由模式和WiFi模式111
4.7.2 SSH远程登录112
4.7.3 使用远程桌面连接机器人113
4.8 底盘启动和控制115
4.8.1 启动底盘驱动节点115
4.8.2 控制机器人运动116
4.8.3 向launch文件中传入变量118
4.9 机器人底盘ROS节点源码解析119
4.9.1 base_control功能包文件结构120
4.9.2 base_control.launch文件解读120
4.9.3 base_control.py源码解读122
4.9.4 bash脚本与udev规则131
4.10 ROS分布式通信配置132
4.10.1 分布式通信配置条件检查133
4.10.2 分布式通信配置和测试验证135
第5章 机器人仿真环境搭建137
5.1 为什么要有机器人仿真环境137
5.1.1 机器人仿真主要解决的问题137
5.1.2 仿真环境中的机器人和真实机器人的联系138
5.2 在Stage仿真器中创建机器人139
5.2.1 Stage仿真器简介139
5.2.2 创建Stage仿真器地图和机器人模型140
5.2.3 控制Stage仿真器中的机器人143
5.3 在Gazebo仿真器中创建机器人144
5.3.1 Gazebo仿真器简介144
5.3.2 Gazebo仿真器中的环境模型147
5.4 机器人模型和URDF文件150
5.4.1 URDF文件150
5.4.2 xacro文件和Gazebo插件155
5.4.3 通过Solidworks 创建机器人模型157
第6章 ROS中的OpenCV和机器视觉159
6.1 摄像头的驱动和图像话题订阅159
6.1.1 启动摄像头159
6.1.2 订阅摄像头图像并显示161
6.1.3 摄像