本书通过将ROS社区的宝贵开发经验和现实案例相结合,为你在机器人开发过程中遇到的问题提供切实可行的指南。不论你是机器人俱乐部的学生,还是专业的机器人科学家和工程师,都可以在本书中找到你想要的内容。书中的每部分都提供了使用ROS工具实现各类机器人系统的完整解决方案,不仅包括实现各种单一机器人任务,也包括将不同模块结合完成组合任务。在本书中,只要你熟悉Python,就可以开始动手实践。
前言ROS(Robot Operating System,机器人操作系统),是一个让机器人能够运作起来的开源程序框架。ROS诞生的初衷是能够为那些制作和使用机器人的人提供通用的软件平台。这个平台能够让人们更加便捷地分享代码与想法,这意味着你不再需要花费经年累月的时间去编写软件框架就能让你的机器人动起来!
ROS取得了巨大的成功。截止撰写本书之时,官方发行的ROS版本中有超过2000个软件包,并被600多人编写和维护。ROS支持大约80个市场上可以买到的机器人,我们还可以在至少1850篇学术文献中找到ROS的踪影。从此我们不再需要从零开始编写所有程序,特别是当要对众多ROS所支持的机器人中的一个进行开发时,我们可以更加专注于机器人技术本身,而不是“位操作”或者设备驱动。
ROS由许多部分所组成,包含如下这些:
1. 一系列可以让你从传感器读取数据以及向电动机等执行机构发送指令的驱动程序,而且这些数据的格式都经过良好的抽象与定义。ROS支持非常多的主流硬件,包括越来越多市场上可以买到的机器人系统。
2. 海量且日渐增多的基本机器人算法,让你能够轻松构建世界地图、在其中穿梭、表示并解析传感器数据、规划动作、操纵物体,以及实现许多其他功能。ROS在机器人研究社区中饱受欢迎,因此许多最前沿的算法现在都可以在ROS中找到。
3. 充足的计算基础设施,使数据能够四处传递,让众多模块可以连接成一个复杂的机器人系统并帮助你整合算法。ROS天生的分布式架构让你能够轻松地将计算压力无缝地分担到多台计算机上。
4. 一系列实用工具,使得对机器人及算法的可视化、错误行为的调试以及传感器数据的录制都变得非常容易。对机器人程序的调试是极为困难的,因此也正是这一系列丰富的工具使得ROS如此强大。
5. 最后,ROS具有比其本身更为庞大的ROS生态系统,它的扩展资源众多,包含了一个记录整个框架方方面面的wiki文档,一个专门用于提问与解答的网站,通过该网站你可以寻求帮助并分享自己的所学,以及一个充满使用者与开发者的欣欣向荣的社区。
那么,为什么你需要学习ROS呢?最简单的答案就是,它将会为你节省时间。ROS包含了机器人软件系统的所有部分,没有它,你就只能自己一一编写。ROS使你能够更加专注于系统中你最关心的部分,而无须操心那些你不那么关注的部分。
为什么你需要读这本书?ROS的wiki文档中包含了大量内容,涉及框架中许多方面的详细教程。一个活跃的用户社区(http://answers.ros.org)随时准备解答你的问题。为什么不直接通过这些资源学习ROS? 在本书中我们所做的就是以一种更加有序的方式将这些知识呈现给你,并给出容易理解的实例,使你知道如何使用ROS让你的实物或仿真机器人去做些有趣的事。我们还尝试通过提供技巧和提示来给予你各种指导,比如如何整合代码,如何在机器人行为不合预期时调试代码以及如何成为ROS社区的一员。
如果你不是资深程序员,学习ROS会有些吃力,系统中包含了分布式计算、多线程、事件驱动的编程以及深藏在系统底层的一大堆概念。如果你不怎么懂这些内容,你的学习曲线将会非常陡峭。本书通过介绍ROS的基本概念并给出在实物或仿真机器人中的常见应用实例来尽可能地使这条学习曲线变得平缓一些。
谁应该阅读本书如果你想让你的机器人在现实世界中做一些事情,而又不想把时间浪费在“重新发明轮子”上,那么这本书就是为你准备的。ROS包含了让机器人运转起来所需要的基础架构以及用来驱动机器人做一些有趣事情的足够多的算法。
如果你对某些特别的方面比如路径规划等感兴趣,并且想在完整的机器人系统背景下研究它们,那么这本书就是为你准备的。本书将展示如何使用ROS提供的基础架构和算法来驱动机器人做一些有趣的事情以及如何用你自己的算法替换掉现有的算法。
如果你想要了解ROS基本的运转机制和用法,想要了解ROS大概能做哪些事情,但是又苦于wiki的内容太过庞杂,那么这本书也是为你准备的。我们将带领你了解ROS的运转机制和一些简单的工具。我们也会提供一些具体的、完整的例子,你可以基于这些例子进行开发,修改它们来实现自己的想法。
谁不适合阅读本书虽然我们不想拒绝任何人阅读本书,但是本书并不是对所有人都适用的资源。我们对你使用的机器人做了一些隐含的假设。它们应该运行Linux,有很好的计算资源(至少相当于一台笔记本电脑)。它们有先进的传感器,比如Microsoft Kinect。它们应该是放在地上的,并且可能需要在实际环境中移动。如果你的机器人不满足上述这些要求,那么本书中的例子就不能立刻成功运行,尽管程序和工具本身并没有问题。
本书主要是关于ROS的,并不是关于机器人学的。尽管你可以从本书中学到一点机器人学相关的知识,但是我们不会深入地探讨ROS中包含的很多算法。如果你想获取更多关于机器人学的介绍,那么这本书不是为你准备的。
你将学到什么本书想要广泛地介绍如何使用ROS对机器人进行编程。本书涵盖构成ROS核心的基本运转机制和简单工具,并将展示如何使用它们创建控制机器人的软件。我们将展示一些具体的例子,这些例子讲述了如何使用ROS控制你的机器人做一些有趣的事情。同时,我们将给出一些如何基于这些例子来创建你自己的机器人的建议。
除了技术内容之外,我们还将展示如何使用ROS巨大的生态系统,比如wiki和问答社区,以及如何成为全球ROS社区的一员,与全世界的其他机器人爱好者分享代码和新知识。
预备知识在阅读和使用本书之前,你必须了解几件事情。由于ROS是一个软件框架,因此为了更好地了解ROS你非常有必要了解如何编程。虽然在ROS中可以使用很多种语言,但是在本书中我们使用Python。如果你不了解Python,那么很多代码对你来说就没多大意义了。幸运的是,Python是一门易于学习的语言!有很多很不错的书和免费的网站,你可以使用这些资源来学习Python,Python的官方网站是http://python.org。
最适合运行ROS的环境是Ubuntu Linux,有一些Linux的经验能够让学习轻松一点。我们在讲述过程中将会介绍一些必要的Linux相关内容,但是对文件系统、bash命令行以及至少一种编辑器有一些基本的了解将有利于你将更多的精力放在ROS相关的内容上。
尽管不是必要的,但是对机器人学有基本的了解也将有所帮助。了解一些机器人学所使用的基本数学知识,比如坐标变换、传动链等,对理解书中所讲述的一些ROS机制也很有帮助。再次强调,我们将简要介绍这些内容,但是如果你不熟悉这些东西,你可能要额外地学习、深入机器人学的相关文献来补充相关背景。
排版约定斜体表示新的术语、网址、邮件地址、目录、路径名、文件名以及文件扩展名。
等宽字体(Constant width)表示程序代码,在正文中出现的代码中的元素,如变量名、函数名、命名空间、数据类型、环境变量、语句以及关键词等,也用来表示命令、命令行工具以及ROS的包、节点、话题等。
等宽加粗(Constant width bold)表示命令以及其他一些需要用户完全按照字面输入的文字。
等宽斜体(Constant width italic)表示需要用户根据自身情况替换的文字以及由上下文决定的一些值。
这个图标表示一般的注释。
这个图标表示建议或者小贴士。
这个图标表示警告。
代码示例的使用一些补充材料(代码示例、练习等)可以从地址https://github.com/osrf/rosbook获取。
本书的目的是帮助你完成工作。为了达到这个目的,上述链接指向的代码仓库中的代码根据Apache 2.0许可证是可用的,这一许可证允许你重用代码。
我们希望但是不强制你引用本书。一条引用通常包含书名、作者、出版商以及ISBN,如“Programming Robots with ROS by Morgan Quigley, Brian Gerkey, and William D. Smart (O扲eilly). Copyright 2015 Morgan Quigley, Brian Gerkey, and William D. Smart, 978-1-4493-2389-9”。
如果你感觉你对代码的利用超出了正常使用范围或上述许可范围,请联系我们:permissions@oreilly.com。
Safari在线电子书Safari Book Online是一个在线的电子图书馆,收录了大量当下热门的电子图书及配套的影像资料,涵盖商业的技术领域的各个方面。得到了技术专家、软件开发人员、网页设计师和商业人士的广泛使用和认可。通过它,你可以获取研究资料、解决难题、学习新知识和接受技术培训等。
Safari Books Online针对企业、政府和教育机构提供了不同的购买计划,你可以根据实际需求进行选购。
购买Safari Books Online服务后,你就可以通过在线数据库搜索访问数以千计的书籍、培训视频甚至是预出版的样书。这些资料来自于包括O扲eilly Media、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones & Bartlett、Course Technology等出版社。
如何联系我们美国:
O扲eilly Media,Inc.1005 Gravenstein Highway NorthSebastopol,CA 95472中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)奥莱利技术咨询(北京)有限公司本书也有一个配套网站,网站上的内容包括勘误表、代码示例以及一些与本书相关的额外信息。网站的地址是:http://bit.ly/prog_robots_w_ros。
如果有关于本书的技术性疑问,请发电子邮件至bookquestions@oreilly.com。
关于本书的更多信息,如相关课程、会议、新闻等,请访问我们的网站http://www.oreilly.com。
致谢首先,也是最重要的,我们要感谢O扲eilly的三位编辑Mike Loukides、Meg Blanchette 以及Dawn Schanafelt。在本书写作过程中,他们表现出了极大的耐心和极高的责任心。我们还要感谢所有为本书提供反馈的人,尤其是Andreas Bihlmaier、Jon Bohren、Zach Dodds和Kat Scott。他们的评论和建议让本书变得更好。
当然,我们还要感谢所有帮助我们调试从而使ROS在我们的机器人上正常运行的人。Mike Ferguson提供了Fetch示例。来自开源机器人基金会(Open Source Robotics Foundation,OSRF)的Stev
目录
前言 1
第一部分 基础知识
第1章 概述 9
简史 9
理念 10
安装 11
小结 12
第2章 预备知识 13
ROS图 13
roscore 15
catkin、工作区以及ROS程序包 16
rosrun 19
命名、命名空间以及重映射 24
roslaunch 25
tab键 26
tf:坐标系转换 27
小结 30
第3章 话题 31
将消息发布到话题上 32
订阅一个话题 36
锁存话题 38
定义自己的消息类型 39
让发布者和订阅者协同工作 46
小结 47
第4章 服务 48
定义服务 48
实现服务 51
使用服务 54
小结 56
第5章 动作 57
动作的定义 58
实现一个基本的动作服务器 59
动作的使用 62
实现一个更复杂的动作服务器 64
使用更复杂的动作 66
小结 69
第6章 机器人与仿真器 71
子系统 71
机器人系统举例 79
仿真器 83
小结 86
第7章 Wander-bot 88
创建包 88
读取传感器数据 91
感知环境并移动:Wander-bot 94
小结 96
第二部分 使用ROS驱动机器人行走
第8章 遥控机器人 99
开发模式 100
键盘驱动 100
运动生成器 102
参数服务器 107
速度斜坡曲线 109
开车 111
rviz 113
小结 120
第9章 创建环境地图 121
ROS中的地图 121
使用rosbag记录数据 124
创建地图 125
启动地图服务器以及查看地图 131
小结 133
第10章 在真实环境中的导航 135
在地图中定位机器人 135
使用ROS的导航软件包 139
在代码中进行导航 144
小结 145
第11章 下棋机器人 146
关节、连接以及传动链 147
成功的关键 150
安装和运行一台仿真R2 152
在命令行中移动R2 155
在棋盘上移动R2的机械臂 156
操作机械手 158
对棋盘建模 159
重演著名的棋局 163
小结 167
第三部分 感知和行为
第12章 循线机器人 171
采集图像 171
检测指示线 177
循线运动 182
小结 184
第13章 巡航 185
简单巡航 185
状态机 186
用smach构建状态机 188
用状态机实现巡航 195
小结 198
第14章 仓储机器人 199
仓库模拟环境 199
驶入隔间 210
拾取物体 214
小结 224
第四部分 添加自定义ROS组件
第15章 添加你自己的传感器和执行器 227
添加你自己的传感器 227
添加你自己的执行器 234
小结 240
第16章 添加你自己的移动机器人:第一部分 242
小龟机器人 242
ROS 消息接口 244
硬件驱动 247
使用 URDF对机器人建模247
在 Gazebo 中进行仿真 255
小结 261
第17章 添加你自己的移动机器人:第二部分 262
验证坐标变换信息 262
添加激光传感器 266
配置导航程序栈 270
使用 rviz 定位和控制导航中的机器人 275
小结 278
第18章 添加你自己的机械臂 279
猎豹机械臂 279
ROS 消息接口 281
硬件驱动 282
对机器人建模:使用 URDF 282
在 Gazebo 中进行仿真 287
验证坐标变换信息 294
配置 MoveIt 297
使用 rviz 控制机械臂 301
小结 303
第19章 添加软件库 305
让你的机器人开口说话:使用 pyttsx305
小结 312
第五部分 ROS使用小知识
第20章 ROS小工具 315
主机及其相关组件:roscore315
参数管理:rosparam 316
文件系统导航:roscd 317
节点启动:rosrun 318
多节点启动:roslaunch 318
多节点系统测试:rostest 321
系统监控:rosnode、rostopic、rosmsg、rosservice和rossrv 324
小结 327
第21章 机器人行为调试 329
日志消息: /rosout和rqt_console 329
节点、话题和连接:rqt_graph和rosnode 336
传感器融合: 使用 rviz 343
绘制数据图表:使用 rqt_plot 344
数据记录和分析: 使用rosbag和rqt_bag 346
小结 350
第22章 ROS在线社区 351
社区的礼仪 351
ROS 维基 352
ROS Answers: 一个 ROS 问答社区 353
bug 追踪与新特性请求 354
邮件列表与ROS兴趣小组 354
查找和分享代码 354
小结 355
第23章 用C++编写ROS程序 356
C++(或其他语言)的使用场景 356
使用catkin编译C++ 357
在Python和C++之间来回移植程序 359
小结 364