我在ros里跑安装ros kinectic遇到了这个问题

ROS机器人程序设计(原书第2版).
ROS机器人程序设计(原书第2版).
机器人设计与制作系列
ROS机器人程序设计
(原书第2版)
Learning ROS for Robotics Programming,Second Edition
恩里克·费尔南德斯(Enrique Fernández)
路易斯·桑切斯·克雷斯波(Luis Sánchez Crespo)
机器人设计与制作系列
ROS机器人程序设计
(原书第2版)
Learning ROS for Robotics Programming,Second Edition
恩里克·费尔南德斯(Enrique Fernández)
路易斯·桑切斯·克雷斯波(Luis Sánchez Crespo)
阿尼尔·马哈塔尼(Anil Mahtani)
亚伦·马丁内斯(Aaron Martinez) 著
刘锦涛 张瑞雷 等译
图书在版编目(CIP)数据
ROS机器人程序设计(原书第2版) / (西)恩里克·费尔南德斯(Enrique Fernández)等著;刘锦涛等译. —北京:机械工业出版社,2016.9
(机器人设计与制作系列)
书名原文: Learning ROS for Robotics Programming, Second Edition
ISBN 978-7-111-55105-8
I. R… II. ①恩… ②刘… III. 机器人-程序设计 IV. TP242
中国版本图书馆CIP数据核字(2016)第248166号
本书版权登记号:图字:01-
Enrique Fernández, Luis Sánchez Crespo, Anil Mahtani, Aaron Martinez: Learning ROS for Robotics Programming, Second Edition(ISBN: 978-1-).
Copyright ? 2015 Packt Publishing. First published in the English language under the title “Learning ROS for Robotics Programming, Second Edition”.
All rights reserved.
Chinese simplified language edition published by China Machine Press.
Copyright ? 2016 by China Machine Press.
本书中文简体字版由Packt Publishing授权机械工业出版社独家出版。未经出版者书面许可,不得以任何方式复制或抄袭本书内容。
ROS机器人程序设计(原书第2版)
出版发行:机械工业出版社(北京市西城区百万庄大街22号 邮政编码:100037)
责任编辑:刘诗灏 责任校对:董纪丽
印  刷: 版  次:2016年11月第1版第1次印刷
开  本:186mm×240mm 1/16 印  张:20
书  号:ISBN 978-7-111-55105-8 定  价:69.00元
凡购本书,如有缺页、倒页、脱页,由本社发行部调换
客服热线:(010)361066 投稿热线:(010)
购书热线:(010)995259 读者信箱:
版权所有 ? 侵权必究
封底无防伪标均为盗版
本书法律顾问:北京大成律师事务所 韩光/邹晓东
Foreword  推荐序一
21世纪是什么样的世纪?是物联网的世纪?是VR的世纪?也许吧,但我更相信21世纪是机器人的世纪。
目前,我国已经步入经济转型的拐点区间,人口红利越来越难以支撑中国经济的发展和进步。在很多行业都已经开始了机器换人、生产工艺升级换代的步伐。工信部、发改委、财政部日前联合印发了《机器人产业发展规划(年)》。这份规划指出:“到2020年,我国工业机器人年产量达到10万台,其中六轴及以上机器人达到5万台以上;服务机器人年销售收入超过300亿元,在助老、助残、医疗康复等领域实现小批量生产及应用;要培育3家以上的龙头产业,打造5个以上机器人配套产业集群;工业机器人平均无故障时间要达到8万小时;智能机器人实现创新应用。”从这个规划中可以看出,机器人未来的政策空间和市场发展空间都是非常巨大的。一方面,发展工业机器人在满足我国制造业的转型升级、提质增效,实现“中国制造2025”等方面具有极为重大的意义,是全面推进实施制造强国战略的重要一步。另一方面,从服务机器人来说,也要满足未来市场需求的增长。首先,这包括了基本生活需求,比如说养老、助老、助残等。其次是国家安全需求,比如救灾、抢险、海底勘探、航天、国防。最后还有家庭服务和娱乐机器人,比如娱乐、儿童教育、智能家居应用等。同时,科技部目前也在进行“十三五”科技创新规划战略研究,根据已经披露的内容,其中对机器人(尤其是服务机器人)非常重视,并会在近期遴选并启动一批相应的重大科技项目。
也许看完上面这些,你会觉得这更像是新闻描述,机器人产业真的这么火爆吗?当然。即使刨除工业机器人,只谈其他的智能机器人或服务机器人,这也是一个相当庞大的产业。例如,目前世界上最大的服务机器人公司应该还是美国的直觉外科公司。他们生产的达芬奇机器人系统在全世界已经应用了3000余套,其完成的手术超过千万例。由机器人完成的各类微创手术让无数患者获得新生。这家公司的市值超过300亿美元。中国目前估值最高的机器人公司是大疆创新,其年营收额已经超过10亿美元,估值超过百亿美元。要知道,10年前这家公司刚刚在深圳创立时,还比较弱小。因此,相信机器人产业在未来的前景一定非常广阔。
但是我们也注意到在军用国防、救灾救援、养老、家庭服务、儿童教育等领域,至今没有一个世界级的机器人公司存在。有很多爱好者都希望自己能够制造一个智能轮椅、一个智能儿童教育机器人或是一个家庭服务机器人,也许这样的机器人会像乔布斯和沃兹尼亚克在车库里做出的苹果电脑一样改变世界。但我们看到的很多人,自己只是机械工程师、电气工程师或者自动控制工程师,开发一个控制机器人的软件系统是遥不可及的事情;又或者自己虽然是软件工程师,但是并不知道如何控制和驱动底层设备。这要怎么办呢?没关系, ROS机器人操作系统可以帮忙。
ROS最初是作为科研辅助工具由斯坦福大学开发的。类似的机器人操作系统在世界各国还有很多。有些操作系统面向实时机器人控制,有些操作系统面向机器人仿真,有些操作系统面向用户交互。这些操作系统大部分都相对封闭,各成体系,没有在学术界和产业界造成影响。而由于ROS极大的开放性和包容性,它能够兼容其他机器人开发工具、仿真工具和操作系统,使之融为一体。这使得ROS不断发展壮大,并成为应用和影响力最广泛的机器人软件平台。
随着ROS 2.0的开发,ROS能够兼容除Linux之外更多的操作系统,如Windows、Android;能够支持从工业计算机到Adruino开发板等各类型的硬件;能够采集RGB-D摄像头、普通摄像头和各种类型的传感器数据;能够驱动类人形机器人、四轴飞行器等各类型的机器人。而且新版本的ROS在采用SOA架构的基础上,集成了MVC框架,更加有利于机器人人机交互界面的开发与机器人控制。
学习ROS,本身就是掌握一把通往未来的钥匙。自从本人2012年翻译本书第1版之后,关于ROS的书籍也渐渐多了起来。但和其他书籍相比,本书经过了时间的检验,第2版从内容到示例对学习ROS都更有帮助。希望大家都能够成为机器人软件设计方面的专家。希望在中国的机器人设计领域能够出现新的领军人物,将中国的机器人带入世界一流行列。
刘品杰,本书第1版译者
Foreword  推荐序二
记得第一次接触ROS的时候我还在学校做研究,当时跟一些海外学者交流时得知有这个专为机器人设计的操作系统。我很是兴奋,一心想把ROS用在我们最新研发的机器人上,于是就马上动手玩起来。由于当时ROS尚在起步阶段,说明文档不太全面,同时社区支持又很少,不知道经过多少折腾才好不容易把它运行起来。体验后发现它的设计框架确实很适合作为机器人敏捷开发工具——算法及控制等代码很容易被复用,避免了很多重复劳动。但奈何当时的功能包不多,而且系统对运算资源要求高,最终没有用在当时的机器人项目上。
由于其开源性以及对商用友好的版权协议,ROS很快得到越来越多的关注及支持。现在ROS已有飞快的发展,越来越多机器人相关的软件工具亦加入ROS的行列。国外一些商用的机器人也开始支持ROS系统,甚至基于ROS进行开发。相信这个趋势会一直持续下去并会蔓延到世界各地。而我亦深深体会到国内对ROS的关注在近年有显著的上升。
从前在国内学习ROS可谓孤军作战,身边没几个人听说过ROS,而且只能从国外网站学习ROS的相关知识,完全没有中文的资料可以查看。幸好国内有不少有心人积极推动ROS的发展,不遗余力地对国外ROS相关的文章进行翻译,并且发表一些原创的教学文章,丰富ROS的中文资源,这使学习ROS变得更方便。
我与本书译者通过共同举办ROS国内推广课程而结缘。他对推动ROS在国内的发展起到了举足轻重的作用,并运营着国内著名的ROS交流社区。本书亦是他贡献ROS中文社群的作品之一。而本书的作者同样是ROS界的权威,有丰富的ROS实战经验,使用ROS进行过多种机器人的开发。书中从ROS的架构概念到常用的调试工具、功能包及传感器的信息处理都有所涉及,是ROS入门必看书之一。希望本书能让你快速进入ROS的世界,探索ROS的精彩。
林天麟,博士,NXROBO创始人& CEO
译者序  The Translators’ Words
机器人对于现代人类而言并不陌生和神秘,它在百年前的科幻小说中首次出现,而现在已经逐步进入人类生活的方方面面,机器时代即将到来!
智能机器人的程序究竟是如何设计出来的呢?
智能机器人需要具备强健的“肢”、明亮的“眼”、灵巧的“嘴”以及聪慧的“脑”,这一切的实现实际上涉及诸多技术领域,需要艰辛的设计、开发与调试过程,必然会遇到棘手的问题和挑战。而一个小型的开发团队难以完成机器人各个方面的开发工作,因而需要一套合作开发的框架与模式,以期能够快速集成已有的功能,省却重复劳动的时间。早在2008年,我们在与澳大利亚的布劳恩教授交流时,就得知他们开发了一套商业化的“RoBIOS”机器人操作系统,这套系统将一些常用的机器人底层功能进行了封装,可极大简化高级功能的开发。据他们介绍,这是最早的“机器人操作系统”,但由于产品不开源且价格昂贵,我们最终未能一试为快。后来在网络中不断地寻觅,最终发现了ROS,由于其开源、开放的特性,一下子就引起了我们极大的兴趣。
我们于2010年建立了易科机器人QQ群进行讨论,从而结识了国内最早期的一些机器人研究者和ROS探索者。由于早期相关资料非常匮乏,我们于2012年创建了博客(blog.exbot.net)以进行技术分享与交流。易科机器人开发组成员在此期间贡献了大量的教程和开发笔记,在此向他们的无私奉献表示感谢与敬意!近年来,随着机器人的迅猛发展,ROS得到了更为广泛的使用,国内也出现了一些优秀的项目,包括“星火计划”ROS公开课(blog.exbot.net/spark)、“HandsFree”ROS机器人开发平台(wiki.exbot.net)等。
出版界近年来也是硕果累累,本书第1版便是国内第一本ROS译著,由于实用性强,已经多次重印。第2版针对近年来ROS的最新发展,对书中部分内容进行了修订,并增加了第6章和第10章。本书涵盖了使用ROS进行机器人编程的最新知识与方法,通过ROS编程实践能够帮助你理解机器人系统设计与应用的现实问题。在机器人开发实践中,我们认为除了成功的喜悦外,还看到机器人学目前所处的发展阶段:核心技术尚未成熟、诸多功能尚不完备、bug多……但我们相信,有了ROS的开源精神和完备的合作开发框架,很多问题会迎刃而解。唯一迫切需要的就是期待你加入机器的开发和研究中来,一起推动开源机器人技术的发展与普及!
本书第2版与第1版的重叠部分主要沿用了刘品杰在第1版中的翻译,个别词汇根据习惯进行了修改。具体来说,第1至5章和第10章由张瑞雷翻译,第6章由张波翻译,第7至9章由刘锦涛翻译,吴中红和李静老师对全书进行了审阅,最后由刘锦涛对全书进行了修改润色和统稿整理。感谢杨维保、马文科等人对本书提出的修改建议!
我们将会在books.exbot.net发布本书的其他相关资源。
前 言  Preface
本书第2版概括性地介绍了ROS系统的各种工具。ROS是一个先进的机器人操作系统框架,现今已有数百个研究团体和公司将其应用在机器人行业中。对于机器人技术的非专业人士来说,它也相对容易上手。在本书中,你将了解如何安装ROS,如何开始使用ROS的基本工具,以及最终如何应用先进的计算机视觉和导航工具。
在阅读本书的过程中无需使用任何特殊的设备。书中每一章都附带了一系列的源代码示例和教程,你可以在自己的计算机上运行。这是你唯一需要做的事情。
当然,我们还会告诉你如何使用硬件,这样你可以将你的算法应用到现实环境中。我们在选择设备时特意选择一些业余用户负担得起的设备,同时涵盖了在机器人研究中最典型的传感器或执行器。
最后,由于ROS系统的存在使得整个机器人具备在虚拟环境中工作的能力。你将学习如何创建自己的机器人并结合功能强大的导航功能包集。此外如果使用Gazebo仿真环境,你将能够在虚拟环境中运行一切。第2版在最后增加了一章,讲如何使用“Move it!”包控制机械臂执行抓取任务。读完本书后,你会发现已经可以使用ROS机器人进行工作了,并理解其背后的原理。
第1章介绍安装ROS系统最简单的方法,以及如何在不同平台上安装ROS,本书使用的版本是ROS Hydro。这一章还会说明如何从Debian软件包安装或从源代码进行编译安装,以及在虚拟机和ARM CPU中安装。
第2章涉及ROS框架及相关的概念和工具。该章介绍节点、主题和服务,以及如何使用它们,还将通过一系列示例说明如何调试一个节点或利用可视化方法直观地查看通过主题发布的消息。
第3章进一步展示ROS强大的调试工具,以及通过对节点主题的图形化将节点间的通信数据可视化。ROS提供了一个日志记录API来轻松地诊断节点的问题。事实上,在使用过程中,我们会看到一些功能强大的图形化工具(如rqt_console和rqt_graph),以及可视化接口(如rqt_plot和rviz)。最后介绍如何使用rosbag和rqt_bag记录并回放消息。
第4章介绍ROS系统与真实世界如何连接。这一章介绍在ROS下使用的一些常见传感器和执行器,如激光雷达、伺服电动机、摄像头、RGB-D传感器、GPS等。此外,还会解释如何使用嵌入式系统与微控制器(例如非常流行的Arduino开发板)。
第5章介绍ROS对摄像头和计算机视觉任务的支持。首先使用FireWire和USB摄像头驱动程序将摄像头连接到计算机并采集图像。然后,你就可以使用ROS的标定工具标定你的摄像头。我们会详细介绍和说明什么是图像管道,学习如何使用集成了OpenCV的多个机器视觉API。最后,安装并使用一个视觉里程计软件。
第6章将展示如何在ROS节点中使用点云库。该章从基本功能入手,如读或写PCL数据片段以及发布或订阅这些消息所必需的转换。然后,将在不同节点间创建一个管道来处理3D数据,以及使用PCL进行缩减采样、过滤和搜索特征点。
第7章介绍在ROS系统中实现机器人的第一步是创建一个机器人模型,包括在Gazebo仿真环境中如何从头开始对一个机器人进行建模和仿真,并使其在仿真环境中运行。你也可以仿真摄像头和激光测距传感器,为后续学习如何使用ROS的导航功能包集和其他工具奠定基础。
第8章是两章关于ROS导航功能包集中的第1章。该章介绍如何对你的机器人进行使用导航功能包集所需的初始化配置。然后用几个例子对导航功能包集进行说明。
第9章延续第8章的内容,介绍如何使用导航功能包集使机器人有效地自主导航。该章介绍使用ROS的Gazebo仿真环境和rviz创建一个虚拟环境,在其中构建地图、定位机器人并用障碍回避做路径规划。
第10章讨论ROS中移动机器人机械臂的一个工具包。该章包含安装这个包所需要的文档,以及使用MoveIt!操作机械臂进行抓取、放置,简单的运动规划等任务的演示示例。
我们写作本书的目的是让每位读者都可以完成本书的学习并运行示例代码。基本上,你只需要在计算机上安装一个Linux发行版。虽然每个Linux发行版应该都能使用,但还是建议你使用Ubuntu 12.04 LTS。这样你可以根据第1章的内容安装ROS Hydro。
对于ROS的这一版本,你将需要Ubuntu 14.04之前的版本,因为之后的版本已经不再支持Hydro了。
对于硬件要求,一般来说,任何台式计算机或笔记本电脑都满足。但是,最好使用独立显卡来运行Gazebo仿真环境。此外,如果有足够的外围接口将会更好,因为这样你可以连接几个传感器和执行器,包括摄像头和Arduino开发板。
你还需要Git(git-core Debian软件包),以便从本书提供的源代码中复制库。同样,你需要具备Bash命令行、GNU/Linux工具的基本知识和一些C/C++编程技巧。
本书的目标读者包括所有机器人开发人员,可以是初学者也可以是专业人员。它涵盖了整个机器人系统的各个方面,展示了ROS系统如何帮助完成使机器人真正自主化的任务。对于听说过却从未使用过ROS的机器人专业学生或科研人员来说,本书将是非常有益的。ROS初学者能从本书中学习ROS软件框架的很多先进理念和工具。不仅如此,经常使用ROS的用户也可能从某些章节中学习到一些新东西。当然,只有前3章是纯粹为初学者准备的,所以那些已经使用过ROS的人可以跳过这部分直接阅读后面的章节。
源代码和彩色图片下载
可以从你在http://www.packtpub.com中的账户下载所有已购买的Packt Publishing出版的书籍的示例代码文件。如果你在其他地方购买了这本书,可以访问http://www.packtpub.com/support并注册,文件会通过电子邮件直接发送给你。还可以从https://github.com/AaronMR/ROS_Book_Hydro下载源代码文件。
我们同时提供了本书所有彩色的屏幕截图、对话框的PDF文件,这些彩色图片能够更好地帮助你理解输出的变化。可以从http://www.packtpub.com/sites/default/files/downloads/
7580OS_ColorImages.pdf下载这个文件。
About the Authors  作者简介
Enrique Fernández在拉斯帕尔马斯大学获得计算机工程博士学位,目前是Clearpath Robotics公司高级机器人工程师。2009年他完成了关于SLAM的硕士学位论文。2013年他的博士论文解决了自主水下滑翔器(AUG)的路径规划问题。那段时间,他还研究了计算机视觉、人工智能以及其他机器人学课题,例如赫罗纳大学的CIRS/ViCOROB研究实验室AUV的惯性导航系统和视觉SLAM。他在2012年参加了欧洲学生自主水下航行器设计挑战赛(Student Autonomous Underwater Challenge-Europe,SAUC-E)并获奖,在2013年作为合作者参与了SAUC-E。
获得博士学位后,Enrique作为高级机器人工程师在2013年6月加入PAL Robotics公司的自主导航部门。在那里,他开发了用于REEM、REEM-C和移动机器人以及相关项目的软件,如使用ROS框架的Stockbot。他的研究方向包括运动规划(路径规划和移动机器人控制)、机器人定位和SLAM。在2015年,他作为高级自主系统开发人员加盟Clearpath Robotics公司的自主系统部门从事SLAM相关工作。
在学术方面,Enrique发表了多篇会议论文,其中两篇于2011年发表在《International Conference of Robotics and Automation》(ICRA)上。他是Packt Publishing出版的第1版《ROS机器人程序设计》和其他一些书部分章节的作者。他的硕士学位论文是关于室内机器人的FastSLAM算法,此机器人装备了SICK激光扫描仪以及Pioneer差动平台的轮式里程计。他的博士学位论文是关于AUG的路径规划算法和工具。他还拥有电子和嵌入式系统(如PC104和Arduino)的开发经验。他的研究背景包括SLAM、计算机视觉、路径规划、优化、机器人学和人工智能。
我要感谢这本书的合著者,感谢他们为完成这本书所付出的努力以及提供了无数示例的代码。我还要感谢博士论文期间大学智能系统和计算工程研究所(University Institute of Intelligent Systems and Computational Engineering,SIANI)和水下机器人研究中心(Center of Underwater Robotics Research,CIRS/ViCOROB)的研究小组成员。我也要感谢在PAL机器人公司的同事,在那里我学到很多关于ROS、机器人运动以及仿人双足机器人的知识,不仅有软件,还有电子和硬件设计。最后,我要感谢我的家人和朋友的帮助与支持。
Luis Sánchez Crespo在拉斯帕尔马斯大学获得了电子与电信工程的双硕士学位。他曾在技术开发和创新研究所(IDETIC)、加那利群岛海洋平台(PLOCAN)和应用微电子研究所(IUMA)与不同的研究小组合作,进行超分辨率算法成像研究。
他的专业兴趣包括应用于机器人系统的计算机视觉、信号处理和电子设计。因此,他加入了AVORA团队,这批年轻的工程师和学生从零开始从事自主水下航行器(AUV)的开发工作。在这个项目中,Luis开始开发声学和计算机视觉系统,用于提取不同传感器的信息,例如水听器、声呐和摄像头。
依托海洋技术的强大背景,Luis与人合作创办了一家新的初创公司Subsea Mechatronics,致力于为水下环境开发遥控操作和自主航行器。
下面是海洋技术工程师和企业家(LPA Fabrika:Gran Canaria Maker Space的联合创始人和制造商)Dario Sosa Cabrera对Luis的评价:
“他很热情,是一个多学科的工程师。他对工作负责。他可以自我管理,并承担一个团队领导者的责任,如在SAUC-E竞赛中领导了AVORA团队。他在电子和电信领域的背景让其具备从信号处理和软件到电子设计和制造的广泛专业知识。”
Luis作为技术审校者参与了Packt Publishing出版的第1版《ROS机器人程序设计》的相关工作。
首先,我要感谢Aaron、Anil以及Enrique邀请我参与编写这本书。和他们一起工作非常快乐。同时,我也要感谢水下机电团队关于重型水下机器人的丰富经验,这些年我们一起成长。我必须提到LPA Fabrika:Gran Canaria Maker Space,他们备课和讲授教育机器人及技术项目极富热情,与他们共享工作环境也非常令人激动。
最后,我要感谢我的家人和女朋友对我参与的每个项目的大力支持和鼓励。
Anil Mahtani是一名从事水下机器人工作5年的计算机科学家。他第一次在该领域工作是在完成硕士论文期间为低成本ROV开发软件架构。在此期间,他也成为AVORA的团队领导者和主要开发人员,这个团队的高校学生设计和开发了一个自主水下航行器并参加了2012年的SAUC-E。同年,他完成了论文并获得了拉斯帕尔马斯大学的计算机科学硕士学位。此后不久,他成为SeeByte公司的软件工程师,这家公司是水下系统智能软件解决方案的全球领导者。
在SeeByte公司工作期间,Anil参与了军方、石油和天然气公司的一些半自主和自主水下系统的核心开发。在这些项目中,他积极参与自主系统开发、分布式软件体系结构设计和底层软件开发,同时也为前视声呐图像提供计算机视觉解决方案。他还获得了项目经理职位,管理一个开发和维护内核C++库的工程师团队。
他的专业兴趣主要包括软件工程、算法、分布式系统、网络和操作系统。Anil在机器人方向主要负责提供高效和健壮的软件解决方案,不仅解决当前存在的问题,还预见未来的问题或可能的改进。鉴于他的经验,他在计算机视觉、机器学习和控制问题上也有独特的见解。Anil对DIY和电子学有兴趣,并且开发了一些Arduino库回馈社区。
首先,我要感谢我的家人和朋友的支持,他们总是在我最需要的时候帮助我。我也要感谢我的同事和朋友David Rubio Vidal、Emilio Miguelá?ez Martín和John Brydon给我最大的支持,他们以专业的方式教我很多知识。我还要感谢我在SeeByte和AVORA团队的同事,这些年从他们那里学习并经历很多。最后,我要特别感谢Jorge Cabrera Gámez,他的指导和建议成就了我自己从未想象到的职业生涯。
Aaron Martinez是数字化制造领域的电脑工程师、企业家和专家。他于2010年在拉斯帕尔马斯大学的Instituto Universitario de Cienciasy Tecnologias Ciberneticas(IUCTC)完成硕士论文。他在远程监控领域使用沉浸式设备和机器人平台准备硕士论文。得到学位后,他参加了在奥地利林茨开普勒大学研究所的机器人学实习计划。在实习期间,他作为团队的一员使用ROS和导航包集进行移动平台开发。之后,他参与了有关机器人的项目,其中一个是拉斯帕尔马斯大学的AVORA项目。在这个项目中,他参与自主水下航行器制作,并参与意大利的SAUC-E。2012年,他负责维护这个项目;2013年,他帮助从ROS向机器人平台移植导航包集和其他算法。
最近,Aaron与人共同创立了一家名为SubSeaMechatronics SL的公司。这家公司从事与水下机器人和遥控系统相关的项目,还设计和制造水下传感器。公司的主要目标是开发用于研发原型和重型机械手的定制解决方案。
Aaron有许多领域的经验,比如编程、机器人、机电一体化、数字化制造以及Arduino、BeagleBone、服务器和激光雷达等设备。如今,他在SubSeaMechatronics SL公司从事水下和空中环境的机器人平台设计。
我要感谢我的女朋友,她在我写这本书时给我支持以及给我继续成长的动力。我还要感谢Donato Monopoli(加那利群岛技术研究所(ITC)生物医学工程部门的主管),以及ITC所有的工作人员,感谢他们使我懂得数字制造、机械以及组织工程,我在此度过了生命中最美好的时光。
感谢我大学的同事,特别是Alexis Quesada,他给了我在准备硕士论文时创建我第一个机器人的机会。和他们一起工作,使我学习到很多关于机器人的知识。
最后,我要感谢家人和朋友的帮助与支持。
About the Reviewers  审校者简介
Piotr Gródek是一位对计算机视觉和图像处理感兴趣的C++程序员。他曾经是嵌入式程序员,现在工作于银行。他是开源游戏和无人驾驶汽车的开发者。空闲时间他喜欢跑步、打壁球和阅读。
Akihiko HONDA是空间机器人工程师。他于2012年在东京工业大学完成了硕士论文。目前他正在东京工业大学进行博士课程学习。
他的研究兴趣包括与空间机器人的远程操作和自动化相互对应的灵活或可变形的材料。他的一个目标是通过开发更好的自动控制系统提高飞船在太空的性能和稳定性。在早期的研究中,他参与了包含大型太阳能电池阵列和用于捕捉国际空间站的空间机械臂的地球观测卫星的工作。目前,他计划将其研究成果应用于空间太阳能电力系统、行星探测车等。他作为最佳参赛人获奖,并在日本天文学会举办的JSF卫星设计竞赛中因提出使用其研究的一个新型探索宇宙飞船而获奖。
他在大学的研究过程中,还参与了由日本太空发展署指挥的一些项目。在JEM(REX-J)项目的机器人实验中,他参与了在轨道上的实验设备支持操作并在研究中获得灵感。他还参加了一个为宇航员开发可穿戴机械臂的项目并开发了手动控制系统。目前他正工作于两个探索机器人项目。其中一个是开发名为“KENAGE”的可变形的探测车,用于克服月球和火星特殊的崎岖地形。这个探测车正在使用GAZEBO仿真器进行可行性实验测试。在另一个项目中,他为JumpingScouter开发了一个环境识别系统。
2013年,他参与了萨利大学的SMART探测器项目,开发环境保护和识别系统。同时,他也参与了探测车在真实环境中检测实际功能的现场实验。
我要感谢JAXA的Hiroki KATO给我打开了ROS的大门并对我的研究给予宝贵建议。我还要感谢Mitsushige ODA教授、Hiroki NAKANISHI教授以及东京工业大学空间机器人实验室的同事。他们分享了空间机器人的美好前景,提供了建议,并支持我在研究中使用ROS实现它们。我也要感谢萨利大学STAR实验室的教授和同事给我提供在真实环境中使用ROS的重要建议。我特别感谢来自大加那利岛的朋友给我介绍这令人振奋的工作。
最后,我要感谢我的家人Yoshihiko、Nobuko和Ayaka对我的生活和梦想的支持,同时感谢女朋友对我的理解。
Matthieu Keller是一位热爱技术和计算机科学的法国工程师。他接受的教育涉及计算和机器人学,这使他成为一名爱好者。他审校了本书的第1版。
Aridane J. Sarrionandia de León研究计算机科学,并对机器人学和自主航行器有非常大的兴趣。他的学位课题是关于使用声呐的水下地图构建,为此他在自主水下航行器中使用ROS工作。他有自主系统和ROS的经验。他熟悉OpenCV和PCL,目前正在开发自主水面航行器的控制系统。
我要感谢Luis和Aaron给我这个机会审校这本书。同时,我要感谢拉斯帕尔马斯大学的AVORA团队,特别是Aaron、Luis和Enrique,他们给我介绍了ROS的神奇之处,并帮助我探索自主航行器世界。感谢我的导师Jorge Cabrera Gámez,他让我有机会成为AVORA团队的一员。
最后,我要感谢我的家人和朋友在我生活中出现问题时支持我,特别要感谢Eva纠正我不清晰的语句。
Contents  目 录
审校者简介
第1章 ROS Hydro系统入门
1.1 PC安装教程
1.2 使用软件库安装ROS Hydro
1.2.1 配置Ubuntu软件库
1.2.2 添加软件库到sources.list文件中
1.2.3 设置密钥
1.2.4 安装ROS
1.2.5 初始化rosdep
1.2.6 配置环境
1.2.7 安装rosinstall
1.3 如何安装VirtualBox和Ubuntu
1.3.1 下载VirtualBox
1.3.2 创建虚拟机
1.4 在BeagleBone Black上安装ROS Hydro
1.4.1 准备工作
1.4.2 配置主机和source.list文件
1.4.3 设置密钥
1.4.4 安装ROS功能包
1.4.5 初始化rosdep
1.4.6 在BeagleBone Black中配置环境
1.4.7 在BeagleBone Black中安装rosinstall
1.5 本章小结
第2章 ROS系统架构及概念
2.1 理解ROS文件系统级
2.1.1 工作空间
2.1.2 功能包
2.1.3 综合功能包
2.1.4 消息
2.1.5 服务
2.2 理解ROS计算图级
2.2.1 节点与nodelet
2.2.2 主题
2.2.3 服务
2.2.4 消息
2.2.5 消息记录包
2.2.6 节点管理器
2.2.7 参数服务器
2.3 理解ROS开源社区级
2.4 ROS系统试用练习
2.4.1 ROS文件系统导览
2.4.2 创建工作空间
2.4.3 创建ROS功能包和综合功能包
2.4.4 编译ROS功能包
2.4.5 使用ROS节点
2.4.6 如何使用主题与节点交互
2.4.7 如何使用服务
2.4.8 使用参数服务器
2.4.9 创建节点
2.4.10 编译节点
2.4.11 创建msg和srv文件
2.4.12 使用新建的srv和msg文件
2.4.13 启动文件
2.4.14 动态参数
2.5 本章小结
第3章 可视化和调试工具
3.1 调试ROS节点
3.1.1 使用gdb调试器调试ROS节点
3.1.2 ROS节点启动时调用gdb调试器
3.1.3 ROS节点启动时调用valgrind分析节点
3.1.4 设置ROS节点core文件转储
3.2 日志信息
3.2.1 输出日志信息
3.2.2 设置调试信息级别
3.2.3 为特定节点配置调试信息级别
3.2.4 信息命名
3.2.5 按条件显示信息与过滤信息
3.2.6 显示信息的方式——单次、可调、组合
3.2.7 使用rqt_console和rqt_logger_level在运行时修改调试级别
3.3 检测系统状态
3.3.1 检测节点、主题、服务和参数
3.3.2 使用rqt_graph在线检测节点状态图
3.4 设置动态参数
3.5 当出现异常状况时使用  
3.6 可视化节点诊断
3.7 绘制标量数据图
3.8 图像可视化
3.9 3D可视化
3.9.1 使用rqt_rviz在3D世界中实现数据可视化
3.9.2 主题与坐标系的关系
3.9.3 可视化坐标变换
3.10 保存与回放数据
3.10.1 什么是消息记录包文件
3.10.2 使用rosbag在消息记录包中记录数据
3.10.3 回放消息记录包文件
3.10.4 检查消息记录包文件的主题和消息
3.11 应用rqt与rqt_gui插件
3.12 本章小结
第4章 在ROS下使用传感器和执行器
4.1 使用游戏杆或游戏手柄
4.1.1 joy_node如何发送游戏杆动作消息
4.1.2 使用游戏杆数据在turtlesim中移动海龟
4.2 使用激光雷达——Hokuyo URG-04lx
4.2.1 了解激光雷达如何在ROS中发送数据
4.2.2 访问和修改激光雷达数据
4.3 使用Kinect传感器查看3D环境中的对象
4.3.1 如何发送和查看Kinect数据
4.3.2 创建使用Kinect的示例
4.4 使用伺服电动机——Dynamixel
4.5 使用Arduino添加更多的传感器和
4.6 在Arduino上使用超声波传感器
4.7 距离传感器如何发送消息
4.7.1 创建使用超声波的示例
4.7.2 Xsens如何在ROS中发送数据
4.7.3 创建使用Xsens的示例
4.8 使用10自由度低成本惯性测量模组IMU
4.8.1 下载加速度传感器库
4.8.2 Arduino Nano和10自由度传感器编程
4.8.3 创建ROS节点以使用10自由度传感器数据
4.9 GPS的使用
4.9.1 GPS如何发送信息
4.9.2 创建一个使用GPS的工程实例
4.10 本章小结
第5章 计算机视觉
5.1 连接和运行摄像头
5.1.1 FireWire IEEE1394摄像头
5.1.2 USB摄像头
5.2 使用OpenCV制作USB摄像头 驱动程序
5.2.1 通过cv_bridge使用OpenCV处理ROS图像
5.2.2 使用image transport发布图像
5.2.3 在ROS中使用OpenCV
5.2.4 显示摄像头输入的图像
5.3 标定摄像头
5.4 ROS图像管道
5.5 计算机视觉任务中有用的ROS功能包
5.6 使用viso2实现视觉里程计
5.6.1 摄像头位姿标定
5.6.2 运行viso2在线演示
5.6.3 使用低成本双目摄像头运行viso2
5.7 使用RGBD深度摄像头实现视觉里程计
5.7.1 安装fovis
5.7.2 用Kinect RGBD深度摄像头运行fovis
5.8 计算两幅图像的单应性
5.9 本章小结
第6章 点云
6.1 理解点云库
6.1.1 不同的点云类型
6.1.2 PCL中的算法
6.1.3 ROS的PCL接口
6.2 我的第一个PCL程序
6.2.1 创建点云
6.2.2 加载和保存点云到硬盘
6.2.3 可视化点云
6.2.4 滤波和缩减采样
6.2.5 配准与匹配
6.2.6 点云分区
6.4 本章小结
第7章 3D建模与仿真
7.1 在ROS中自定义机器人的3D模型
7.2 创建第一个URDF文件
7.2.1 解释文件格式
7.2.2 在rviz里查看3D模型
7.2.3 加载网格到机器人模型
7.2.4 使机器人模型运动
7.2.5 物理属性和碰撞属性
7.3 xacro——?一个更好的机器人建模方法
7.3.1 使用常量
7.3.2 使用数学方法
7.3.3 使用宏
7.3.4 使用代码移动机器人
7.3.5 使用SketchUp进行3D建模
7.4 在ROS中仿真
7.4.1 在Gazebo中使用URDF 3D模型
7.4.2 在Gazebo中添加传感器
7.4.3 在Gazebo中加载和使用地图
7.4.4 在Gazebo中移动机器人
7.5 本章小结
第8章 导航功能包集入门
8.1 ROS导航功能包集
8.2 创建变换
8.2.1 创建广播机构
8.2.2 创建侦听器
8.2.3 查看坐标变换树
8.3 发布传感器信息
8.4 发布里程数据信息
8.4.1 Gazebo如何获取里程数据
8.4.2 创建自定义里程数据
8.5 创建基础控制器
8.5.1 使用Gazebo创建里程数据
8.5.2 创建自己的基础控制器
8.6 使用ROS创建地图
8.6.1 使用map_server保存地图
8.6.2 使用map_server加载地图
8.7 本章小结
第9章 导航功能包集进阶
9.1 创建功能包
9.2 创建机器人配置
9.3 配置全局和局部代价地图
9.3.1 基本参数的配置
9.3.2 全局代价地图的配置
9.3.3 局部代价地图的配置
9.3.4 基本局部规划器配置
9.4 为导航功能包集创建启动文件
9.5 为导航功能包集设置rviz
9.5.1 2D位姿估计
9.5.2 2D导航目标
9.5.3 静态地图
9.5.4 粒子云
9.5.5 机器人占地空间
9.5.6 局部代价地图
9.5.7 全局代价地图
9.5.8 全局规划
9.5.9 局部规划
9.5.10 规划器规划
9.5.11 当前目标
9.6 自适应蒙特卡罗定位
9.7 使用rqt_reconfigure修改参数
9.8 机器人避障
9.9 发送目标
9.10 本章小结
第10章 使用MoveIt!
10.1 MoveIt!体系结构
10.1.1 运动规划
10.1.2 规划场景
10.1.3 运动学
10.1.4 碰撞检测
10.2 在MoveIt!中集成一个机械臂
10.2.1 工具箱里有什么
10.2.2 使用设置助手生成一个MoveIt!包
10.2.3 集成到rviz
10.2.4 集成到Gazebo或实际机器人的手臂
10.3 简单的运动规划
10.3.1 规划单个目标
10.3.2 规划一个随机目标
10.3.3 规划预定义的群组状态
10.3.4 显示目标的运动
10.4 考虑碰撞的运动规划
10.4.1 将对象添加到规划场景中
10.4.2 从规划的场景中删除对象
10.4.3 应用点云进行运动规划
10.5 抓取和放置任务
10.5.1 规划的场景
10.5.2 感知
10.5.3 抓取
10.5.4 抓取操作
10.5.5 放置操作
10.5.6 演示模式
10.5.7 在Gazebo中仿真
10.6 本章小结
ROS Hydro系统入门
欢迎开始阅读本书第1章。本章将介绍如何安装ROS系统,它是一种新的标准化机器人系统软件框架。本书是基于ROS Fuerte的《ROS机器人程序设计》一书的升级版。通过ROS,你可以使用大量的示例代码和开源程序轻松地完成机器人编程和控制。同时,你还能够理解如何使用各种传感器与执行器,并为你的机器人增加新的功能,如自动导航和视觉感知等。得益于开源理念,以及持续开发最先进算法并不断提供新功能的开源社区,ROS不断进步完善。
通过本书,你将学习到如下内容:
在特定版本的Ubuntu系统下安装ROS Hydro框架
ROS的基本操作
调试以及数据可视化
在ROS框架下进行机器人编程
连接传感器、执行器和硬件设备以创建机器人
创造三维(3D)模型并进行仿真
使用导航功能包集使机器人实现自主行驶
本章主要介绍怎样在Ubuntu系统中安装完整版本的ROS Hydro。Ubuntu不但能够全面支持ROS,而且是ROS官方推荐的操作系统。当然,你也可以在其他的操作系统中安装ROS。这本书使用的Ubuntu版本是12.04(Precise Pangolin),你可以在http://releases.ubuntu.com/12.04/免费下载安装。
在开始安装之前,我们首先了解一下ROS的历史。
Robot Operating System(ROS)是一个得到广泛使用的机器人系统的软件框架。ROS的基本原理是无需改动就能够在不同的机器人上复用代码。基于这些,我们就可以在不同的机器人上分享和复用已经实现的功能,而不需要做太多的工作,避免了重复劳动。
2007年,斯坦福大学人工智能实验室(Stanford Artificial Intelligence Laboratory,SAIL)在斯坦福AI机器人项目(Stanford AI Robot project)的支持下开发了ROS。2008年之后,其主要在Willow Garage公司支持下与超过20多家研究机构联合研发ROS。
现在已经有很多家研究机构通过增加ROS支持的硬件或开放软件源代码的方式加入ROS系统的开发中。同样,也有很多家公司将其产品逐步进行软件迁移并在ROS系统中应用。一些完全支持ROS系统的平台如下图所示。这些平台往往会开放大量的代码、示例和仿真环境,以便开发人员轻松地开展工作。前三个发布代码的机器人例子是人形机器人。最后一个是由拉斯帕尔马斯大学开发的水下机器人,代码尚未公布。你可以在http://wiki.ros.org/Robots找到很多这样的例子。
ROS系统已经支持这些机器人中的传感器和执行器,同时每天ROS软件框架支持的设备也在增加。此外,得益于ROS和开放硬件,大量公司正在创建更便宜和更强大的传感器。Arduino开发板是一个很好的例子,使用廉价的电路板可以添加很多类型的传感器如编码器、光和温度传感器等。
ROS提供了一个标准的操作系统环境,包括硬件抽象、底层设备控制、通用功能的实现、进程间消息转发和功能包管理等。
它基于一个集中式拓扑的图结构,在节点中接收许多传感器、控制、状态、规划、执行器数据进行计算处理,并发送。它的各种库与功能包都是面向类UNIX系统的。
*-ros-pkg作为一种社区化的软件库使开发高级库更为容易。其中,很多功能是和ROS系统绑定的,如导航库和rviz可视化界面都基于这个库。其中的一些库包含很多强大的工具,可以帮助我们方便使用ROS并了解机器人当前的实时状态。其中,可视化工具、仿真环境和调试工具是最重要的几个。在下图中你可以看到两个工具,rviz和rqt_plot。中间是rqt_plot的截图,你可以看到由传感器数据绘制的曲线。另外两个截图是rviz;截图中可以看到真实机器人的三维显示。
ROS是一个使用BSD(Berkeley Software Distribution)开源协议的开源软件。无论是商业应用还是科学研究它都是免费的。*-ros-pkg包受到了多个开源协议的限制。
用ROS你可以做更多工作。你可以使用库中的代码,改进后再次共享。这种观念就是开源软件的本质。
ROS已经发布了多个版本,最新的版本是Indigo。在本书中,我们使用的版本是Hydro,因为这个版本更加稳定,而Indigo是实验版本,可能存在错误。
下面会介绍如何安装Hydro版本的ROS。即使在本书中我们使用Hydro,但是在实际工作中,你仍然可能需要安装老版本以便运行一些代码。
如前所述,本书中所使用的操作系统是Ubuntu,全书的内容及教程将以该系统为基础。如果你习惯使用其他操作系统又想完成本书的学习,最好的选择就是安装一个带有Ubuntu的虚拟机。因此,本章末尾会介绍虚拟机的安装方法。
当然,如果你想在其他系统中安装ROS,你可以根据链接http://wiki.ros.org/hydro/Installation中的指导来完成。
1.1 PC安装教程
我们假设你已经安装了Ubuntu 12.04系统。我们使用这个版本的Ubuntu,因为它是一个长期支持版本,配备了Long-Term Support(LTS)。这意味着社区在5年内将对这个版本提供维护。
此外,你需要具备一定的Linux和命令工具基本知识,例如终端、vim、创建文件夹等。如果需要学习这些工具,你可以在网上找到很多相关的资源,或者你也可以参考这些主题相关的图书。
1.2 使用软件库安装ROS Hydro
2014年,ROS网页更新了设计风格和内容的组织。你可以看到如下的网页截图:
在菜单中,可以找到关于ROS的信息以及ROS是否适用于你的系统等内容。
ROS的安装说明可以在开始(Getting Started)部分的安装(Install)选项卡中找到。
建议你在系统中使用软件库而不是源代码安装ROS,除非你是一个专业用户,想进行自定义安装;在这种情况下,你可能更喜欢使用源代码安装ROS。
所以我们使用软件库安装ROS,下面将开始在我们的系统中配置Ubuntu软件库。
1.2.1 配置Ubuntu软件库
在本节中,你将学习安装ROS Hydro的步骤。这个过程基于官方安装页面的内容讲述,链接地址是http://wiki.ros.org/hydro/Installation/Ubuntu。
我们假设你理解Ubuntu软件库(repository)的含义,并且知道如何管理它。如果你有任何疑问,请查询https://help.ubuntu.com/community/Repositories/Ubuntu。
在开始安装之前,需要首先配置软件库,为此需要先把软件库属性设为restricted、universe、multiverse。为了检查你的Ubuntu版本是否支持这些软件库,请单击打开桌面左面的Ubuntu软件中心(Ubuntu Software Center),如右图所示。
打开 Edit | Software Sources标签页,你将会看到以下界面,你要保证各个选项与下图中一致。
通常情况下,这些选项都是默认选中的,因此这一步骤你不会遇到什么问题。
1.2.2 添加软件库到sources.list文件中
在这一步中,你应该先选择Ubuntu的版本。在多种版本的操作系统中都可以安装ROS Hydro。虽然你可以使用任何一个版本,但是推荐最新版本,以避免发生问题。请牢记,Hydro在Precise Pangolin(12.04)、Quantal Quetzal(12.10)和Raring Ringtail(13.04)下可以正常工作。
在Ubuntu 12.04(Precise Pangolin)下,安装软件库的具体方法如下:
在Ubuntu 12.10(Quantal Quetzal)下安装软件库的具体方法如下:
在Ubuntu 13.04(Raring Ringtail)下安装软件库的具体方法如下:
一旦添加了正确的软件库,操作系统就知道去哪里下载程序,并根据命令自动安装软件。
1.2.3 设置密钥
这一步是为了确认原始的代码是正确的,并且没有人在未经所有者授权的情况下修改任何程序代码。通常情况下,当添加完软件库时,你就已经添加了软件库的密钥,并将其添加到操作系统的可信任列表中。
现在我们能够确定代码来自授权网站并且没有被修改。
1.2.4 安装ROS
现在准备开始安装ROS。在开始之前最好先升级一下软件,避免错误的库版本或软件版本产生各种问题。输入以下命令升级该软件:
ROS非常大,有时候你会安装一些永远也用不到的库和程序。通常情况下,根据用途有四种不同的安装方式。例如,你是一个高级用户,你只需要为你的机器人进行基本安装,而不需要在硬盘上留过多的空间。在本书中,我们推荐完全安装,因为这样能够保证包含本书中所有示例和教程需要的内容。如果你不知道正在安装的rviz、仿真环境或导航程序是什么,不用担心,你将会在后续章节中学习如下内容:
最简单的安装方式(并且是推荐的安装方式,但你需要足够大的硬盘空间)就是桌面完整安装(desktop-full)。这将安装ROS、rqt工具箱、rviz可视化环境(3D)、通用机器人库、2D(如stage)和3D(如gazebo)仿真环境、导航工功能包集(移动、定位、地图绘制、机械臂控制),以及其他感知库,如视觉、激光雷达和RGBD摄像头(深度摄像头):
如果你没有足够的硬盘空间,或更喜欢安装特定部分的功能包集,那么第一次安装可以仅安装桌面安装文件,包括ROS、rqt工具箱、rviz和其他通用机器人库。之后在需要的时候,再安装其他功能包集(使用apt命令并查找ros-hydro -*功能包集):
如果你只是想尝试一下,请安装ROS-base。ROS-base通常直接安装在机器人上,尤其是机器人没有屏幕和人机界面,只能tty远程登录的情况下。它只安装ROS的编译和通信包,而没有任何的GUI工具。在BeagleBone Black(BBB)中,你将使用下面命令:
最后,无论你选择哪一个选项进行安装,你都可以独立安装特定的ROS功能包集(将STACK替换成给定功能包集的名称):
1.2.5 初始化rosdep
在使用ROS之前,必须先安装和初始化rosdep命令行工具。这可以使你轻松地安装库和编译源代码时的系统依赖,来运行在ROS中的一些核心组件。在ROS Fuerte中,你必须安装完ROS后再安装rosdep,因为它是一个独立的工具。现在rosdep默认安装在ROS中。你可以使用下面的命令安装和初始化rosdep:
1.2.6 配置环境
恭喜你!能到这一步,说明你已经成功安装了某个版本的ROS!为了能够运行它,系统需要知道可执行或二进制文件以及其他命令的位置。为了实现以上目的,你需要执行以下脚本:
如果你还安装了另一个ROS发行版,每次你需要通过调用脚本来使用它,这个脚本会直接配置你的环境。在此我们使用的是ROS Hydro的脚本,如果你想尝试其他发行版,只需要用Fuerte或Groovy代替Hydro即可。
如果你在命令行中输入roscore,那么将看到有程序启动。这是用来测试是否完成ROS安装以及是否正确安装最好的方法。
请注意,如果你再次打开一个命令行窗口,并输入roscore或其他ROS命令,却无法工作了。这是因为你需要再一次执行脚本来配置全局变量和ROS的安装路径。
这个问题很容易解决,你只需要在.bashrc文件最后添加脚本,当你开始新命令行时,该脚本将执行并配置环境。
.bashrc文件在用户的home文件夹下(/home/用户名/.bashrc)。每次用户打开终端,这个文件加载命令行或终端的配置。所以你可以添加命令或配置方便用户使用。出于这个原因,我们将在.bashrc文件结束时添加脚本,以避免我们每次打开一个新终端时都要重复输入命令。我们用下面命令:
如果要使配置生效,你必须使用下面的命令去执行这个文件,或关闭当前终端,打开另一个新终端。
一些用户需要在他们的系统中安装不止一个ROS的发行版。由于每次调用脚本都会覆盖系统当前配置,所以~/.bashrc只能设置你正在使用的那一个版本的setup.bash。为了实现在几个发行版之间切换,你需要调用不同的setup.bash脚本。
例如,在.bashrc文件下面可能有这么几行代码:
在这种情况下,ROS Electric版本将被执行。所以你必须确保将要运行的版本是文件中的最后一个。
如果你想通过终端检查使用的版本,可以非常简单地使用echo $ROS_DISTRO命令。
1.2.7 安装rosinstall
现在,下一步工作是安装一个命令工具,以帮助我们使用一条命令安装其他包。这个工具是基于Python的,但是别担心,使用它不需要你掌握Python。你在接下来的章节中将学习如何使用这个工具:
运行以下命令在Ubuntu中安装这个工具:
这就完成了!你已经在你的系统完成了一个完整的ROS系统安装。当我完成一个新安装的ROS后,我个人喜欢测试两个东西:roscore和turtlesim。
如果你想做相同的事,在不同命令行分别输入以下命令:
如果一切正常,你将看到右边的界面:
1.3 如何安装VirtualBox和Ubuntu
VirtualBox是一个通用、完整的虚拟机,它适用于x86硬件,面向服务器、台式机和嵌入式应用。VirtualBox是免费的,支持所有主流的操作系统。几乎每一个Linux爱好者都会使用它。
由于我们推荐使用Ubuntu,你可能不希望更改计算机现有的操作系统。而如VirtualBox之类的工具就可以满足此类需求。它能帮助我们在计算机上虚拟化新的操作系统,而无需对计算机硬件做任何改动。
后面的章节将展示如何安装VirtualBox和Ubuntu。此外,通过安装虚拟机,你可以在一个干净的操作系统中完成开发。如果你遇到任何问题,能够通过快速重启计算机解决,也可以备份虚拟机及所有必要的机器人安装文件。
1.3.1 下载VirtualBox
第一步是下载VirtualBox的安装文件。在编写本书时,以下链接能够在Windows系统中下载最新的可用版本:http://download.virtualbox.org/virtualbox/4.3.12/VirtualBox4.3.12-93733-Win.exe。
一旦安装完成,你就需要下载Ubuntu的镜像文件。在本教程中,我们使用一个已经安装了ROS Hydro的Ubuntu镜像文件。可以通过以下链接下载它:http://nootrix.com/2014/04/virtualized-ros-hydro/。
对于这个版本,Nootrix团队使用torrent下载虚拟机。我尝试了以这种方式下载文件并且效果很好。
你也可以找到预安装了Ubuntu和ROS的其他虚拟机,但我们还是要使用这个ROS官网推荐的版本。
1.3.2 创建虚拟机
通过下载好的文件创建虚拟机非常简单,只需要按照本节的内容一步一步进行即可。打开VirtualBox软件并单击File |Import Appliance,然后点击Open appliance并选择之前下载好的ROSHydro.ova文件,如下图所示。
在下一个窗口中,可以配置新虚拟机的参数。我们保持默认配置并且仅仅改变虚拟机的名称。这个名称帮助我们区分不同的虚拟机。我们推荐给它起一个容易理解的名称,在这里我们使用本书的名称,如下图所示。
点击Import按钮,并在下一个窗口中接受软件授权许可。你将看到一个进度条。这表明VirtualBox正在复制虚拟机镜像文件,它在以新的名称创建新的副本。
需要说明的是,这个过程并不会影响原有的ROS.ova文件,并且你可以通过对原文件进行多次复制创建多个虚拟机。
复制过程所需要的时间取决于计算机的执行速度。当它完成时,可以点击Start按钮启动虚拟机。需要注意的是,如果你的机器上有多个虚拟机,在启动前应该选择正确的那一个。当然,在这个例子里只有一个虚拟机。
有时候会出现如下图所示的错误提示。这是因为计算机没有正确的USB 2.0驱动程序。可以通过安装Oracle VM VirtualBox扩展包(Extension Pack)来解决问题,当然也可以通过在虚拟机中禁用USB支持来解决。
为了禁用USB支持,在虚拟机上右键单击并选择Settings。在工具栏中,选择Ports | USB,并取消勾选Enable USB 2.0(EHCI)Controller复选框,如下图所示。重启虚拟机后,就不会再出现任何问题。
虚拟机启动之后,你能看到完成ROS安装之后的Ubuntu 12.04界面,如下图显示:
当完成这些步骤后,你就有了一个能够在这本书中使用的完整版本的ROS Hydro。你可以运行所有的例子和我们将使用的功能包集。遗憾的是,VirtualBox在使用部分实际外接设备的时候会有问题,并且你可能无法使用这个ROS Hydro镜像完成第4章中给出的例子。
1.4 在BeagleBone Black上安装ROS Hydro
BeagleBone Black(BBB)是一种基于ARM Cortex A8处理器的低成本开发平台。此开发板是基于?ngstr?m Linux发行版制作的。?ngstr?m由一支希望统一嵌入式系统Linux发行版的小型团队开发,他们希望操作系统是稳定且用户友好的。
考虑到社区的开发人员需要一个具有一些通用输入/输出(GPIO)引脚的机载计算机设备,德州仪器设计了BeagleBone Black。BeagleBone Black平台是BeagleBone的改进版。开发板的主要特性包括ARM Cortex A8处理器(时钟频率为1GHz,内存为512MB),具有以太网、USB接口、HDMI、46引脚GPIO接口。这些GPIO可以设置为数字I/O、ADC、脉宽调制,以及I2C、SPI或者UART等通信协议接口。GPIO是一种直接将传感器和执行器与BeagleBone连接的简单方法。BeagleBone如下图所示:
在BeagleBone开发板刚推出时,无法直接在?ngstr?m发行版上安装ROS。由于这个原因,通常在BeagleBone上安装基于Ubuntu的操作系统。有不同版本的Ubuntu ARM兼容BeagleBone Black和ROS,推荐在运行ROS的平台上使用Ubuntu 13.04 ARM raring armhf的镜像。
目前已有了?ngstr?m发行版的ROS版本安装文件。安装步骤可以参考网址http://wiki.ros.org/hydro/Installation/Angstrom。除此之外,我们选择在Ubuntu ARM上安装ROS还因为这个发行版更常用,此外它还可以用于其他基于ARM的开发板,如UDOO Odroid U3、Odroid X2或Gumstick。
ARM技术在智能手机和平板计算机等移动设备领域蓬勃发展。除了增加的ARM cortex运算性能,高集成度和低功耗也使这项技术更适合于自主机器人系统开发。在过去的几年里,开发人员已经在市场上推出多款ARM平台。其中一些特性类似于BeagleBone Black、Raspberry PI或Gumstick Overo。此外,更强大的开发板(如具备双核ARM Cortex A9的Gumstick DuoVero或四核版Odroid U3、Odroid X2或UDOO)也已经上市。
1.4.1 准备工作
在安装ROS到Beaglebone Black之前,我们需要做一些准备工作。本书的重点是介绍ROS,我们将列出这些准备工作但不详细介绍。很多关于Beaglebone Black和Ubuntu ARM的信息可以在网站、论坛和书中找到。
首先,我们必须安装一个与ROS兼容的Ubuntu ARM发行版。所以需要Ubuntu ARM的安装镜像。可以通过下面的命令使用wget获得Ubuntu 13.04 Raring armhf:
下载Ubuntu 13.04 armhf镜像,将其安装到SD卡上。可以在eLinux网址上得到关于如何安装Ubuntu到Bealgebone Black的更多细节:http://elinux.org/Beagleboard:Ubuntu_On_BeagleBone_Black # Ubuntu_ Raring_On_Micro_SD。
在之前的网页上描述的过程工作良好,但是我们必须注意所使用的Ubuntu版本。由于网站会定期更新,因此它们现在使用的是Ubuntu 14.04,但这可能与我们所使用的ROS不兼容。我们将使用之前提及的Ubuntu 13.04 Raring armhf。
一旦在开发平台中安装好Ubuntu ARM,就需要配置Beaglebone Black的网络接口以实现网络访问。所以,必须配置如IP、DNS和网关等网络配置。
记住,在另一个计算机上挂载SD卡并编辑/etc/network/interfaces可能是最简单的方式。
设置好网络后,为了安装ROS中如CMake、Python或Vim等可能需要的功能包、程序和库,使用以下命令:
用于Beaglebone Black的操作系统在微型SD卡上配置的空间为1至4GB。这个存储空间是非常有限的,如果我们想要使用一个大的ROS Hydro功能包,它可能就不够用了。为了解决这个问题,我们可以使用空间更大的SD卡,重新分区,扩大文件系统占可用空间的比例。
如果需要使用更大的存储空间,建议扩大Beaglebone Black内存文件系统。在网址http://elinux.org/Beagleboard:Expanding_File_System_Partition_On_A_microSD可以得到相关内容的进一步介绍。
通过下列命令可以实现上述目的:
1.需要切换到超级用户模式,输入下面的命令并输入密码:
2.查看SD卡的分区信息:
3.输入p,可见SD卡的两个分区:
4.之后,输入'd'删除分区,然后输入2指定要删除的分区/dev/mmcblk0p2:
5.输入n,创建一个新分区;如果输入p将创建一个主分区。我们输入2指定第二个分区的编号。
6.如果没有问题,输入w保存这些操作,或按Ctrl + Z组合键取消更改:
7.完成后重启开发板:
8.完成重启后,再次切换到超级用户模式:
9.最后,运行下面的命令执行操作系统内存文件系统的扩容。
现在我们准备好安装ROS了。安装的过程非常类似于在本章之前介绍过的安装,主要区别是我们不能安装ROS full-desktop,必须单独安装每一个功能包。
1.4.2 配置主机和source.list文件
现在开始配置主机:
在这之后,我们将配置源列表,这基于我们安装在BeagleBone Black中的Ubuntu版本。兼容BeagleBone Black的Ubuntu版本数量有限,目前活跃的发行版是Ubuntu 13.04 raring armhf,它也是Ubuntu ARM最受欢迎的版本。
Ubuntu 13.04 Raring armhf:
Ubuntu 12.10 Quantal armhf:
Ubuntu 12.04 Precise armhf:
1.4.3 设置密钥
正如前面所解释的,这一步需要确认源代码是正确的,并且没有人在未经所有者授权的情况下修改过代码或程序:
1.4.4 安装ROS功能包
在安装ROS功能包之前,我们必须更新系统以避免出现库依赖的问题。
这部分安装与Beaglebone Black略有不同。ROS中有很多库和功能包,并不是全部都能在ARM上完整编译。所以不可能实现一个完整的桌面版安装。建议独立安装各功能包,以确保它们能在ARM平台上运行。
你可以尝试安装ROS-base,称为ROS Bare Bones。ROS-base会安装包括编译和通信库以及ROS功能包,但不包括GUI工具:
我们可以使用下面的命令来安装指定的ROS功能包:
如果我们需要查找在BeagleBone Black中可用的ROS功能包,运行下面的命令:
例如,下面的包为ROS正常工作的基础,可以使用apt-get单独安装:
虽然从理论上讲,BeagleBone Black并不支持所有的ROS功能包,但实际上我们已经能够将在PC上开发的整个项目移植到BeagleBone Black。我们成功尝试了很多功能包,只有安装rviz没有实现。
1.4.5 初始化rosdep
在使用ROS之前,必须首先安装并初始化rosdep命令行工具,可使你轻松地安装库并解决你准备编译源代码的系统依赖问题,以及提供ROS运行需要的一些核心组件。可以使用下面的命令安装并初始化rosdep:
1.4.6 在BeagleBone Black中配置环境
如果你已经到达这一步,恭喜你,因为你已经在BeagleBone Black中成功地安装了ROS。添加下面的ROS环境变量到bash中,这样它们就会在每次命令行启动时自动加载:
如果在系统中有多个版本的ROS我们必须注意。bashrc的变量必须设置为我们正在使用的版本。
如果我们想要在当前命令行中配置环境,运行命令如下:
1.4.7 在BeagleBone Black中安装rosinstall
rosinstall是ROS中一个常见的命令行工具,使安装功能包更方便。如果你要安装它,可以在Ubuntu中使用下面的命令行:
1.5 本章小结
在这一章,我们学习了如何在不同Ubuntu设备上(计算机、VirtualBox、BeagleBone Black)安装ROS Hydro。通过这些步骤,你已经在系统上安装了一切必要的软件,可以使用ROS开始工作,也可以练习本书中的示例。你也可以使用源代码来安装ROS。但这样做需要编译所有代码,因此只适用于高级Linux用户。而我们一般建议你使用软件库安装,这样做更通用,且一般不会出现任何错误或问题。
如果你对Ubuntu系统不是很熟悉,那么建立一个虚拟机并在虚拟机上学习使用ROS会更加方便。这样,如果你在安装和使用过程中发生任何问题,都无需重新安装操作系统,只需要恢复虚拟机镜像文件,然后就可以重新开始。
通常情况下,虚拟机不能访问扩展出的实际硬件,如传感器和执行器。尽管如此,你仍可以用它来测试算法。
下一章将学习ROS的架构、一些重要的概念,以及一些能够与ROS进行直接交互的工具。
ROS系统架构及概念
一旦你完成了ROS系统的安装,你肯定会想“好了,我已经安装完成,那么下一步要做什么呢?”在本章我们将学习ROS系统架构及它的组成。然后,我们会开始创建节点和功能包,并使用ROS系统自带的TurtleSim示例。
ROS系统的架构主要被设计和划分成了三部分,每一部分都代表一个层级的概念:
文件系统级(The Filesystem level)
计算图级(The Computation Graph level )
开源社区级(The Community level)
第一级是文件系统级。在这一级,我们会使用一组概念来解释ROS的内部构成、文件夹结构,以及工作所需的核心文件。
第二级是计算图级,体现的是进程和系统之间的通信。在相关小节中,我们将学习ROS的各个概念和功能,包括建立系统、处理各类进程、与多台计算机通信等。
第三级是开源社区级,我们将解释一系列的工具和概念,其中包括在开发人员之间如何共享知识、算法和代码。这个层级非常重要,正是由于开源社区的大力支持,ROS系统才得以快速成长。
2.1 理解ROS文件系统级
如果你刚接触ROS,无论是准备使用ROS系统还是准备开发ROS项目,你都会觉得ROS中的各种概念非常奇怪。而一旦你驾轻就熟,那么这些概念就会变得熟悉了。
与其他操作系统类似,一个ROS程序的不同组件要被放在不同的文件夹下。这些文件夹是根据功能的不同来对文件进行组织的:
功能包(Package):功能包是ROS中软件组织的基本形式。一个功能包具有用于创建ROS程序的最小结构和最少内容。它可以包含ROS运行的进程(节点)、配置文
功能包清单(Package Manifest):功能包清单提供关于功能包、许可信息、依赖关系、编译标志等的信息。一个包的清单由一个名为package.xml的文件管理。
综合功能包(Metapackage):如果你将几个具有某些功能的功能包组织在一起,那么你将会获得一个综合功能包。在ROS Fuerte中,这种包的组织形式被称为功能包集(Stack)。为了保持ROS简洁,功能包集被移除,现在使用综合功能包实现这个功能。在ROS系统中,存在大量不同用途的综合功能包,例如导航功能包集。
综合功能包清单(Metapackage manifest):综合功能包清单(package.xml)类似普通功能包但有一个XML格式的导出标记。它在结构上也有一定的限制。
消息类型(Message(msg)type):消息是一个进程发送到其他进程的信息。ROS系统有很多的标准类型消息。消息类型的说明存储在my_package/msg/MyMessageType.msg中,也就是对应功能包的msg文件夹下。
服务类型(Service(srv)type):服务描述说明存储在my_package/srv/MyServiceType.srv中,定义了在ROS中由每个进程提供的关于服务请求和响应的数据结构。
在右侧的截图中,可以看到turtlesim功能包的内容。你看到的是一系列文件和文件夹,包含代码、图片、启动文件、服务和消息。记住,截图显示文件的一个简短列表,真正的功能包会更多。
2.1.1 工作空间
概言之,工作空间就是一个包含功能包、可编辑源文件或编译包的文件夹。当你想同时编译不同的功能包时非常有用,并且可以用来保存本地开发包。
下图所示的是一个典型的工作空间。每个文件夹都是一个具有不同功能的空间:
源文件空间(The Source space):在源空间(src文件夹)放置了功能包、项目、克隆包等。在这个空间最重要的一个文件是CMakeLists.txt。当你在工作空间中配置功能包时,src文件夹CMakeLists.txt调用CMake。这个文件是通过catkin_init_workspace命令创建的。
编译空间(The Build space):在build文件夹里,CMake和catkin为功能包和项目保存缓存信息、配置和其他中间文件。
开发空间(The Development(devel)space):devel文件夹用来保存编译后的程序,这些是无需安装就能用来测试的程序。一旦项目通过测试,你可以安装或导出功能包与其他开发人员分享。
catkin编译包有两个选项。第一个是使用标准CMake工作流程,通过此方式可以一次编译一个包,见以下命令:
如果你想编译所有的包,可以使用catkin_make命令行,见以下命令:
在ROS配置的编译空间目录中,这两个命令编译可执行文件。
ROS的另一个有趣的特性是它的覆盖。当你正在使用ROS功能包,例如Turtlesim,你可以使用安装版本,也可以下载源文件并编译它来使用你的修改版本。
ROS允许使用你自己版本的功能包以替代安装版本。如果你正在安装升级包,这是非常有用的。或许此时你并不理解它的作用,但无需担心,在下一章我们将使用这个功能来创建自己的插件。
2.1.2 功能包
功能包指的是一种特定的文件结构和文件夹组合。这种结构如下所示:
include/package_name/:此目录包含了你需要的库的头文件。
msg/:如果你要开发非标准消息,请把文件放在这里。
scripts/:其中包括Bash、Python或任何其他脚本的可执行脚本文件。
src/:这是存储程序源文件的地方。你可能会为节点创建一个文件夹或按照你希望的方式去组织它。
srv/:这表示服务(srv)类型。
CMakeLists.txt:这是CMake的生成文件。
package.xml:这是功能包清单文件。
为了创建、修改或使用功能包,ROS给我们提供了一些工具:
rospack使用此命令来获取信息或在系统中查找工作空间。
catkin_create_pkg 当你想要创建一个新的功能包时,使用此命令。
catkin_make 使用此命令来编译工作空间。
rosdep 此命令安装功能包的系统依赖项。
rqt_dep:这个命令用来查看包的依赖关系图。如果你想看包的依赖关系图,你会在rqt发现一个称为包图(package graph)插件。选择一个包并查看依赖关系。
若要在文件夹和功能包之间移动文件,ROS提供了非常有用的rosbash功能包,其中包含了一些非常类似于Linux命令的命令。例如:
roscd 此命令用于更改目录,类似于Linux中的cd命令。
rosed 此命令用来编辑文件。
roscp 此命令用于从一些功能包复制文件。
rosd 此命令列出功能包的目录。
rosls 此命令列出功能包下的文件,类似于Linux中的ls命令。
文件package.xml必须在功能包中,用来说明此功能包相关的各类信息。如果你发现在某个文件夹内包含此文件,那么这个文件夹很可能是一个功能包或综合功能包。
打开一个package.xml文件,可以看到包的名称、依赖关系等信息。功能包清单的作用就是为了更容易地安装和分发这些功能包。
在package.xml文件中使用的两个典型标记是&build_depend&和&run_depend&。
&build_depend&标记会显示当前功能包安装之前必须先安装哪些功能包。这是因为新的功能包会使用其他包的一些功能。
&run_depend&标记显示运行功能包代码所需要的包。右面截图是package.xml文件的示例。
2.1.3 综合功能包
如前所述,综合功能包是一些只有一个文件的特定包,它是package.xml。它不包含其他文件,如代码等。
综合功能包用于引用其他功能特性类似的功能包,例如导航包、ros_tutorials等。
你可以将ROS Fuerte的功能包和功能包集转为Hydro和catkin。具体参考http://wiki.ros. org/catkin/migrating_from_rosbuild。
在右面截图中,你可以看到在ros_tutorials综合功能包中package.xml的内容。你可以看到&export&标记和&run_depend&标记,这些是功能包清单中必不可少的。
如果你想定位ros_tutorials综合功能包,可以使用下面的命令:
显示路径为:/opt/ros/hydro/share/ros_tutorials。
查看里面的代码,通过下面命令:
记住Hydro使用综合功能包,不是功能包集,但还是用rosstack命令用于寻找综合功能包。
2.1.4 消息
ROS使用了一种简化的消息类型描述语言来描述ROS节点发布的数据值。通过这样的描述语言,ROS能够使用多种编程语言生成不同类型消息的源代码。
ROS提供了很多预定义消息类型。如果你创建了一种新的消息类型,那么就要把消息的类型定义放到功能包的msg/文件夹下。在该文件夹中,有用于定义各种消息的文件。这些文件都以.msg为扩展名。
消息类型必须具有两个主要部分:字段和常量。字段定义了要在消息中传输的数据类型,例如int32、float32、string或之前创建的新类型,如叫做type1和type2的新类型。常量用于定义字段的名称。
一个msg文件的示例如下:
我们能够在下表中找到很多ROS消息所使用的标准数据类型:
基本类型 序列化 C++ Python
bool(1) unsigned 8-bit int uint8_t(2) bool
int8 signed 8-bit int int8_t int
uint8 unsigned 8-bit int uint8_t int(3)
int16 signed 16-bit int int16_t int
uint16 unsigned 16-bit int uint16_t int
int32 signed 32-bit int int32_t int
uint32 unsigned 32-bit int uint32_t int
int64 signed 64-bit int int64_t long
uint64 unsigned 64-bit int uint64_t long
float32 32-bit IEEE float float float
float64 64-bit IEEE float double float
string ascii string (4) std::string string
time secs/nsecs signed 32-bit ints ros::Time rospy.Time
duration secs/nsecs signed 32-bit ints ros::Duration rospy.Duration
ROS消息中的一种特殊数据类型是报文头,主要用于添加时间戳、坐标位置等。报文头还允许对消息进行编号。通过在报文头内部附加信息,我们可以知道是哪个节点发出的消息,或者可以添加一些能够被ROS处理的其他功能。
报文头类型包含以下字段:
可以通过下面命令查看消息的结构:
我们将在后续的章节中看到,正是通过报文头才能够记录当前机器人运行的时间戳和坐标位置。
在ROS中有一些处理消息的工具。例如rosmsg命令行工具能够输出消息定义信息,并可以找到使用该消息类型的源文件。
在后面的章节中,我们将会学习如何使用正确的工具创建消息。
2.1.5 服务
ROS使用了一种简化的服务描述语言来描述ROS的服务类型。这直接借鉴了ROS msg消息的数据格式,以实现节点之间的请求/响应通信。服务的描述存储在功能包的srv/子目录下.srv文件中。
若要调用服务,你需要使用该功能包的名称及服务名称。例如,对于sample_package1/srv/sample1.srv文件,可以将它称为sample_package1/sample1服务。
ROS中有一些执行某些功能与服务的工具。rossrv工具能输出服务说明、.srv文件所在的功能包名称,并可以找到使用某一服务类型的源代码文件。
如果你想要在ROS中创建一个服务,可以使用服务生成器。这些工具能够从基本的服务说明中生成代码。你只需要在CMakeLists.txt文件中加一行gensrv()命令。
在后面的章节中,我们将会学习如何创建服务。
2.2 理解ROS计算图级
ROS会创建一个连接到所有进程的网络。在系统中的任何节点都可以访问此网络,并通过该网络与其他节点交互,获取其他节点发布的信息,并将自身数据发布到网络上。
在这一层级中最基本的概念包括节点、节点管理器、参数服务器、消息、服务、主题和消息记录包,这些概念都以不同的方式向计算图级提供数据:
节点(Node) 节点是主要的计算执行进程。如果你想要有一个可以与其他节点进行交互的进程,那么你需要创建一个节点,并将此节点连接到ROS网络。通常情况下,系统包含能够实现不同功能的多个节点。你最好让每一个节点都具有特定的单一的功能,而不是在系统中创建一个包罗万象的大节点。节点需要使用如roscpp或rospy的ROS客户端库进行编写。
节点管理器(Master) 节点管理器用于节点的名称注册和查找等。它也设置节点间的通信。如果在你的整个ROS系统中没有节点管理器,就不会有节点、服务、消息之间的通信。需要注意的是,由于ROS本身就是一个分布式网络系统,你可以在某一台计算机上运行节点管理器,在该管理器或其他计算机上运行节点。
参数服务器(Parameter Server) 参数服务器能够使数据通过关键词存储在一个系统的核心位置。通过使用参数,就能够在运行时配置节点或改变节点的工作任务。
消息(Message) 节点通过消息完成彼此的沟通。消息包含一个节点发送到其他节点的信息数据。ROS中包含很多种标准类型的消息,同时你也可以基于标准消息开发自定义类型的消息。
主题(Topic) 每个消息都必须有一个名称来被ROS网络路由。每一条消息都要发布到相应的主题。当一个节点发送数据时,我们就说该节点正在向主题发布消息。节点可以通过订阅某个主题,接收来自其他节点的消息。一个节点可以订阅一个主题,而不需要该节点同时发布该主题。这就保证了消息的发布者和订阅者之间相互解耦,完全无需知晓对方的存在。主题的名称必须是独一无二的,否则在同名主题之间的消息路由就会发生错误。
服务(Service) 在发布主题时,正在发送的数据能够以多对多的方式交互。但当你需要从某个节点获得一个请求或应答时,就不能通过主题来实现了。在这种情况下,服务能够允许我们直接与某个节点进行交互。此外,服务必须有唯一的名称。当一个节点提供某个服务时,所有的节点都可以通过使用ROS客户端库编写的代码与它通信。
消息记录包(Bag) 消息记录包是一种用于保存和回放ROS消息数据的文件格式。消息记录包是一种用于存储数据的重要机制。它能够获取并记录各种难以收集的传感器数据。我们可以通过消息记录包反复获取实验数据,进行必要的开发和算法测试。在使用复杂机器人进行实验工作时,需要经常使用消息记录包。
在下图中你可以看到计算图级的图形化表示(节点状态图)。它表示了真实机器人在真实条件下系统的工作状态。在图中,你可以看到节点和主题,以及哪些节点订阅哪些主题等。此节点状态图中并没有消息、消息记录包、参数服务器和服务。这些内容需要使用其他工具进行图形化展示。用于创建该图表的工具是rqt_graph,在第3章中将学习到更多相关知识。这些概念在ros-comm库中实现。
2.2.1 节点与nodelet
节点都是各自独立的可执行文件,能够通过主题、服务或参数服务器与其他进程(节点)通信。ROS通过使用节点将代码和功能解耦,提高了系统容错能力和可维护性,使系统简化。
ROS有另一种类型的节点,称为nodelet。这类特殊节点可以在单个进程中运行多个节点,其中每个nodelet为一个线程(轻量级进程)。这样,可以在不使用ROS网络的情况下与其他节点通信,节点通信效率更高,并避免网络拥塞。nodelet对于摄像头和3D传感器这类数据传输量非常大的设备特别有用。
节点在系统中必须有唯一的名称。节点使用特定名称与其他节点进行通信而不产生歧义。节点可以使用不同的库进行编写,如roscpp和rospy。roscpp基于C++,而rospy基于Python。在这本书里,我们将使用roscpp。
ROS提供了处理节点的工具,如rosnode。rosnode是一个用于显示节点信息的命令行工具,例如列出当前正在运行的节点。支持的命令如下所示:
rosnode info NODE 输出当前节点信息。
rosnode kill NODE 结束当前运行节点进程或发送给定信号。
rosnode list 列出当前活动节点。
rosnode machine hostname 列出某一特定计算机上运行的节点或列出主机名称。
rosnode ping NODE 测试节点间的连通性。
rosnode cleanup 将无法访问节点的注册信息清除。
在后面的章节中,我们将通过一些示例学习如何使用这些命令。
ROS节点的一个强大功能是可以在启动该节点时更改参数。此功能使我们能够改变节点名称、主题名称和参数名称。我们无需重新编译代码就能重新配置节点,这样就可以在不同的场景中使用该节点。
一个改变主题名称的例子如下所示:
此命令将主题名称从topic1改为/level1/topic1。相信你现在还不甚明了,但在后面的章节中你会发现它的实用性。
更改节点中的参数和更改主题名称很类似。只需要在参数名称前添加一个下划线,例如:
这样参数(param)就设置为浮点数9.0。
请记住,不能使用系统保留的关键字名称,包括:
_name 为节点名称保留的一个特殊关键字。
_log 为记录节点日志存储地址保留的一个关键字。
_ip和_hostname 表示ROS_IP和ROS_HOSTNAME的关键字。
_master 表示ROS_MASTER_URI的关键字。
_ns 表示ROS_NAMESPACE的关键字。
2.2.2 主题
主题是节点间用来传输数据的总线。通过主题进行消息路由不需要节点之间直接连接。这就意味着发布者和订阅者之间不需要知道彼此是否存在。同一个主题也可以有很多个订阅者。一个主题可以有多个订阅者也可以有多个发布者,但是你需要注意用不同的节点发布同样的主题,否则会产生冲突。
每个主题都是强类型的,发布到主题上的消息必须与主题的ROS消息类型相匹配,并且节点只能接收类型匹配的消息。节点要想订阅主题,就必须具有相同的消息类型。
ROS的主题可以使用TCP/IP和UDP传输。基于TCP传输称为TCPROS,它使用TCP/IP长连接。这是ROS默认的传输方式。
基于UDP传输称为UDPROS,它是一种低延迟高效率的传输方式,但可能产生数据丢失。所以它最适合于像远程操控的任务。
ROS有一个rostopic工具用于主题操作。它是一个命令行工具,允许我们获取主题的相关信息或直接在网络上发布数据。此工具的参数如下:
rostopic bw /topic 显示主题所使用的带宽。
rostopic echo /topic 将消息输出到屏幕。
rostopic find message_type 按照类型查找主题。
rostopic hz /topic 显示主题的发布频率。
rostopic info /topic 输出活动主题、发布的主题、主题订阅者和服务的信息。
rostopic list 输出活动主题的列表。
rostopic pub /topic type args 将数据发布到主题。它允许我们直接从命令行中对任意主题创建和发布数据。
rostopic type /topic 输出主题的类型,或者说主题中发布的消息类型。
我们会在后面的章节中学习如何使用这些命令。
2.2.3 服务
当你需要直接与节点通信并获得应答时,将无法通过主题实现,而需要使用服务。
服务需要由用户开发,节点并不提供标准服务。包含消息源代码的文件存储在srv文件夹中。
像主题一样,服务关联一个以功能包中.srv文件名称来命名的服务类型。与其他基于ROS文件系统的类型一样,服务类型是功能包名称和.srv文件名称的组合。例如chapter2_tutorials/srv/chapter2_srv1.srv文件的服务类型是chapter2_tutorials/chapter2_srv1。
ROS关于服务的命令行工具有两个:rossrv和rosservice。我们可以通过rossrv看到有关服务数据结构的信息,并且与rosmsg具有完全一致的用法。
通过rosservice可以列出服务列表和查询某个服务。支持的命令如下所示:
rosservice call/service args 根据命令行参数调用服务。
rosservice find msg-type 根据服务类型查询服务。
rosservice info/service 输出服务信息。
rosservice list 输出活动服务清单。
rosservice type/service 输出服务类型。
rosservice uri/service 输出服务的ROSRPC URI。
2.2.4 消息
一个节点通过向特定主题发布消息,从而将数据发送到另一个节点。消息具有一定的类型和数据结构,包括ROS提供的标准类型和用户自定义类型。
消息的类型在ROS中按照以下标准命名方式进行约定:功能包名称/.msg文件名称。例如,std_msgs/msg/String.msg的消息类型是std_msgs/String。
ROS使用命令行工具rosmsg来获取有关消息的信息。常用参数如下所示:
rosmsg show 显示一条消息的字段。
rosmsg list 列出所有消息。
rosmsg package 列出功能包的所有消息。
rosmsg packages 列出所有具有该消息的功能包。
rosmsg users 搜索使用该消息类型的代码文件。
rosmsg md5 显示一条消息的MD5求和结果。
2.2.5 消息记录包
消息记录包是由ROS创建的一组文件。它使用.bag格式保存消息、主题、服务和其他ROS数据信息。你可以在事件发生后,通过使用可视化工具调用和回放数据,检查在系统中到底发生了什么。你可以播放、停止、后退及执行其他操作。
记录包文件可以像实时会话一样在ROS中再现情景,在相同时间向主题发送相同的数据。通常情况下,我们可以使用此功能来调试算法。
若要使用记录包文件,我们可以使用以下ROS工具:
rosbag 用来录制、播放和执行其他操作。
rqt_bag 用于可视化图形环境中的数据。
rostopic 帮助我们看到节点发送的主题。
2.2.6 节点管理器
ROS节点管理器向ROS系统中其他节点提供命名和注册服务。它像服务一样跟踪主题的发布者和订阅者。节点管理器的作用是使ROS节点之间能够相互查找。一旦这些节点找到了彼此,就能建立点对点的通信。你可以看到以图例显示的ROS执行步骤,包括广播一个主题,订阅一个主题,发布一个消息,如下图所示:
节点管理器还提供了参数服务器。节点管理器通常使用roscore命令运行,它会加载ROS节点管理器及其他ROS核心组件。
2.2.7 参数服务器
参数服务器是可通过网络访问的共享的多变量字典。节点使用此服务器来存储和检索运行时的参数。
参数服务器使用XMLRPC实现并在ROS节点管理器下运行,这意味着它的API可以通过通用的XMLRPC库进行访问。XMLRPC是一个使用XML编码并以HTTP作为传输机制的远程调用(Remote Procedure Call,RPC)协议。
参数服务器使用XMLRPC数据类型为参数赋值,包括以下类型:
32位整数(32-bit integer)
布尔值(Boolean)
字符串(String)
双精度浮点(Double)
ISO 8601日期(ISO8601 date)
列表(List)
基于64位编码的二进制数据(Base64-encoded binary data)
ROS中关于参数服务器的工具是rosparam。其支持的参数如下所示:
rosparam list 列出了服务器中的所有参数。
rosparam get parameter 获取参数值。
rosparam set parameter value 设置参数值。
rosparam delete parameter 删除参数。
rosparam dump file 将参数服务器保存到一个文件。
rosparam load file 加载参数文件到参数服务器。
2.3 理解ROS开源社区级
ROS开源社区级的概念主要是ROS资源,其能够通过独立的网络社区分享软件和知识。这些资源包括:
发行版(Distribution) ROS发行版是可以独立安装、带有版本号的一系列综合功能包。ROS发行版像Linux发行版一样发挥类似的作用。这使得ROS软件安装更加容易,而且能够通过一个软件集合维持一致的版本。
软件库(Repository) ROS依赖于共享开源代码与软件库的网站或主机服务,在这里不同的机构能够发布和分享各自的机器人软件与程序。
ROS维基(ROS Wiki) ROS Wiki是用于记录有关ROS系统信息的主要论坛。任何人都可以注册账户、贡献自己的文件、提供更正或更新、编写教程以及其他行为。
Bug提交系统(Bug Ticket System)如果你发现问题或者想提出一个新功能,ROS提供这个资源去做这些。
邮件列表(Mailing list) ROS用户邮件列表是关于ROS的主要交流渠道,能够像论坛一样交流从ROS软件更新到ROS软件使用中的各种疑问或信息。
ROS问答(ROS Answer)用户可以使用这个资源去提问题。
博客(Blog)你可以看到定期更新、照片和新闻,网址是http://www.ros.org/news。
2.4 ROS系统试用练习
现在是时候对之前学习的内容进行一些练习了。在下面的几小节中,你将看到练习包的创建,使用节点、参数服务器以及通过Turtlesim移动仿真机器人。
2.4.1 ROS文件系统导览
我们通过命令行工具来浏览一下ROS的文件系统。我们将要解释最常用的部分。
为了获得功能包和功能包集的信息,我们将使用rospack、rosstack、roscd和rosls命令。
我们使用rospack和rosstack来获取有关功能包、功能包集、路径和依赖性等信息。例如,如果你想要找turtlesim包的路径,可以使用以下命令:
你将获得以下信息:
同样,如果你想要找到你已经在系统中安装过的某个综合功能包,示例如下:
你将获得到ros-comm综合功能包的路径,如下:
想要获得功能包或功能包集下面的文件列表,那么需要使用:
之前命令的输出如下所示:
如果你想进入某个文件夹,可以使用roscd命令:
你将获得以下新路径:
2.4.2 创建工作空间
在开始具体工作之前,首先创建工作空间。在这个工作空间中,我们将会完成本书中使用的所有代码。
若要查看ROS正在使用的工作空间,请使用下面的命令:
你将会看到如下类似信息:
我们将要创建的文件夹是在~/dev/catkin_ws/src/中。若要新建此文件夹,使用以下命令:
当我们创建工作空间文件夹后,里面并没有功能包,只有CMakeList.txt。下一步是编译工作空间,使用下面命令:
现在,如果你输入ls命令,可以看到上面命令创建的新文件夹,分别是build和devel文件夹。
完成配置,使用下面命令:
这一步只是重新加载了setup.bash文件。如果你关闭并打开一个新的终端,也将得到同样的效果。你应该已经在你的~/.bashrc文件中加入了该命令行,因为我们在第1章用过。如果没有,你可以使用下面命令添加它:
2.4.3 创建ROS功能包和综合功能包
就像之前所说,你也可以手动创建功能包。但是为了避免那些繁琐的工作,最好使用catkin_create_pkg命令行工具。
使用以下命令在之前建立的工作空间创建新的功能包:
此命令的格式包括功能包的名称和依赖项。在这个示例中,依赖项包括std_msgs和roscpp。如以下命令行所示:
这些依赖项包括:
std_msgs 包含了常见消息类型,表示基本数据类型和其他基本的消息构造,如多维数组。
roscpp 使用C++实现ROS的各种功能。它提供了一个客户端库,让C++程序

我要回帖

更多关于 ros kinect 的文章

 

随机推荐