Preface 前 言
本书概括性地介绍了ROS 系统的各种工具。ROS 是一个先进的机器人操作系统框架,
现今已有数百个研究团体和公司将其应用在机器人技术产业中。对于机器人技术的非专业人
士来说,它也相对容易上手。在本书中,你将了解如何安装 ROS,如何开始使用ROS 的基
本工具,以及如何最终应用先进的计算机视觉和导航工具。
在阅读本书的过程中无需使用任何特殊的设备。书中每一章都附带了一系列的源代码
示例和教程,你可以在自己的计算机上运行。这是你唯一需要做的事情。当然,我们还会
告诉你如何使用硬件,这样,你可以将你的算法应用到现实环境中。我们在选择设备时特
意去选择一些业余用户负担得起的设备,并同时涵盖了在机器人研究中最典型的传感器或
执行机构。
最后,由于ROS 系统的存在使得整个机器人具备在虚拟环境中工作的能力。你将学习
如何创建自己的机器人并结合功能强大的导航功能包集。此外如果使用Gazebo 仿真环境,
你将能够在虚拟环境中运行一切。我们会在本书的结尾提供一个能够在ROS 虚拟环境中进
行模拟试验的机器人列表。你将发现你已经可以与机器人一起工作,并理解其背后的原理。
主要内容
第1 章简单介绍安装ROS 系统的方法,同时还介绍ROS 不同版本的安装包的安装,本
书使用的是ROS Fuerte。这一章还会说明如何从Debian 软件包安装或从源代码进行编译安
装,以及在虚拟机中安装。
第2 章涉及ROS 框架及相关的概念和工具。该章介绍节点、 主题和服务,以及如何使用
它们,还将通过一系列示例来说明如何调试一个节点或通过可视化方法直观地查看通过主题
所发布的消息。
第3 章进一步展示ROS 强大的调试工具,以及通过对节点主题的图形化可以将节点间
的通信数据可视化。ROS 提供一个日志记录 API,允许轻松地诊断节点的问题。事实上在使
用过程中,我们会看到一些功能强大的图形化工具如 rxconsole 和 rxgraph,以及可视化接口
VI
如 rxplot 和 rviz。最后介绍如何使用 rosbag 和 rxbag 记录和回放消息。
第4 章介绍ROS 系统与真实世界如何连接。这一章介绍在ROS 下使用的一些常见传感
器和执行机构,如激光雷达、伺服电动机、摄像头、RGB-D 传感器等设备。此外,还会解释
如何使用嵌入式系统与微控制器,例如非常流行的Arduino。
第5 章介绍我们在ROS 系统中实现机器人的第一步是在ROS 中创建一个机器人模型,
包括在Gazebo 仿真环境中如何从头开始对一个机器人进行建模和仿真,并使其在仿真环境
中运行。这是后续学习如何使用ROS 的导航功能包集和其他工具的前提条件。
第6 章介绍ROS 对摄像头和计算机视觉任务的支持。首先使用FireWire 和USB 摄像头
驱动程序将摄像头连接到计算机并采集图像。然后,你就可以使用ROS 的标定工具标定你
的摄像头。我们会详细介绍和说明什么是图像管道,学习如何使用集成了OpenCV 的多个机
器视觉API。最后,安装并使用一个视觉测距软件。
第7 章是本书关于ROS 导航功能包集的两章中的第1 章。介绍如何对你的机器人进行
使用导航功能包集所需的初始化配置。然后用几个例子对导航功能包集进行说明。
第8 章延续第7 章的内容,介绍如何使用导航功能包集使我们的机器人有效地自主导
航。本章介绍使用ROS 的Gazebo 仿真环境和rviz 创建一个虚拟的环境,并在其中构建地
图、定位我们的机器人并做路径规划与避障。
第9 章结合前面几章所学的内容,介绍能够支持ROS 并使用Gazebo 仿真环境的一些机
器人。在该章中,你将看到如何在仿真环境中运行这些机器人,并执行几项本书中介绍过的
任务,尤其是与导航功能包集相关的。
预备知识
我们写作本书的目的是希望尽可能让每位读者都可以完成本书的学习并运行示例代码。
基本上,你只需要在计算机上安装一个 Linux 发行版。虽然每个Linux 发行版本应该都能使
用,但还是建议你使用Ubuntu 的最新版。这样你可以根据第1 章的内容安装ROS Fuerte。
对于ROS 的这一版本,你将需要Ubuntu 12.10 之前的版本,因为之后的版本已经不再支持
Fuerte 了。
对于硬件要求,一般来说任何台式计算机或笔记本电脑都满足。但是,最好使用独立显
卡来运行Gazebo 仿真环境。此外,如果能够有足够的外围接口将会更好,因为这样你可以
连接几个传感器和执行机构,包括摄像头和Arduino。
你还需要 Git( git-core Debian 软件包),以便从本书提供的软件源下载源代码。同样,你
需要具备Bash 命令行、GNU/Linux 工具的基本知识和一些 C/C++ 编程技巧。
VII
目标读者
本书的目标读者包括所有机器人开发人员,可以是初学者也可以是专业人员。它涵盖了
整个机器人系统的各个方面,展示了ROS 系统如何帮助完成机器人真正自主化的任务。对
于听说过ROS 却从未使用过的机器人领域的学生或科研人员来说,本书将是非常有益的。
ROS 初学者能从本书中学习很多ROS 软件框架的先进理念和工具。不仅如此,经常使用
ROS 的用户也可能从某些章节中学习到一些新东西。当然,只有前3 章是纯粹为初学者准备
的,所以那些已经使用过ROS 的人可以跳过这部分直接阅读后面的章节。
排版说明
在本书中,你会发现一些文本的样式与其他正文内容不同。下面是一些样式的示例及含义。
当我们希望能够着重显示示例代码中的某些内容的时候,相关的代码行会如下表示:
[ 4 ]
Conventions
In this book, you will find a number of styles of text that distinguish between
different kinds of information. Here are some examples of these styles, and an
explanation of their meanings.
Code words in text are shown as follows: "The *-ros-pkg contributed packages
are licensed under a variety of open source licenses."
A block of code is set as follows:
<package>
<description brief="short description">
long description,
</description>
<author>Aaron Martinez, Enrique Fernandez</author>
<license>BSD</license>
<url>http://example.com/</url>
<depend package="roscpp"/>
<depend package="common"/>
<depend package="otherPackage"/>
<versioncontrol type="svn" url="https://urlofpackage/trunk"/>
<export>
<cpp cflags="-I${prefix}/include" lflags="-L${prefix}/lib -lros"/>
</package>
When we wish to draw your attention to a particular part of a code block,
the relevant lines or items are set in bold:
<launch>
<node pkg="chapter3_tutorials" type="example1"
name="example1" output="screen"
launch-prefix="xterm -e gdb --args"/>
</launch>
Any command-line input or output is written as follows:
$ rosrun book_tutorials tutorialX _param:=9.0
New terms and important words are shown in bold. Words that you see on the screen,
in menus, or dialog boxes for example, appear in the text like this: "We must have
clicked on the Play button at least once."
Bash 命令行下输入的命令或显示的结果如下表示:
[ 4 ]
Conventions
In this book, you will find a number of styles of text that distinguish between
different kinds of information. Here are some examples of these styles, and an
explanation of their meanings.
Code words in text are shown as follows: "The *-ros-pkg contributed packages
are licensed under a variety of open source licenses."
A block of code is set as follows:
<package>
<description brief="short description">
long description,
</description>
<author>Aaron Martinez, Enrique Fernandez</author>
<license>BSD</license>
<url>http://example.com/</url>
<depend package="roscpp"/>
<depend package="common"/>
<depend package="otherPackage"/>
<versioncontrol type="svn" url="https://urlofpackage/trunk"/>
<export>
<cpp cflags="-I${prefix}/include" lflags="-L${prefix}/lib -lros"/>
</package>
When we wish to draw your attention to a particular part of a code block,
the relevant lines or items are set in bold:
<launch>
<node pkg="chapter3_tutorials" type="example1"
name="example1" output="screen"
launch-prefix="xterm -e gdb --args"/>
</launch>
Any command-line input or output is written as follows:
$ rosrun book_tutorials tutorialX _param:=9.0
New terms and important words are shown in bold. Words that you see on the screen,
in menus, or dialog boxes for example, appear in the text like this: "We must have
clicked on the Play button at least once."
Chapter 7
Notice that the data is the same as the one you can
see on the Gazebo screen.
As you can observe, Gazebo is creating the odometry as the robot moves. We are
going to see how Gazebo creates it by looking inside the plugin's source code.
The plugin file is located in the erratic_gazebo_plugins package, and the file is
diffdrive_plugin.cpp. Open the file and you will see the following code inside
the file:
$ rosed erratic_gazebo_plugins diffdrive_plugin.cpp
The file has a lot of code, but the important part for us now is the following function,
publish_odometry():
void DiffDrivePlugin::publish_odometry()
{
ros::Time current_time = ros::Time::now();
std::string odom_frame = tf::resolve(tf_prefix_, "odom");
std::string base_footprint_frame = tf::resolve(tf_prefix_, "base_
footprint");
// getting data for base_footprint to odom transform
math:ose pose = this->parent->GetState().GetPose();
btQuaternion qt(pose.rot.x, pose.rot.y, pose.rot.z, pose.rot.w);
警告或注意事项会这样显示。
[ 16 ]
chapters of this book, we will need to use tools, and if we don't install it now, we
will have to do it later:
• The easiest (and recommended if you have enough hard disk space)
installation is known as desktop-full. It comes with ROS, the Rx tools, the
rviz visualizer (for 3D), many generic robot libraries, the simulator in 2D
(such as stage) and 3D (usually Gazebo), the navigation stack (to move,
localize, do mapping, and control arms), and also perception libraries
using vision, lasers, or RGB-D cameras:
$ sudo apt-get install ros-fuerte-desktop-full
• If you do not have enough disk space, or you prefer to install only a few
stacks, first install only the desktop installation file, which comes only with
ROS, the Rx tools, rviz, and generic robot libraries. Later, you can install the
rest of the stacks when you need them (using aptitude and looking for the
ros-electric-* stacks, for example):
$ sudo apt-get install ros-fuerte-desktop
• If you only want the bare bones, install ROS-comm, which is usually
recommended for the robot itself or computers without a screen or just
a TTY. It will install the ROS package with the build and communication
libraries and no GUI tools at all:
$ sudo apt-get install ros-fuerte-ros-comm
• Finally, along with whatever option you choose from the list, you can
install individual/specific ROS stacks (for a given stack name):
$ sudo apt-get install ros-fuerte-STACK
Do not worry if you are installing things that you do not know. In the upcoming
chapters, you will learn about everything you are installing and how to use it.
When you gain experience with ROS, you can make basic installations in your robots
using only the core of ROS, using less resources, and taking only what you need.
Downloading the example code
You can download the example code files for all Packt books you have
purchased from your account at http://www.packtpub.com. If you
purchased this book elsewhere, you can visit http://www.packtpub.
com/support and register to have the files e-mailed directly to you.
You can also download these code files from https://github.com/
AaronMR/Learning_ROS_for_Robotics_Programming.
提示与小窍门会这样显示。
读者反馈
我们非常欢迎读者能够提出意见与建议。让我们知道你关于本书的一些想法,例如:你
喜欢什么,不喜欢什么。读者的反馈对我们是非常重要的,这让我们知道我们最需要做的是
什么。
向我们反馈信息只需发送电子邮件至 feedback@packtpub.com,并在邮件的主题中说明
书籍名称。
如果你在某项上有所专长,或者你有兴趣写一本书或者为书籍的出版做出贡献,你可以
浏览 www.packtpub.com/authors 阅读我们的作者指南。
VIII
读者支持
你现在自豪地拥有了Packt 出版的书籍,我们会帮助你使你购买的产品物超所值。
源代码下载
可以访问http://www.packtpub.com/support,完成网站注册并通过E-mail 接收所有代码
文件。
彩色图片下载
我们同时提供包含了本书所有彩色的屏幕截图、对话框的PDF 文件,这些彩色图片能
够更好地帮助你理解输出的变化。可以从这里下载这个文件:http://www.packtpub.com/sites/
default/files/ downloads/1448OS_Graphics.pdf。
勘误
虽然我们已尽力确保本书内容的准确性,但错误在所难免。如果你在我们的书中发现
错误,即使是一个错字或一段错误的代码,我们将非常感谢你把错误告知我们。这样可以
避免其他读者发生困扰并帮助我们提高本书后续版本的质量。如果你发现任何错误,请访问 http://www.packtpub.com/ submit-errata 报告这些问题。访问网页,选择你的书,点击勘误提
交表格的链接,并输入你的勘误细节。一旦确认了你的勘误,我们会告知你的提交被接受并
在我们的网站上更新勘误表。你可以在http://www. packtpub.com/support 根据你选择的标题
查看现有的勘误表。
问题
如果关于本书你有任何疑问,请联系我们 questions@packtpub.com,我们会竭尽所能为
你解答。
译者序
前 言
第1 章 ROS 系统入门 1
1.1 使用软件源安装ROS Electric 3
1.1.1 添加软件源到sources.list
文件中 4
1.1.2 设置密码 4
1.1.3 安装 4
1.1.4 环境配置 5
1.2 使用软件源安装ROS Fuerte 6
1.2.1 配置Ubuntu 软件源 6
1.2.2 配置source.list 文件 6
1.2.3 设置密码 7
1.2.4 安装 7
1.2.5 环境配置 8
1.2.6 独立工具 9
1.3 如何安装VirtualBox 和Ubuntu 9
1.3.1 下载VirtualBox 9
1.3.2 创建虚拟机 10
1.4 本章小结 12
第2 章 ROS 系统架构及示例 13
2.1 理解ROS 文件系统级 13
2.1.1 功能包 14
2.1.2 功能包集 16
2.1.3 消息类型 16
2.1.4 服务类型 17
2.2 理解ROS 计算图级 18
2.2.1 节点 19
2.2.2 主题 20
2.2.3 服务 21
2.2.4 消息 22
2.2.5 消息记录包 22
2.2.6 节点管理器 22
2.2.7 参数服务器 22
2.3 理解ROS 开源社区级 23
2.4 ROS 系统试用练习 23
2.4.1 ROS 文件系统导览 24
2.4.2 创建工作空间 24
2.4.3 创建ROS 功能包 25
2.4.4 编译ROS 功能包 26
2.4.5 使用ROS 节点 26
2.4.6 使用主题与节点交互 28
2.4.7 学习如何使用服务 31
2.4.8 使用参数服务器 33
2.4.9 创建节点 34
2.4.10 编译节点 36
Contents 目 录
X
2.4.11 创建msg 和srv 文件 37
2.4.12 使用新建的srv 和msg
文件 38
2.5 本章小结 42
第3 章 调试和可视化 43
3.1 调试ROS 节点 44
3.1.1 使用GDB 调试器调试
ROS 节点 45
3.1.2 ROS 节点启动时调用
GDB 调试器 46
3.1.3 设置ROS 节点core 文件
转存 47
3.2 调试信息 47
3.2.1 输出调试信息 47
3.2.2 设置调试信息级别 48
3.2.3 为特定节点配置调试
信息级别 48
3.2.4 信息命名 50
3.2.5 条件显示信息与过滤信息 50
3.2.6 信息的更多功能——单次
显示、可调、组合 51
3.2.7 使用rosconsole 和rxconsole
在运行时修改调试级别 52
3.3 监视系统状态 56
3.3.1 节点、主题与服务列表 56
3.3.2 使用rxgraph 在线监视
节点状态图 56
3.4 当奇怪的事情发生——使用
roswtf 58
3.5 画标量数据图 58
3.5.1 用rxplot 画出时间趋势
曲线 59
3.5.2 另一个画图工具rxtools 60
3.6 图像可视化 61
3.6.1 显示单一图片 61
3.6.2 FireWire 接口摄像头 62
3.6.3 使用双目立体视觉 63
3.7 3D 可视化 64
3.7.1 使用rviz 在3D 世界中
实现数据可视化 64
3.7.2 主题与坐标系的关系 66
3.7.3 可视化坐标变换 67
3.8 保存与回放数据 68
3.8.1 什么是消息记录包文件 69
3.8.2 使用rosbag 在包文件中
记录数据 69
3.8.3 回放消息记录文件 70
3.8.4 使用rxbag 检查消息记录
包的主题和消息 71
3.9 rqt 插件与rx 应用 72
3.10 本章小结 73
第4 章 在ROS 下使用传感器
和执行机构 74
4.1 使用游戏杆或游戏手柄 74
4.1.1 joy_node 如何发送游戏杆
动作消息 75
4.1.2 使用游戏杆数据在turtlesim
中移动海龟 76
4.2 使用激光雷达——Hokuyo
URG-04lx 79
4.2.1 了解激光雷达如何在 ROS
中发送数据 80
4.2.2 访问和修改激光雷达
数据 82
XI
4.3 使用Kinect 传感器查看3D
环境 84
4.3.1 如何发送和查看Kinect
数据 85
4.3.2 创建和使用Kinect 示例 86
4.4 使用伺服电动机——
Dynamixel 88
4.4.1 Dynamixel 如何发送和
接收运动命令 89
4.4.2 创建和使用伺服电动机
示例 90
4.5 使用Arduino 添加更多的
传感器和执行机构 91
4.6 使用惯性测量模组——
Xsens MTi 94
4.6.1 Xsens 如何在ROS 中
发送数据 95
4.6.2 创建和使用Xsens 示例 96
4.7 使用低成本惯性测量模组
IMU-10 自由度 98
4.7.1 下载加速度传感器库 99
4.7.2 Arduino Nano 和10 自由度
传感器编程 99
4.7.3 创建ROS 节点并使用10
自由度传感器数据 101
4.8 本章小结 103
第5 章 3D 建模与仿真 104
5.1 自定义机器人在ROS 中的3D
模型 104
5.2 创建第一个URDF 文件 104
5.2.1 解释文件格式 106
5.2.2 在rviz 里查看3D 模型 107
5.2.3 加载图形到机器人模型 109
5.2.4 使机器人模型运动 109
5.2.5 物理和碰撞属性 110
5.3 xacro——一个写机器人模型的
更好方法 111
5.3.1 使用常量 111
5.3.2 使用数学方法 112
5.3.3 使用宏 112
5.3.4 使用代码移动机器人 112
5.3.5 使用SketchUp 进行3D
建模 116
5.4 在ROS 中仿真 117
5.4.1 在Gazebo 中使用
URDF3D 模型 117
5.4.2 在Gazebo 中添加传感器 120
5.4.3 在Gazebo 中加载和使用
地图 121
5.4.4 在Gazebo 中移动机器人 123
5.5 本章小结 125
第6 章 机器视觉 126
6.1 连接和运行摄像头 128
6.1.1 FireWire IEEE1394
摄像头 128
6.1.2 USB 摄像头 132
6.2 使用OpenCV 制作USB 摄像头
驱动程序 133
6.2.1 创建 USB 摄像头驱动
功能包 134
6.2.2 使用ImageTransport API
发布摄像头帧 135
6.2.3 使用 cv_bridge 进行OpenCV
和 ROS 图像处理 138
XII
6.2.4 使用ImageTransport 发布
图像 139
6.2.5 在ROS 中使用OpenCV 139
6.2.6 显示摄像头输入的图像 140
6.3 如何标定摄像头 140
6.4 ROS 图像管道 147
6.5 对于计算机视觉任务有用的
ROS 功能包 152
6.6 使用viso2 执行视觉测距 153
6.6.1 摄像头位姿标定 154
6.6.2 运行 viso2 在线演示 156
6.6.3 使用低成本双目摄像头
运行 viso2 158
6.7 本章小结 159
第7 章 导航功能包集入门 160
7.1 ROS 导航功能包集 160
7.2 创建转换 161
7.2.1 创建广播机构 162
7.2.2 创建侦听器 162
7.2.3 查看坐标变换树 164
7.3 发布传感器信息 165
7.4 发布里程数据 168
7.4.1 Gazebo 如何获取里程
数据 169
7.4.2 创建自定义里程数据 171
7.5 创建基础控制器 175
7.5.1 使用Gazebo 创建里程
数据 176
7.5.2 创建基础控制器 178
7.6 使用ROS 创建地图 180
7.6.1 使用map_server 保存
地图 181
7.6.2 使用map_server 加载
地图 182
7.7 本章小结 183
第8 章 导航功能包集进阶 184
8.1 创建功能包 184
8.2 创建机器人配置 184
8.3 配置全局和局部代价地图 187
8.3.1 基本参数的配置 187
8.3.2 全局代价地图的配置 188
8.3.3 局部代价地图的配置 189
8.4 基本局部规划器配置 189
8.5 为导航功能包集创建启动文件 190
8.6 为导航功能包集设置rviz 191
8.6.1 2D 位姿估计 191
8.6.2 2D 导航目标 192
8.6.3 静态地图 193
8.6.4 点云 193
8.6.5 机器人立足点 193
8.6.6 障碍 194
8.6.7 膨胀障碍 194
8.6.8 全局规划 195
8.6.9 局部规划 195
8.6.10 规划器规划 196
8.6.11 当前目标 196
8.7 自适应蒙特卡罗定位 197
8.8 避免障碍 199
8.9 发送目标 200
8.10 本章小结 202
XIII
第9 章 在实践中学习 203
9.1 REEM——类人形PAL
机器人 204
9.1.1 从官方软件源安装
REEM 205
9.1.2 使用Gazebo 仿真环境
运行REEM 208
9.2 PR2——柳树车库机器人 210
9.2.1 安装 PR2 仿真环境 210
9.2.2 在仿真环境中运行PR2 211
9.2.3 生成地图与定位 214
9.2.4 在仿真环境中运行PR2
演示程序 216
9.3 Robonaut 2——NASA 的敏捷
型人形机器人 217
9.3.1 从软件源安装
Robonaut 2 217
9.3.2 在国际空间站的固定支座
上运行Robonaut2 218
9.4 Husky——Clearpath 的轮式
机器人 222
9.4.1 安装Husky 仿真环境 222
9.4.2 运行Husky 仿真环境 222
9.5 TurtleBot——低成本移动
机器人 224
9.5.1 安装TurtleBot 仿真环境 224
9.5.2 运行TurtleBot 仿真环境 224
9.6 本章小结 225