推荐序一Foreword
2017年秋的某一天,突然接到刘锦涛博士的邀请,为其新翻译的书作序。因为与这本书的作者Lentin在学术会中有过交流,而刘锦涛博士又是在中国机器人操作系统(Robot Operating System,ROS)领域德高望重的知识传播者,我欣然接受了他的邀请,也算是为ROS知识书籍的推广尽一点绵薄之力。
随着各项技术的高速发展和逐渐成熟,机器人的时代已逐步到来。机器人技术的发展经历了遥控机器人、可编程机器人、感知机器人,并正在向人工智能机器人快速发展。一批又一批的研究和开发人员在机器人的材料、结构、算法与控制、核心部件、软件、人工智能、人机交互等方面做出了巨大的贡献。我在博士毕业回国后,专注于将图像处理和模式识别应用于机器人行业,因而也进入了机器人研究领域。我相信这本书的大部分读者和我一样,赶上了这个时代,并且很有幸地参与其中。
开源软件是人类信息化快速发展的巨大推动力。自20世纪80年代Richard Stallman启动GNU工程并建立自由软件基金会开始,开源软件对人类的电子信息技术推动起到了功勋卓越的作用(其实,我根本无法找到一个合适的词去描述开源软件的伟大)。在当今的互联网和移动互联网时代,日常信息处理的每一个环节背后几乎都有开源软件的影子。而我个人第一次真正接触开源软件,是在念硕士时期使用GloMoSim对802.11协议MAC层的仿真和性能评估。之后我深深地爱上了开源软件,并且在工作中也一直得益于开源软件的支持,如Lapack++、OpenCV、MSVMpack、GPML等。
开源软件已成为机器人领域的主流发展力量。机器人核心软件是机器人技术的重要组成部分。Willow Garage的前CEO Morgen Quigley博士曾表示:“机器人的核心问题是软件问题。”非常庆幸的是开源软件世界向我们提供了一个重要的机器人软件工具—ROS。ROS向机器人开发者提供了多进程间的通信机制、大量的功能包、系列化的工具,以及一个巨大的开发者社区。正像《MIT Technology Review》所说的那样,ROS已经成为机器人软件界的事实标准。在ROS十周岁生日之际,著名的《Science Robotics》杂志这样评价ROS:“从太空机器人到自动驾驶、工业装配和外科手术,ROS的使命是助力世界机器人。”而IEEE Spectrum则直接将ROS定义为机器人技术界的Linux。
时常有人问我,为什么要用ROS,甚至有些人对于使用ROS嗤之以鼻。其实这个问题的核心是,他们没有认识到ROS的价值。本书在第1章谈到了为什么要用ROS,但我也想谈谈自己对ROS的看法。
松耦合的架构体系。在IT领域中,ROS的通信机制(Plumbing)其实不是什么高深或绝无仅有的技术(没有贬低ROS的意图),进程间通信和消息分发中的发布/订阅机制可由不少开源软件实现,如ZeroMQ、MQTT等,有些甚至效率更高。因此,与其说ROS提供了消息传输,不如说ROS提供了一个标准—信息交互的标准,开发者之间协作的标准。这使得程序结构松耦合、模块化,也便于开发者之间建立协同开发。
开放的授权机制。有不少类似于ROS的机器人开源框架,但形成规模化应用的恐怕就只有ROS了。究其原因,我个人认为与ROS采用BSD的授权机制密不可分。硅谷巨头微软曾开发了Microsoft Robotics Developer Studio,但由于其采用微软一贯的闭源模式,导致其缺乏用户,并于2012年之后没有再更新过。多个其他框架则采用了GPL授权,这为后续的商业应用带来了极大的局限性。ROS采用BSD的授权机制,不仅完全开源,还不限制商业应用,这为机器人的产业化提供了非常重要的基础。
完善的生态圈。第一,ROS在全球拥有几十万人的开发者社区,形成了一个庞大的UGC(User Generated Content)的机器人功能包(package)体系,让后来的开发者可以站在其他开发者的肩膀上继续前行。第二,提供完善的开发支持文档,这也直接大大降低了ROS开源代码的使用门槛,提高了开发效率,并为技术交流和传递提供了很好的手段。第三,越来越多的传感器、控制器、新型结构等机器人部件生产厂家都提供完整的ROS驱动、开发API,让机器人开发变得更方便。第四,生态圈中有大量的高尚的布道者和传播者,不断地编制图书、文章、博客、视频等各种形式的教程,为入门者引领道路,为精进者提供借鉴。
多样的细分领域。在开源社区开发者的持续推动下,ROS在不断演化和发展,形成了一些细分的应用领域,如MoveIt、ROS-Industrial等。形成细分的应用领域意味着更加专注和专业。MoveIt提供运动规划、3D感知、控制、导航等算法。ROS-Industrial将ROS拓展至工业领域,并在硬件接口、人机交互接口、运动及路径规划、工作区建模、移动、感知、开发工具、智能工厂等工业机器人领域做了全面的发展规划。
知识的学习离不开书本。在ROS诞生十周年之际,很高兴看到刘锦涛博士又翻译了一本ROS的著作。虽然在ROS方面已经出版了不少书籍,但本书采用了全新的视角,从完成特定项目以及实现特定功能的维度出发,手把手地教读者实现各种机器人功能,以此构建ROS及周边技术的知识体系。这里既有ROS外延性的开发和工具,如与MATLAB和Android的结合,也有实现ROS构建“小脑”+AI构建“大脑”的方法,如与TensorFlow、OpenCV、语音等的结合;既分享了新型人机交互的方式,如结合VR、手势和Leap Motion实现机器人人机交互等,又给出了构建当前最热的自动驾驶的小方案。此外,本书中还给出了大量ROS周边技术的资源。从机器人技术和ROS开发的学
封面图
目录
- 译者序
- 推荐序一
- 推荐序二
- 作者简介
- 审校者简介
- 前言
- 致谢
- 第1章入门ROS机器人应用程序开发 1
- 1.1ROS入门 2
- 1.1.1ROS发行版 2
- 1.1.2支持ROS的操作系统 3
- 1.1.3支持ROS的机器人和传感器 4
- 1.1.4为什么选择ROS 5
- 1.2ROS基础 6
- 1.2.1文件系统级 7
- 1.2.2计算图级 8
- 1.2.3ROS社区级 9
- 1.2.4ROS通信 9
- 1.3ROS客户端库 10
- 1.4ROS工具 11
- 1.4.1Rviz(ROS可视化) 11
- 1.4.2rqt_plot 11
- 1.4.3rqt_graph 12
- 1.5ROS仿真器 13
- 1.6在Ubuntu 16.04 LTS上安装ROS Kinetic 13
- 1.7在VirtualBox上设置ROS 17
- 1.8设置ROS工作区 19
- 1.9ROS在工业和研究中的机遇 20
- 1.10问题 22
- 1.11本章总结 22
- 第2章使用ROS、OpenCV和Dynamixel伺服舵机进行人脸检测与跟踪 23
- 2.1项目概述 23
- 2.2硬件和软件需求 24
- 2.3ROS与Dynamixel伺服舵机的接口 33
- 2.4创建人脸跟踪ROS包 34
- 2.5人脸跟踪功能包的工作原理 36
- 2.5.1理解人脸跟踪代码 38
- 2.5.2理解CMakeLists.txt 41
- 2.5.3track.yaml文件 43
- 2.5.4启动文件 43
- 2.5.5运行人脸跟踪器节点 44
- 2.5.6face_tracker_control功能包 45
- 2.5.7云台控制器配置文件 46
- 2.5.8舵机参数配置文件 47
- 2.5.9人脸跟踪控制器节点 47
- 2.5.10创建CMakeLists.txt 49
- 2.5.11测试人脸跟踪控制功能包 49
- 2.5.12集成所有节点 51
- 2.5.13固定支架并安装电路 51
- 2.5.14最终测试 52
- 2.6问题 52
- 2.7本章总结 53
- 第3章在ROS中构建一个像Siri的聊天机器人 54
- 3.1人机交互机器人 54
- 3.2构建人机交互机器人 55
- 3.3预备条件 56
- 3.4AIML入门 57
- 3.4.1AIML标签 57
- 3.4.2PyAIML解释器 58
- 3.4.3在Ubuntu 16.04 LTS上安装PyAIML 59
- 3.4.4使用PyAIML 59
- 3.4.5加载多个AIML文件 60
- 3.4.6在ROS中创建AIML机器人 62
- 3.4.7AIML ROS功能包 62
- 3.5问题 70
- 3.6本章总结 70
- 第4章使用ROS控制嵌入式电路板 71
- 4.1主流嵌入式电路板入门 71
- 4.1.1如何选择Arduino开发板 71
- 4.1.2Raspberry Pi(树莓派)介绍 74
- 4.1.3Odroid开发板 76
- 4.2Arduino与ROS的接口 76
- 4.2.1使用Arduino和ROS监控光线亮度 79
- 4.2.2在PC上运行ROS串行服务器 81
- 4.2.3通过mbed连接STM32开发板和ROS 82
- 4.2.4使用Energia连接ROS与Tiva C Launchpad板 85
- 4.3在Raspberry Pi和Odroid上运行ROS 87
- 4.3.1将Raspberry Pi和Odroid连接到PC 88
- 4.3.2ROS控制GPIO引脚 90
- 4.4问题 94
- 4.5本章总结 95
- 第5章使用手势远程操作机器人 96
- 5.1使用键盘遥控ROS龟 97
- 5.2使用手势进行遥控 98
- 5.3项目配置 100
- 5.4MPU-9250、Arduino和ROS连接 101
- 5.5在Rviz中可视化IMU TF 106
- 5.6将IMU数据转换为twist消息 107
- 5.7集成和最终运行 109
- 5.8使用Android手机进行遥控 111
- 5.9问题 113
- 5.10本章总结 113
- 第6章物体检测和识别 114
- 6.1物体检测和识别的快速入门 114
- 6.2ROS中的find_object_2d包 116
- 6.2.1安装find_object_2d包 116
- 6.2.2运行find_object_2d节点检测网络摄像头图像中的物体 117
- 6.2.3使用深度传感器运行find_object_2d节点 121
- 6.33D物体识别快速入门 124
- 6.4ROS中3D物体识别包的介绍 125
- 6.5从3D网格中检测和识别物体 127
- 6.5.1使用物体的3D模型进行训练 127
- 6.5.2使用捕获的3D模型进行训练 129
- 6.6识别物体 132
- 6.7问题 135
- 6.8本章总结 135
- 第7章使用ROS和TensorFlow进行深度学习 136
- 7.1深度学习及其应用简介 136
- 7.2深度学习机器人 137
- 7.3深度学习库 138
- 7.4TensorFlow入门 139
- 7.4.1在Ubuntu 16.04 LTS上安装TensorFlow 139
- 7.4.2TensorFlow的概念 141
- 7.4.3在TensorFlow中编写我们的第一个程序 143
- 7.5使用ROS和TensorFlow进行图像识别 146
- 7.5.1前提条件 147
- 7.5.2ROS图像识别节点 147
- 7.6scikit-learn介绍 150
- 7.7SVM及其在机器人中的应用 151
- 7.8问题 154
- 7.9本章总结 154
- 第8章在MATLAB和Android上运行ROS 156
- 8.1ROS-MATLAB接口入门 156
- 8.2在MATLAB中设置机器人工具箱 157
- 8.2.1MATLAB中的基本ROS功能 157
- 8.2.2列出ROS节点、主题和消息 158
- 8.3MATLAB与ROS网络通信 160
- 8.4利用MATLAB控制ROS机器人 163
- 8.4.1设计MATLAB GUI应用程序 164
- 8.4.2解释回调 166
- 8.4.3运行应用程序 168
- 8.5Android及其ROS接口入门 169
- 8.5.1安装rosjava 170
- 8.5.2通过Ubuntu软件包管理器安装android-sdk 172
- 8.6安装ROS-Android接口 174
- 8.7使用ROS-Android应用程序 175
- 8.8代码演练 180
- 8.9使用ROS-Android接口创建基本应用程序 182
- 8.10问题 183
- 8.11本章总结 184
- 第9章构建自主移动机器人 185
- 9.1机器人规格和设计概述 185
- 9.2设计和选择机器人的电动机和轮子 186
- 9.2.1计算电动机扭矩 186
- 9.2.2电动机转速的计算 186
- 9.2.3设计总结 187
- 9.3构建机器人本体的2D和3D模型 187
- 9.3.1底盘 187
- 9.3.2连接杆和空心管设计 188
- 9.3.3电动机、轮子和电动机夹具设计 189
- 9.3.4脚轮设计 189
- 9.3.5中层板和顶层板设计 189
- 9.3.6顶层板 190
- 9.3.7机器人的3D建模 191
- 9.4在Gazebo中进行机器人模型仿真 192
- 9.5差速驱动机器人的数学模型 192
- 9.6设计和建造实际的机器人 200
- 9.6.1电动机和电动机驱动 201
- 9.6.2电动机编码器 201
- 9.6.3Tiva C Launchpad 201
- 9.6.4超声波传感器 201
- 9.6.5OpenNI深度传感器 201
- 9.6.6英特尔NUC 201
- 9.6.7使用Launchpad将传感器
- 和电动机连接起来 201
- 9.6.8Tiva C Launchpad编程 202
- 9.7连接机器人硬件与ROS 205
- 9.8在Chefbot中进行地图构建和定位 208
- 9.9问题 210
- 9.10本章总结 210
- 第10章使用ROS创建自动驾驶汽车 211
- 10.1自动驾驶汽车入门 211
- 10.2典型自动驾驶汽车的功能框图 214
- 10.2.1自动驾驶汽车的软件框图 218
- 10.2.2在ROS中仿真和连接自动驾驶汽车传感器 219
- 10.3在Gazebo中仿真一辆带有传感器的自动驾驶汽车 235
- 10.3.1安装预备条件 235
- 10.3.2可视化机器人车传感器数据 237
- 10.3.3在Gazebo里移动一辆自动驾驶汽车 238
- 10.3.4使用机器人车运行hector SLAM 238
- 10.4将DBW车与ROS连接 239
- 10.4.1安装包 240
- 10.4.2可视化自动驾驶汽车和传感器数据 240
- 10.4.3DBW与ROS通信 242
- 10.5Udacity开源自动驾驶汽车项目介绍 242
- 10.6问题 245
- 10.7本章总结 246
- 第11章使用VR头戴设备和Leap Motion遥控机器人 247
- 11.1VR头戴设备和Leap Motion入门 248
- 11.2项目预备条件 249
- 11.3项目的设计和工作原理 250
- 11.4在Ubuntu 14.04.5上安装Leap Motion SDK 251
- 11.4.1可视化Leap Motion控制器数据 252
- 11.4.2使用Leap Motion可视化工具 252
- 11.4.3安装Leap Motion控制器的ROS驱动程序 253
- 11.5在Rviz中可视化Leap Motion数据 255
- 11.6使用Leap Motion控制器创建遥控节点 256
- 11.7构建ROS-VR Android应用程序 258
- 11.8使用ROS-VR应用程序并与Gazebo进行连接 259
- 11.9在VR中使用TurtleBot仿真 262
- 11.10ROS-VR应用程序的故障排除 263
- 11.11ROS-VR和Leap Motion遥控的集成应用 264
- 11.12问题 264
- 11.13本章总结 264
- 第12章通过网络控制机器人 265
- 12.1ROS Web入门 265
- 12.1.1rosbridge_suite 265
- 12.1.2roslibjs、ros2djs和ros3djs 266
- 12.1.3tf2_web_republisher 267
- 12.2在ROS Kinetic上设置ROS Web 267
- 12.2.1安装rosbridge_suite 267
- 12.2.2设置rosbridge客户端库 268
- 12.3在ROS Kinetic上安装tf2_web_republisher 269
- 12.4在Web浏览器上实现机器人遥控和可视化 269
- 12.4.1项目开发 269
- 12.4.2连接到rosbridge_server 271
- 12.4.3初始化teleop 271
- 12.4.4在Web浏览器中创建3D查看器 272
- 12.4.5创建TF客户端 272
- 12.4.6创建URDF客户端 272
- 12.4.7创建文本输入 273
- 12.4.8运行Web teleop应用程序 273
- 12.5利用网络浏览器控制机器人关节 275
- 12.5.1安装joint_state_publisher_js 275
- 12.5.2运行网络关节状态发布器 276
- 12.5.3解释代码 278
- 12.5.4运行机器人监控应用程序 278
- 12.6基于Web的语音控制机器人 279
- 12.6.1前提条件 280
- 12.6.2在Web应用程序中启用语音识别 280
- 12.7运行语音控制机器人应用程序 282
- 12.8问题 283
- 12.9本章总结 284