收藏 分享(赏)

机器人操作系统(ROS)浅析.pdf

上传人:weiwoduzun 文档编号:3304686 上传时间:2018-10-11 格式:PDF 页数:181 大小:1.87MB
下载 相关 举报
机器人操作系统(ROS)浅析.pdf_第1页
第1页 / 共181页
机器人操作系统(ROS)浅析.pdf_第2页
第2页 / 共181页
机器人操作系统(ROS)浅析.pdf_第3页
第3页 / 共181页
机器人操作系统(ROS)浅析.pdf_第4页
第4页 / 共181页
机器人操作系统(ROS)浅析.pdf_第5页
第5页 / 共181页
点击查看更多>>
资源描述

1、 i 机器人操作系统(ROS)浅析 美 Jason M. OKane 著 肖军浩 译 ii 作者通讯地址: 国防科学技术大学机电工程与自动化学院 肖军浩 博士 地址:湖南省长沙市开福区砚瓦池正街137号 邮编:410073 版权信息: 2015,肖军浩,版权所有。 本书上传至互联网供读者免费下载,版权归肖军浩个人所有。未经许可,不得以任何方式复制或抄袭本书之部分或全部内容用于商业目的。 iii 前 言 因为集成了全世界机器人领域顶级科研机构,包括斯坦福大学、麻省理工学院、慕尼黑工业大学、加州大学伯克利分校、佐治亚理工大学、弗莱堡大学、东京大学等多年的研究成果,开源机器人操作系统(Robot O

2、perating System,简称ROS)甫一问世便受到了科研人员的广泛关注。随后,ROS又借助开源的魅力吸引了世界各地机器人领域的仁人志士群策群力,推动其不断进步。2013年麻省理工学院科技评论(MIT Technology Review)指出:“从2010年发布1.0版本以来,ROS已经成为机器人软件的事实标准(de facto standard)”。 译者在德国汉堡大学攻读博士学位期间,有幸于2010年成为ROS的第一批用户,并将其介绍给身边的同事以及国防科技大学的老师和同学。2013年,译者所在研究团队将NuBot中型组足球机器人的软件系统移植到了ROS框架下,并于2014年和201

3、5年分别参加了在巴西若昂佩索阿和中国合肥举办的机器人足球世界杯。使用ROS后NuBot足球机器人软件系统的鲁棒性、易用性和可维护性均有大幅度提高。对我们将ROS用于中型组足球机器人的工作,国际同行给予了非常积极的评价。 译者连续两年将ROS的使用作为国防科技大学高年级本科生实践教学的重要环节,发现一个普遍问题:学生能够迅速理解ROS的框架结构和基本概念,但是实际使用时问题却层出不穷,而其中大部分是共性问题!OKane教授这本“A Gentle Introduction to ROS”对ROS初学过程中的常见问题做了全面的总结。当然,这本书不仅仅是常见问题汇编,它还对概念和工具做了比在线文档更深

4、入的剖析!故而,译者在征求OKane教授的同意后,将该书译为中文,供中国的ROS初学者在实际使用时参考。 iv 首先,感谢OKane教授对于本书翻译工作的的肯定和支持。其次,本书的翻译得到国防科学技术大学“控制科学与工程高级专题”课程师生的大力支持,其中赵云云、李峻翔、肖志鹏、贾凡、朱琪、郭昭宇、王志强、陈春玉、魏翔宇分别参与了部分章节的翻译工作。此外,王祥科博士审阅了初稿并提出了许多宝贵的意见,对此,译者表示诚挚的谢意。最后,感谢NuBot研究团队全体成员对于本书的支持和帮助。 限于译者水平,书中难免会有不足之处,热切地希望得到各位读者的宝贵意见。作者的E-mail地址是:junhao.xi

5、aoieee.org。 译者 2015年9月于长沙 v 目 录 第1章 绪论 1 1.1 选择ROS的理由 1 1.2 内容概述 5 1.3 行文约定 7 1.4 更多信息 7 1.5 下一章简介 10 第2章 入门概述 11 2.1 安装ROS . 11 2.2 配置账户 . 14 2.3 使用TURTLESIM的小例子 16 2.4 功能包/软件包(PACKAGES) 18 2.5 节点管理器(T HE MASTER) . 22 2.6 节点(N ODES) . 23 2.7 话题和消息 . 26 2.8 一个更复杂的例子 . 39 2.9 问题检查 . 43 2.10 展望 . 43 第

6、3章 编写ROS程序 45 3.1 创建工作区和功能包 . 45 3.2 你好,ROS! . 48 3.3 发布者程序 . 55 vi 3.4 订阅者程序 . 65 3.5 展望 . 71 第4章 日志消息 73 4.1 严重级别 . 73 4.2 示例程序 . 74 4.3 生成日志消息 . 76 4.4 查看日志消息 . 81 4.5 启用和禁用日志消息 . 88 4.6 展望 . 92 第5章 计算图源命名 93 5.1 全局名称 . 93 5.2 相对名称 . 95 5.3 私有名称 . 97 5.4 匿名名称(A NONYMOUS NAMES) 98 5.5 展望 . 100 第6章

7、 启动文件 101 6.1 使用启动文件 . 101 6.2 创建启动文件 . 105 6.3在命名空间内启动节点 . 110 6.4 名称重映射(R EMAPPING NAMES) 113 6.5 启动文件的其他元素 . 119 6.6 展望 . 126 vii 第7章 参数 127 7.1 通过命令行获取参数 . 127 7.2 例:TURTLESIM中的参数 . 131 7.3 使用C+获取参数 134 7.4 在启动文件中设置参数 . 137 7.5 展望 . 140 第8章 服务 141 8.1 服务的专用术语 . 141 8.2 从命令行查看和调用服务 . 142 8.3 客户端程

8、序 . 148 8.4 服务器程序 . 153 8.5 展望 . 159 第9章 消息录制与回放 . 161 9.1录制与回放包文件 . 161 9.2 示例:正方形运动轨迹的包文件 . 163 9.3启动文件里面的包文件 . 167 9.4 展望 . 170 第10章 总结 171 10.1 下一步 . 171 10.2 展望 . 174 1 第1章 绪论合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。 老子 本章主要介绍ROS系统的优势和本书的框架结构。 1.1 选择ROS的理由 近年来,机器人领域取得了举世瞩目的进展。性价比较高的机器人平台,包括地面移动机器人、旋翼无人机和类

9、人机器人等,得到了广泛应用。更令人感到振奋的是,越来越多的高级智能算法让机器人的自主等级逐步提高。 尽管如此,对于机器人软件开发人员来说,仍然存在着诸多挑战。本书主要介绍一个软件平台,即机器人操作系统1(Robot Operating System, 或简称ROS),它可以帮助提高机器人软件的开发效率。ROS系统的官方定义如下: ROS是面向机器人的开源的元操作系统(meta -operating system)1。它能够提供类似传统操作系统的诸多功能,如硬件抽象、底层设备控制、常用功能实现、进程间消息传递和程序包管理等。此外,它还提供相关工具和库,用于获取、编译、编辑代码以及在多个计算机之间

10、运行程序完成分布式计算。 虽然上述定义很准确,强调了ROS与传统操作系统的异同, 本章由肖军浩、赵云云翻译。 1http:/wiki.ros.org/ROS/Introduction 2 但可能仍然无法让读者抓住ROS的核心要义,尤其是使用ROS能够给机器人软件开发带来哪些优势。一般而言,学习一个新的系统框架,特别是ROS这样复杂多样的框架,往往要耗费大量的时间和精力,因此我们必须确保付出这个代价是有意义的。下面简单列举几个使用ROS能够解决的机器人软件开发问题。 分布式计算 现代机器人系统往往需要多个计算机同时运行多个进程,例如: 一些机器人搭载多台计算机,每台计算机用于控制机器人的部分驱动

11、器或传感器; 即使只有一台计算机,通常仍将程序划分为独立运行且相互协作的小的模块来完成复杂的控制任务,这也是常见的做法; 当多个机器人需要协同完成一个任务时,往往需要互相通信来支撑任务的完成; 用户通常通过台式机、笔记本或者移动设备发送指令控制机器人,这种人机交互接口可以认为是机器人软件的一部分。 单计算机或者多计算机不同进程间的通信问题是上述例子中的主要挑战。ROS为实现上述通信提供两种相对简单、完备的机制,我们将在第三章和第八章进行详细讨论。 软件复用 随着机器人研究的快速推进,诞生了一批应对导航、路径规划、建图等通用任务的算法。当然,任何一个算法实用的前提是其能够应用于新的领域,且不必重

12、复实现。事实上,如何将现有算法快速移植到不同系统一直是一个挑战,ROS通过以下两种方法解决这个问题。 ROS标准包(Standard Packages)提供稳定、可调式的各类重3 要机器人算法实现。 ROS通信接口正在成为机器人软件互操作的事实标准,也就是说绝大部分最新的硬件驱动和最前沿的算法实现都可以在ROS中找到。例如,在ROS的官方网页2上有着大量的开源软件库,这些软件使用ROS通用接口,从而避免为了集成它们而重新开发新的接口程序。 综上所述,开发人员如果使用ROS可以当然,在具备ROS基础知识后将更多的时间用于新思想和新算法的设计与实现,尽量避免重复实现已有的研究结果。 快速测试 为机

13、器人开发软件比其他软件开发更具挑战性,主要是因为调试准备时间长,且调试过程复杂。况且,因为硬件维修、经费有限等因素,不一定随时有机器人可供使用。ROS提供两种策略来解决上述问题。 精心设计的ROS系统框架将底层硬件控制模块和顶层数据处理与决策模块分离,从而可以使用模拟器替代底层硬件模块,独立测试顶层部分,提高测试效率。 ROS另外提供了一种简单的方法可以在调试过程中记录传感器数据及其他类型的消息数据,并在试验后按时间戳回放。通过这种方式,每次运行机器人可以获得更多的测试机会。例如,可以记录传感器的数据,并通过多次回放测试不同的数据处理算法。在ROS术语中,这类记录的数据叫作包(bag),一个被

14、称为rosbag的工具可以用于记录和回放包数据,见第9章。 2http:/wiki.ros.org/browse 4 采用上述方案的一个最大优势是实现代码的“无缝连接”,因为实体机器人、仿真器和回放的包可以提供同样(至少是非常类似)的接口,上层软件不需要修改就可以与它们进行交互,实际上甚至不需要知道操作的对象是不是实体机器人。 当然,ROS操作系统并不是唯一具备上述能力的机器人软件平台。在笔者看来,ROS的最大不同在于来自机器人领域诸多开发人员的认可和支持,这种支持将促使ROS的未来不断发展、完善、进步。 对ROS的误解 最后,让我们用一点时间来澄清容易对ROS产生的误解,另一个侧面来认识RO

15、S。 ROS不是一种编程语言。实际上,ROS的主要代码由C+语言3编写,本书后续章节也会介绍如何在ROS中使用C+进行编程。客户端库的编写还可以使用Python4、Java5和Lisp6等其他多种语言7编写。 ROS不仅是一个函数库,除包含客户端库(Client Libraries)外,还包含一个中心服务器(Central Server)、一系列命令行工具、图形化界面工具以及编译环境。 ROS不是集成开发环境。虽然ROS没有规定软件开发环境,但3http:/wiki.ros.org/roscpp 4http:/wiki.ros.org/rospy 5http:/wiki.ros.org/ros

16、java 6http:/wiki.ros.org/roslisp 7http:/wiki.ros.org/ClientLibraries 5 几乎所有的主流IDE8都可用于基于ROS的软件开发。此外,我们还可以根据个人喜好,使用普通的文本编辑器和命令行来完成相应的开发,而无需任何IDE。 1.2 内容概述 本书的主要目的是对ROS的概念和技术进行整体介绍,从而使读者具备独立编写ROS软件的基本技能,但并不涵盖以下几点: 本书不是一本介绍如何编程的书籍。我们不打算详细讨论编程的基本概念。本书假设读者已经具备阅读、编写和理解C+代码的基本能力。 本书不是一本参考手册。关于ROS已有大量的资料可以查

17、阅,包括在线指导手册9和参考资料10。本书无意也不可能取代这些资源。相反,本书只是介绍ROS最基本的特征,为后面更好地使用ROS提供一个好的开端。 本书不是一本关于机器人算法的书籍。机器人学的研究,尤其是自主机器人控制算法的研究,可以说是相当有趣的,且针对这些问题已经提出了令人眼花缭乱的算法。本书并不针对某个具体算法进行讲解,而是告诉读者如何使用好ROS这一工具,更好地实现和测试感兴趣的算法。 8http:/wiki.ros.org/IDEs 9http:/wiki.ros.org/ROS/Tutorials 10http:/wiki.ros.org/APIs 6 章节及其依赖关系 本书的基本

18、构架如图1.1所示,其中章节用矩形框表示,箭头描述他们之间的主要依赖关系,读者可以在这些约束下按照不同顺序阅读本书。 图1.1 章节之间的相互依赖关系。 7 目标读者 本书能够为从事机器人技术相关领域的学生、研究人员和爱好者提供一个快速上手ROS的参考手册。我们希望读者对Linux系统有所了解(如基本的命令行操作、安装软件、编辑文件和设置环境变量等),熟悉C+,并且对通过编程控制机器人感兴趣。我们进一步假设读者使用的Linux操作系统版本是Ubuntu 14.04(在成文过程中最新的官方支持版本),并且命令行使用bash shell。然而,这些选择对其他系统配置并不会造成太大影响,使用其他Li

19、nux发行版(尤其是基于deb包的发行版)和shell通常不会有问题。 1.3 行文约定 在全书中,我们尝试预先提示一些可能出现的共性问题。这类警告是值得关注的,特别是当运行结果与期望有出入时,使用如下符号标记: 这个危险符号提示读者可能会出现的错误。 此外,某些章节中包含了只有部分读者可能会感兴趣的内容,这些内容对于概念理解没有影响,用如下符号进行标记: 该快进符号用于描述一些阅读过程中,尤其是初次接触本书,暂时可以跳过的内容。 1.4 更多信息 如前所述,本书并不是一本完备的ROS参考手册。几乎可以肯定,要真正动手使用ROS将要了解更多的细节。幸运的是,网上有关ROS的信息十分丰富。 8

20、最为重要的是ROS开发联盟维护的的维基文档11,其中包括大量教程。本书给出了其中一些页面的链接,在书中用脚注符号标记。如果使用主流的PDF阅读器阅读本书的电子版,则可以直接点击该符号在浏览器中打开对应网页。 如果在调试过程中遇到问题,可以登录类似Stack Exange(译者注:Stack Exchange是一系列的问答网站,每一个网站包含不同领域的问题)风格的Q&A网站12进行查询和提问。 另一个有效获取最新信息的途径就是ROS用户(ros-user)邮件列表13。 这里主要介绍两个细节以便读者明确相关概念。 发行版本(Distributions) ROS的主要版本称为发行版,其版本号14以

21、顺序字母作为版本名的首字母来命名(这种方式与其他大型工程的版本命名方式类似,如Ubuntu、Android)。在书写本书的过程中,当前版本号indigo,其后续版本被命名为jade,将于2015年5月发布15(译者注:事实上,ROS jade已经与2015年5月23日按计划日期发布)。ROS的旧版本号包括hydro、groovy、feurte、electric、diamondback、C Turtle和box turtle。这些名称将会多次出现在本书中。 11http:/wiki.ros.org 12http:/answers.ros.org 13http:/lists.ros.org/mai

22、lman/listinfo/ros-users 14http:/wiki.ros.org/Distributions 15http:/wiki.ros.org/indigo/Planning 9 为了确保简单和时效性,本书假设读者使用ROS indigo。 如果需要在某些情况下使用hydro版本,本书中的绝大多数例子可以不经过修改就可以使用。上述结论对groovy版本同样奏效,但有一点需要特别注意:在groovy之上的版本中,对于turtlesim仿真器的速度指令已经更新为用于很多实体机器人的标准信息类型和话题名称。其区别如下表所示: 版本 话题名称 消息类型 groovy /turtle1/

23、command_velocity Turtlesim/ Velocity indigo, hydro /tur le1/cmd_vel geometry_msgs/Twist 这个改变将引起一些实现上的变化: 在第48页,当添加依赖库时,需要使用turtlesim来替换geometry_msgs。 在第56页,相应的头文件也要替换为 turtlesim/Velocity.h 而不再使用 geometry_msgs/Twist.h turtlesim/Velocity消息类型只包含两个域,即linear和angular。上述两个域与geometry_msgs/Twist中的linear.x和an

24、gualr.z含义相同。这个改变同样出现在第35页的命令行和第57页的C+代码中。 10 编译系统(Build Systems)从groovy版本开始,ROS对软件的编译进行了重大改动。在groovy及之前的版本中,ROS采用rosbuild系统来完成软件的编译,而在新的版本中,则改用catkin编译系统。了解这一点非常重要,尤其在阅读参考教程时需要注意,编译系统的改变导致很多教程分为rosbuild和catkin两个版本。版本的选择可以通过操作教程页面顶端的按钮完成。虽然在有些情况下,rosbuild是更好的选择16,但本书主要介绍catkin系统的使用。 1.5 下一章简介 在下一章,我们

25、学习ROS的基本概念和工具,并开始使用ROS。16http:/wiki.ros.org/catkin_or_rosbuild 11 第2章 入门概述工欲善其事,必先利其器。 孔子 本章中,我们将简述ROS安装过程,介绍一些ROS的基本概念,并与运行中的ROS系统进行一些基本的交互。 在介绍用ROS写程序的细节之前,我们有必要先了解如何启动、运行ROS,并理解ROS使用的一些基本概念。作为后续内容的基础,本章首先简单介绍如何安装ROS和配置用户账户,接着我们将浏览一个运行中的ROS系统(更确切地说,是一个turtlesim仿真器),最后将学习如何用命令行工具与这个系统进行交互。 2.1 安装RO

26、S 当然,使用ROS之前,必须首先确认已经在计算机上成功安装了ROS软件。如果你正在使用一台别人已经安装过ROS的计算机,包括我们后续章节将频繁使用的ros -indigo-turtlesim功能包,那么你可以直接跳到2.2节。事实上,安装过程有详细的帮助文档,而且大部分都很简单1,2。下面是对一些必要步骤的小结。 添加ROS软件源 使用超级用户(译者注:Ubuntu下使用sudo命令得到超级用户权限)在根目录下,创建文件 /etc/apt/sources.list.d/ros-latest.list 本章由肖军浩、李峻翔、肖志鹏翻译。 1http:/wiki.ros.org/ROS/Inst

27、allation 2http:/wiki.ros.org/indigo/Installation/Ubuntu 12 并将如下内容添加到此文件中: deb http:/packages.ros.org/ros/ubuntu trusty main 这一行是针对Ubuntu 14.04的,其代号为trusty。但如果你用的是Ubuntu 13.10,则可用saucy替trusty。 其他Ubuntu版本无论是更新的或更老的版本都不支持预编译二进制包的安装。但是,如果是比Ubuntu14.04更新的版本,从源码3安装ROS是一个较好的选择。 如果不确定自己的Ubuntu版本,可以在终端中使用这个命

28、令: lsb_release a 输出将显示系统的代号和版本号。 安装软件包授权密钥 安装ROS软件包之前,你必须有它的授权密钥。首先在下列网址下载: wget https:/ 如果下载成功,当前目录下会有一个较小的名为ros.key的二进制文件。接下来,用这个密钥配置apt软件包管理系统: sudo apt-key add ros.key 完成该步后(apt -key提示“ok”),可以放心删除ros.key。 3http:/wiki.ros.org/indigo/Installation/Source 13 下载软件包列表一旦配置完软件版本仓库(repositories)之后,可以用下列命

29、令得到最新的可用软件包列表: sudo apt-get update 需要注意的是,这会更新你系统中所有的软件版本仓库,而不仅仅是新添加的ROS库。 安装ROS软件包 现在可以安装ROS软件。最简单的方法是将ROS的核心系统进行完整安装: sudo apt-get install ros-indigo-desktop-full 如果磁盘空间足够至少要几个GB上述安装方案将是最好的选择。如果需要,有些命令可以对安装进行裁剪,包括ros-indigo-desktop 和 ros-indigo-ros-base。这些安装会少装一些软件包,从而应对硬盘空间紧张的情况。 安装turtlesim功能包 本

30、书中将多次使用一个简单的仿真器turtlesim,它能够帮助我们理解ROS的工作机制。如果你希望运行书中的参考范例毫无疑问你需要安装turtlesim。安装命令如下: sudo apt-get install ros-indigo-turtlesim 为系统设置rosdep 安装完ROS包后,需要执行下面的命令: sudo rosdep init 这个初始化步骤是一次性的,一旦ROS正常工作,多数用户不再需要访问rosdep。 14 正如其名字所示一样,这个命令主要是初始化rosdep,它是用于检查和安装软件包的依赖的一种工具,它与操作系统无关4。比如在Ubuntu中,rosdep是apt-g

31、et的一个前端。我们不会直接使用rosdep,但我们使用的工具将会在后台使用它。如果rosdep没有正常安装,这些工具可会不“开心”。 在线文档中偶尔会提到一个叫做rosinstall的工具,使用它可以从源码安装ROS系统5, 6。本书中我们需要的软件在Ubuntu deb软件源中都包含了,所以可以不用rosinstall。 2.2 配置账户 不管是安装ROS还是使用一台预装了ROS的电脑,要想在你的账户中使用ROS,就必须完成下面两步重要的配置。 为用户账户中设置rosdep 首先,在你的账户中初始化rosdep系统,命令如下: rosdep update 该命令将在你的根目录下保存一些文件

32、,文件夹名为.ros。因为是初始化,这条命令只需要运行一次。 4http:/wiki.ros.org/rosdep 5http:/wiki.ros.org/rosinstall 6http:/www.ros.org/doc/independent/api/rosinstall/html 15 这里需要注意,不像上文的rosdep init,rosdep update命令是在你的普通账户下运行,而不使用超级用户前缀sudo。 设置环境变量 ROS要依据一些环境变量来定位文件。设置这些环境变量,你需要使用以下命令7执行ROS提供的脚本setup.bash: source /opt/ros/indi

33、go/setup.bash 然后,用下行命令确认环境变量已经设置正确: export | grep ROS 如果一切工作正常,你应该看到了一组值(显示ROS_DISTRO和ROS_PACKAGE_PATH等环境变量的值)。如果setup.bash尚未运行,则此命令的输出通常为空。 如果从ROS指令中得到“command not found”错误(本章稍后将介绍),最可能的原因是,setup.bash尚未在当前shell中运行。 但是请注意,上面列出的步骤仅适用于当前的shell。每次启动一个新的shell,且要在这个shell中运行ROS时,只要运行上述source命令,ROS就能顺利工作。但

34、这种操作在频繁使用ROS时非常烦人,又容易忘记,尤其是当你考虑到ROS系统的模块化设计往往需要同时在不同终端中执行不同的命令时。 7http:/wiki.ros.org/rosbash 16 因此,你可能想配置自己的账户,使其每启动一个新的shell时,都自动运行脚本setup.bash。要做到这一点,编辑账户根目录中的文件.bashrc,并在最下面添加前文的source命令。 除了设置环境变量外,setup.bash 命令还能定义了一些ROS系统的bash函数,包括roscd和rosls(下面将要介绍),这些函数在rosbash软件包8中定义。 2.3 使用turtlesim的小例子 在开始

35、考察ROS工作的细节之前,我们先讲一个例子。这个快速练习有多个目的:首先确认ROS已正确安装,其次介绍经常出现在许多在线文档以及贯穿本书的turtlesim仿真器99,最后还能提供一个工作系统(虽然很简单),且我们将在本章剩余部分多次回顾这个系统。 启动turtlesim 在三个不同的终端中,分别执行以下三个指令: roscore rosrun turtlesim turtlesim_node rosrun turtlesim turtle_teleop_key 分三个终端的目的是让三个指令同时进行。如果一切正常,你应该看到类似于图2.1的左边部分的图形窗口。这个窗口显示了一个模拟龟形机器人,

36、它生活在方形“世界”。(每台机器海龟的外观可能会有所不同,事实上,每次运行时,仿真器从ROS所有发行8http:/wiki.ros.org/rosbash 9http:/wiki.ros.org/turtlesim 17 版中一系列的“吉祥物”海龟中选择一个进行显示。),如果切换到第三个终端(执行命令为turtle_teleop_key),然后按上、下、左、或右键,海龟就会响应你的命令开始移动了,并在屏幕上留下运动轨迹。 如果按了键盘而海龟却没有响应,请先确定turtle_teleop_key窗口已经聚焦,比如可用鼠标点击该窗口中央。当仿真窗口可见时,你需要仔细地排序你的窗口,以保证turtl

37、e_teleop_key窗口聚焦。 让虚拟海龟画线本身或许并不能让你兴奋不已,然而,这个例子足以说明ROS系统中更有趣的主要思想*。 图2.1 通过键盘控制海龟运动在屏幕留下的轨迹。 接下来保持这三个终端的运行状态,在以下各节的例子中将介绍其他方式来与这个系统交互。 *例如,本书作者第一次在电脑屏幕上画龟是在1987年前后。 18 2.4 功能包/软件包(Packages) 在ROS中,所有软件都被组织为软件包的形式,称为ROS软件包或功能包,有时也简称为包。ROS软件包是一组用于实现特定功能的相关文件的集合,包括可执行文件和其他支持文件。比如说,我们前面使用的两个可执行文件turtlesim

38、_node和turtle_teleop_key都属于turtlesim包。 注意ROS软件包和操作系统软件包管理器中软件包的区别,比如Ubuntu系统使用的deb软件包。尽管概念相似,安装一个deb软件包可以添加一个或多个ROS软件包,因此两者并不等同。 毫不夸张地说,所有的ROS软件都是一个软件包或其他软件包的一部分。需要着重指出的是,这里包括了用户创建的新程序。我们将在3.1节中介绍如何创建新的软件包。在此期间,ROS提供多个命令用于与已安装的软件包进行交互。 查看软件包列表和定位软件包 使用下行命令,可以获取所有已安装的ROS软件包列表清单10,11: rospack list 在笔者的

39、系统里,这条语句一共列出了188个软件包。 每个程序包由一个清单文件(文件名为package.xml)定义。该文件定义关于包的一些细节,包括其名称、版本、维护者和依10http:/wiki.ros.org/ROS/Tutorials/NavigatingTheFilesystem 11http:/wiki.ros.org/rospack 19 赖关系。包含package.xml文件的目录被称为软件包目录(其实,这也是ROS软件包的定义:任何ROS能找到且包含package.xml文件的目录就是软件包目录。)。这个目录存储所在软件包的大部分文件。 一个非常重要的特例是,对于大部分功能包确切地说,

40、那些已经更新为使用新的catkin编译构建系统的功能包编译产生的可执行文件并未存放在功能包目录下,而是存放在一个单独的标准化目录层次结构中。对于使用apt-get安装的功能包,其所在根目录为/opt/ros/indigo。可执行文件存储在这个根目录下的lib子目录里。同样,在自动生成的头文件存储在include子目录下。当有需要时,ROS通过搜索CMAKE_PREFIX_PATH环境变量列出的目录,这个环境变量由setup.bash自动设置。相比于fuerte和更老的版本,这种源码外编译是由catkin在groovy引入的主要变化之一。一般来说,这一切都在幕后进行,我们可以信任ROS能够找到它

41、需要的文件。 要找到一个软件包的目录,使用rospack find命令: rospack find package-name 当然,有时你并不知道(或不记得)感兴趣的软件包的完整名称,这时使用rospack命令非常方便,因为该命令支持tab命令补全。例如,你可以键入 rospack find turtle 并且,在按Enter键之前,按Tab键两次来查看所有已安装的软ROS件包的列表中以turtle开头的软件包。 20 事实上,大多数ROS命令支持这种tab命令补全,不仅仅是查找软件包名,几乎在每一个需要的地方都能用得上它。在上面的命令中,你也可以使用tab来补全rospack命令以及其后的f

42、ind关键字。 频繁使用tab补全功能可以大大减少需要记忆的内容,包括功能包、节点、话题、消息类型和服务的全名。计算机非常擅长存储和检索,因此我建议让你的电脑为你完成这类工作。 查看软件包:要查看软件包目录下的文件,使用如下命令: rosls package-name 如果想“访问”某软件包目录,可以将当前目录切换至此软件包目录,使用如下命令: roscd package-name 举一个简单的例子,假设你想查看turtlesim使用的一系列海龟图像。表2.1显示了如何使用rosls和roscd看这些图像的列表,并查看它们中的某一个。 读者可能会看到某些在线文档中出现功能包集(stack)的概

43、念12。功能包集是紧密相关的功能包的集合。从ROS的groovy版本开始,功能包集的概念被逐步淘汰,取而代之的是元功能包(metapackages)13,14。两者最大的区别是分12http:/wiki.ros.org/rosbuild/Stacks 13http:/wiki.ros.org/catkin/conceptual_overview 21 层结构“扁平化”:元功能包像其他功能包一样有功能包清单,但其目录下没有其他的功能包,而功能包集则将其包含的功能包存放在其目录下。新用户很少会直接与功能包集打交道。 1 $ rosls turtlesim 2 cmake 3 images 4 ms

44、g 5 package . xml 6 srv 7 $ rosls turtlesim /images 8 boxturtle . png 9 diamondback . png 10 electric . png 11 fuerte . png 12 groovy . png 13 hydro . png 14 hydro . svg 15 indigo . png 16 indigo . svg 17 palette . png 18 robotturtle . png 19 seaturtle . png 20 turtle . png 21 $ roscd turtlesim /ima

45、ges/ 22 $ eog boxturtle . png 表2.1使用rosls和roscd命令查看turtlesim功能包使用的海龟图像。命令eog是“Eye of Gnome”图像查看器。 14http:/wiki.ros.org/catkin/package.xml 22 2.5 节点管理器(The Master) 至此我们已经介绍了文件的相关概念,以及它们是如何被组织成软件包的。接下来我们谈谈如何实际执行ROS软件。 ROS的一个基本目标是使机器人专家设计的很多称为节点(node)的几乎相对独立的小程序能够同时运行。为此,这些节点必须能够彼此通信。ROS中实现通信的关键部分就是ROS

46、节点管理器。要启动节点管理器,使用如下命令: roscore 在turtlesim的例子中我们已经使用过这个命令。这个命令非常简单易用:roscore命令不带任何参数,也无需任何配置。 节点管理器应该在使用ROS的全部时间内持续运行。一个合理的工作流程是在一个终端启动roscore,然后打开其他终端运行其他程序。除非你已经完成ROS的相关工作,否则一般没有理由终止roscore命令。当结束时,可以通过在roscore终端键入Ctrl-C停止节点管理器。 上文提到一般没有理由终止roscore,但有时候重新启动roscore也许是个好主意,虽然这种情况不多。例如:切换到一组新的日志文件(见第4章

47、)或清理参数服务器(见第7章)。 大多数ROS节点在启动时连接到节点管理器上,如果运行中连接中断,则不会尝试重新连接。因此,如果roscore被终止,当前运行的其他节点将无法建立新的连接,即使稍后重启roscore也无济于事。 23 这里的roscore命令用来显式启动ROS的节点管理器。在第六章中,我们将学习一个称为roslaunch的工具,其目的是一次性启动多个节点。这是一个自适应工具,如果启动多节点时没有节点管理器运行,它会自动启动节点管理器;如果已经有一个节点管理器在运行,则会使用已有的。 2.6 节点(Nodes) 一旦启动roscore后,便可以运行ROS程序了。ROS程序的运行实

48、例被称为节点(node)15。 这个定义中的“运行实例”(running instance)很重要。如果我们同时执行相同程序的多个副本注意确保每个副本使用不同的节点名则每个副本都被当做一个单独的节点。我们将在2.8节中看到这种差异。 在turtlesim的例子中,我们创建了两个节点。第一个节点是可执行文件turtlesim_node的实例化。这个节点负责创建turtlesim窗口和模拟海龟的运动。第二节点是可执行文件turtle_teleop_key的实例化。teleop是teleoperation(遥操作)的缩写,是指人通过在远程发送运动指令控制机器人。这个节点的作用是捕捉方向键被按下的事件,并将方向键的按键信息转换为运动指令,然后将命令发送到turtlesim_node节点。 启动节点 启动节点(也称运行ROS程序)的基本命令是ros run16: 15http:/wiki.ros.org/ROS/Tutorials/UnderstandingNodes 16http:/wiki.ros.org/rosbash#rosrun

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 学术论文 > 大学论文

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报