书名:ROS机器人编程实战
ISBN:978-7-115-52359-4
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 [印度] 库马尔•比平(Kumar Bipin)
译 李华峰 张志宇
审 校 常 鹍
责任编辑 胡俊英
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
Copyright ©2018 Packt Publishing. First published in the English language under the title
Robot Operating System Cookbook.
All rights reserved.
本书由英国Packt Publishing公司授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。
版权所有,侵权必究。
ROS(Robot Operating System)是一个机器人软件平台,是用于实现机器人编程和开发复杂机器人应用的开源软件框架,它能为异质计算机集群提供类似操作系统的功能。ROS的前身是斯坦福人工智能实验室为了支持斯坦福智能机器人STAIR而建立的交换庭(switchyard)项目。
本书包含10章内容,循序渐进地介绍了ROS相关的知识,包括ROS入门、结构与概念、可视化和调试工具、传感器和执行器、建模与仿真、移动机器人、机械臂、微型飞行器、ROS工业软件包等。
本书适合机器人领域的工程师及研究人员阅读,书中涉及许多实用的案例和解决方案,同时涵盖了未来机器人应用开发中可预见的研究问题。
库马尔•比平(Kumar Bipin)拥有在意法半导体和摩托罗拉等全球知名消费电子公司15年以上的研发经验。他曾参加超级计算教育研究中心(SERC)和印度科技学院(IISc,位于班加罗尔)的研究奖学金项目,并在信息技术国际学院(位于海德拉巴)获得机器人学和计算机视觉的硕士学位。他一直致力于为消费类电子产品提供系统级的解决方案。这些解决方案包括系统软件、自动驾驶汽车的感知规划和控制。目前,他在Tata Elxsi领导自主汽车产品(Autonomai)的开发。
首先,我要感谢我的妻子乌杰瓦拉(Ujjwala)博士,她在我的职业生涯中以及我写这本书的时候一直陪伴在我身边。我要感谢Packt团队的支持,特别要感谢编辑阿姆里塔(Amrita),最后,还要感谢塔塔•艾尔克斯(Tata Elxsi),他为本书中的一些项目提供了支持。
Jonathan Cacace于1987年12月13日出生于意大利那不勒斯。他在那不勒斯大学获得了自动化工程博士学位,还参与了多个专注于工业和服务机器人的研究项目,其中他开发了多个基于机器人感知和控制的ROS应用程序。他也是由Packt出版的Mastering ROS for Robotics Programming(第2版)的作者。
ROS是一个用于实现机器人编程和开发复杂机器人应用程序的开源软件框架。尽管研究团体在开发具有ROS的应用程序方面非常活跃,并且不断增加其功能,但是相关的参考资料和文档的数量仍然不足以满足开发者的需求。因此,本书的目的是提供关于ROS的全面和最新的信息。而ROS目前已经被公认为机器人应用的主要开发框架。
本书的前几章面向初学者,主要介绍了ROS的基本原理和基础。之后开始研究一些高级的概念,首先介绍了 Gazebo/RotorS 的基本概念,其中包括移动机器人、机器臂和微型飞行器,这也正是机器人应用最主要的3个分支。本书还介绍了移动机器人和微型飞行器所使用的自主导航框架(包括ORB-SLAM和PTAM),以及机械臂机器人的运动规划和抓取程序。
最后,本书讨论了ROS-Industrial(ROS-I)。这是一个将ROS软件的高级功能扩展到制造业的开源项目。
对于那些希望了解更多关于ROS的功能和特性的ROS用户和开发人员,我相信这本书将是一本优秀的指南。
本书的目标读者是来自学术界或工业界的工程师们。本书介绍了一系列在实际工作中会遇到的问题、解决方案以及未来机器人应用开发中的研究问题。读者最好具备GNU/Linux、C++和Python编程与GNU/Linux环境的基本知识,以便能够轻松地理解本书的内容。
第1章“ROS入门”介绍了如何在各种不同的平台(例如桌面系统、虚拟机、Linux容器和基于ARM的嵌入式开发板)上安装ROS。
第2章“ROS的体系结构与概念Ⅰ”介绍了ROS的核心概念以及如何使用ROS框架。
第3章“ROS的体系结构与概念Ⅱ”介绍了ROS的高级概念,如参数服务、actionlib、pluginlib、nodelet、坐标变换(TF)等。
第4章“ROS可视化与调试工具”讨论了ROS中可用的各种调试和可视化工具,如gdb、valgrind、rviz、rqt和rosbag。
第5章“在ROS中使用传感器和执行器”讨论了传感器和执行器等硬件组件与ROS的接口,还涉及使用I/O扩展板(如Arduino和Raspberry Pi)的接口传感器。
第6章“ROS建模与仿真”介绍了物理机器人的建模和基于Gazebo的虚拟环境仿真,还讨论了移动机器人和机械臂的建模问题。
第7章“ROS中的移动机器人”讨论了ROS最强大的功能——导航功能包集,它使移动机器人能够自主移动。
第8章“ROS中的机械臂”讲解了如何为机械臂机器人创建和配置MoveIt功能包,并执行运动规划和抓取操作。
第9章“基于ROS的微型飞行器”介绍了微型飞行器(MAV)的仿真框架(RotorS)。我们在这个框架中对MAV进行了研究和开发,还涉及自主导航框架以及ORB SLAM和PTAM。
第10章“ROS-Industrial(ROS-I)”讨论了ROS工业软件包,该软件包提供了一个与工业机械臂机器人连接和控制的解决方案。我们使用一些强大的工具,如MoveIt、Gazebo和RViz。本章还讨论了ROS工业软件包未来在硬件支持、功能和应用方面的发展趋势。
读者只需要一台可运行Ubuntu 16.04/18.04的计算机就能够处理本书中的几乎所有示例,不需要任何额外的硬件要求。不过在涉及使用外部传感器、执行器和I/O扩展板的例子时,需要额外的硬件组件。
另一种方案,读者可以使用安装在虚拟机上的Ubuntu 16.04/18.04,例如安装在Windows系统上的virtualbox或VMware,但是这需要更强的计算能力。
本书中讨论的机器人应用需要商业硬件,如I/O扩展板(Arduino、Odroid和Raspberry Pi)、视觉传感器(Kinect和Camera)和执行器(伺服电机和操纵杆)。
最重要的是,建议读者通过本书提供的源代码来学习,以便熟悉技术概念。
![]()
这个图标表示警告或需要特别注意的内容。
![]()
这个图标表示提示或者技巧。
本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。
本书提供配套资源,请在异步社区本书页面中单击,跳转到下载界面,按提示进行操作即可。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。
作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“提交勘误”,输入勘误信息,单击“提交”按钮即可。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。
我们的联系邮箱是contact@epubit.com.cn。
如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www.epubit.com/selfpublish/submission即可)。
如果您是学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。
“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。
“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。
异步社区
微信服务号
在这一章中,我们将会就以下主题展开讨论:
机器人操作系统(ROS)是一个用于实现机器人编程和开发复杂机器人应用程序的开源软件框架。表面上看,ROS虽然可以完成操作系统的很多功能,但是它仍然需要安装在例如Linux之类的操作系统中,所以也经常被称为元操作系统(meta-operating system)或者中间件软件框架。
此外,ROS和所有的操作系统一样,它提供了一个用于构建机器人应用程序的硬件抽象层。有了它的存在,开发者就无须考虑底层硬件的差异。ROS的核心是一个可以同步或者异步传递消息的中间件框架,即使是不同机器上的进程和线程,也可以通过它进行交流和传输数据。ROS软件的组织形式是功能包(package),这种形式提供了良好的模块性和复用性。这两个特性保证了一个程序可以无须改动或者只需进行微小的修改就可以应用到其他机器人应用软件中。
ROS得到了机器人科学界包括从该领域的研究人员到商业机构的专业开发人员的广泛认可和应用。ROS起源于2007年的Switchyard项目,它是当时的斯坦福人工智能实验室为了支持STAIR(斯坦福大学人工智能机器人项目)而建立的。
从2008年开始,Willow Garage公司一直在持续发展Switchyard。不过现在这个项目已经转由开源机器人基金会(OSRF)维护了。
现在将开始学习本书的入门章节,我们在其中将学习到在各种平台上安装ROS的方法。
我们假设你现在使用的是一台安装Ubuntu 16.04 或者Ubuntu 18.04 LTS系统的设备,它配置了Intel Core i5 @3.2 GHz的处理器,8GB的内存或者性能相同的硬件。因此我们必须掌握Linux以及命令行工具的基本知识。如果你需要学习或者更新这些知识的话,可以到互联网上查找相关的学习资源,也可以查阅一些关于这些内容的书籍。
在本节中,我们将研究ROS发行版以及其对应支持的操作系统,这些内容将帮助我们根据需求选择正确的组合。
ROS发行版就是一套ROS功能包集合,它与Linux发行版十分相似。ROS发行版的目的是让开发人员在开始下一步工作之前可以针对相对稳定的代码库进行工作。每个发行版会维护一组稳定的核心功能包,直到该发行版的生命周期结束。
目前最新的推荐ROS发行版是Kinectic Kame,它将一直被支持到2021年5月。而最新的ROS发行版为Melodic Morenia,于2018年5月23日发布,将被支持到2023年5月。不过这个最新的ROS版本存在一个问题:它不支持目前大部分的功能包文件。而这些包还需要一些时间才能完成从之前版本到最新版本的移植,所以我们并不推荐使用这个版本。在ROS网站上可以找到发行版列表(见图1-1)。
图1-1 发行版列表
ROS在设计上与Ubuntu系统是完全兼容的,而且按照计划,ROS发行版是与Ubuntu的发行版对应的。此外,Ubuntu ARM、Gentoo、macOS X、Arch Linux和OpenEmbedded也都实现了对ROS的部分支持。表1-1给出了ROS的各种发行版以及它们支持的操作系统。
表1-1
ROS发行版 |
支持的操作系统 |
实验用的操作系统 |
---|---|---|
Melodic Morenia |
Ubuntu 18.04(LTS); |
OS X(Homebrew)、Gentoo、Ubuntu ARM和 |
Kinetic Kame |
Ubuntu 16.04(LTS)和15.10;Debian 8 |
OS X(Homebrew)、Gentoo、Ubuntu ARM和 |
Jade Turtle |
Ubuntu 15.04、14.10和14.04;Debian 8 |
OS X(Homebrew)、Gentoo、Arch Linux、 |
Indigo Igloo (LTS) |
Ubuntu 14.04(LTS)和13.10;Debian 7 |
OS X(Homebrew)、Gentoo、Arch Linux、 |
正如在1.2.1节讨论过的,这里有多个ROS发行版可供下载和安装。我建议使用其中有LTS标识的版本,这表示它是最稳定的,同时也是得到了最大支持的版本。
如果你需要使用ROS的最新特性,则可以选择使用最新版本。不过你可能无法立刻使用完整的功能包文件,因为它们从前一个发行版迁移到这个版本需要一定时间。
在本书中我们将会使用两个LTS发行版—— ROS Kinetic 和ROS Melodic来完成所有实验。图1-2给出了这两个ROS的选择界面。
我们可以在ROS网站获得每个发行版的完整安装说明。在这个网站的导航栏中依次单击Getting Started|Install,打开的新页面中将显示最新ROS发行版的图形列表。
图1-2 两个ROS的选择界面
在下面的内容中我们将会介绍如何安装最新的ROS发行版。
配置Ubuntu的软件库时,我们首先要在Ubuntu的查找工具栏中找到Software & Updates,然后在Ubuntu Software中的main、universe、restricted和multiverse选项前进行勾选,如图1-3所示。
图1-3 软件与更新(Software & Updates)选项卡
接下来我们需要设置桌面系统接受来自packages.ros的软件,ROS软件库服务器的信息必须要添加到/etc/apt/source.list中:
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release - sc) main" > /etc/apt/sources.list.d/ros-latest.list'
在向Ubuntu软件库管理器中添加一个新的软件库的时候,我们必须通过添加密钥的方式来使操作系统信任来自它的包。为了确保能够从授权的服务器进行下载,在开始安装之前,我们应该向Ubuntu中添加如下的密钥:
$ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv- key 421C365BD9FF1F717815A3895523BAEEB01FA116
现在,我们开始在Ubuntu上安装ROS Kinetic功能包。第一步是使用以下命令来更新功能包列表:
$ sudo apt-get update
在ROS中有许多不同的库和工具,这里提供了4种不同的配置方式。
(1)桌面完整版(Desktop-Full)安装(推荐):
$ sudo apt-get install ros-kinetic-desktop-full
(2)桌面版(Desktop)安装:
$ sudo apt-get install ros-kinetic-desktop
(3)基础版(ROS-Base)安装:
$ sudo apt-get install ros-kinetic-ros-base
(4)独立ROS功能软件包(Individual Package)安装:
$ sudo apt-get install ros-kinetic-PACKAGE
现在,我们开始在Ubuntu 18.04上安装ROS Melodic功能包。第一步是使用以下命令来更新包列表:
$ sudo apt-get update
在ROS中有许多不同的库和工具,这里同样也提供了4种不同的默认配置。
(1)桌面完整版(Desktop-Full)安装(推荐):
$ sudo apt-get install ros-melodic-desktop-full
(2)桌面版(Desktop)安装:
$ sudo apt-get install ros-melodic-desktop
(3)基础版(ROS-Base)安装:
$ sudo apt-get install ros-melodic-ros-base
(4)独立ROS功能软件包(Individual Package)安装:
$ sudo apt-get install ros-melodic-PACKAGE
在使用ROS之前,你需要执行rosdep的初始化操作。这样在进行编译的时候,它会帮助你轻松地安装好系统依赖项和在ROS中运行所需的核心组件。
$ sudo rosdep init
$ rosdep update
配置环境
干得不错!我们已经完成了ROS的安装。现在大部分的ROS脚本和可执行文件都安装在目录/opt/ros/<ros_version>中。
我们需要将ROS环境变量添加到bash会话中才能访问这些脚本和可执行文件。下面给出了使用source命令为ROS Kinetic添加bash文件的命令。
$ source /opt/ros/kinetic/setup.bash
如果使用ROS Melodic,则需要进行如下设置:
$ source /opt/ros/melodic/setup.bash
如果每次在启动新的shell时,ROS环境变量都可以自动添加到bash会话,这对于我们来说会很方便。
对于ROS Kinetic来说,需要进行如下配置:
$ echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
$ source ~/.bashrc
而如果是ROS Melodic,则需要使用如下配置:
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
如果我们不止安装了一个ROS发行版,那么需要使用source命令来将当前使用版本的setup.bash添加到~/.bashrc中。
$ source /opt/ros/<ros_version>/setup.bash
rosinstall是ROS中常用的一个命令行工具,它能够帮助我们轻松地使用单个命令从多个源下载ROS包。
这个工具是基于Python的,我们可以使用下面命令来安装它:
$ sudo apt-get install python-rosinstall
ROS包是由ROS Build Farm构建而成的。
好了,恭喜你已经完成了ROS的安装。接下来执行下面的命令来检查安装是否正确。
打开一个新的命令行(shell)窗口运行roscore:
$ roscore
然后在另一个命令行(shell)窗口中打开一个turtlesim节点:
$ rosrun turtlesim turtlesim_node
如果一切正常的话,我们就会看到如图1-4所示的界面。
图1-4 ROS执行演示
正如我们所了解的那样,只有在Ubuntu和Debian发行版上才能使用ROS的全部功能。如果我们是Windows或macOS X用户,而且还不想将计算机的操作系统更改为Ubuntu,那么此时就可以使用诸如VMware或VirtualBox之类的工具来帮助我们在计算机上虚拟出新的操作系统。
VMware Workstation Pro可以在单个的PC设备上虚拟出多个操作系统。它本身是一款商业软件,不过也提供了免费的产品试用以及演示。
另外,你也可以选择使用VirtualBox,这是针对 x86架构计算机上的免费开源程序,它支持多种操作系统,例如Linux、macOS、Windows、Solaris和OpenSolaris。
![]()
你可以在VMware和VirtualBox的官方网站获得它们的详细信息,也可以在互联网上搜索相关教程。
当启动了虚拟机而且进行了正确的配置之后,我们就可以看到如图 1-5所示的虚拟机系统界面了。
图1-5 虚拟机系统界面
在虚拟机安装ROS与在真实设备上没有什么区别。因此我们可以按照前面讲述的方法来轻松地完成ROS Kinetic的安装。在虚拟机中我们可以运行大多数示例和功能包集(stacks)。有点麻烦的是,ROS在通过虚拟机和外部硬件进行工作和连接时可能会遇到一些问题。另外,在虚拟机中运行ROS还会出现性能下降的情况。我们将在第4章中讲解的示例代码很有可能无法执行。
图1-6显示了一个ROS在虚拟机中的安装和运行状况。
图1-6 在虚拟机中运行的ROS
随着虚拟化技术的快速发展,各种类型的容器技术开始崭露头角。目前,其中的Docker和LXC技术占据了Linux操作系统虚拟机市场的最大份额。
LXC(Linux Containers)是一种可以在单个主机上创建和运行多个隔离Linux虚拟环境(VE)的操作系统级虚拟技术。这些隔离级别(level)或者Container可以用来实现特定应用程序的沙箱或者模拟出全新的主机。LXC使用了Linux 2.6.24版本中引入的控制组(cgroup)功能,它允许主机CPU可以更好地将内存分配给称为工作区(namespace)的隔离级别。
Docker之前一直被称作dotCloud,它最开始只是作为一个业余项目开发出来的,在2013年开始对外开源。实际上它是LXC功能的扩展。这是通过使用一个高等级的API实现的,它提供了一个可以独立运行进程的轻量级虚拟化解决方案。Docker是使用Go语言开发出来的,它利用了LXC、cgroup和Linux 内核的功能。由于Docker Container是基于LXC实现的,所以它并不包括单独的操作系统。相反它要依赖操作系统自身的功能(例如底层设备提供的功能)。因此Docker是一个可以移植的容器引擎,你可以将虚拟容器中的应用程序及其依赖项打包复制到其他Linux服务器上运行。
![]()
注意,Linux VE与虚拟机(VM)并不相同。
由于Docker是一个有助于应用程序和完整系统分发的开放平台,并且它基于LXC,所以我们将研究如何使用ROS Docker镜像,以及如何将复杂的应用程序与完整的系统集成为一个独立的镜像进行分发。
在安装Docker之前,我们需要下载更新的包文件:
$ sudo apt-get update
使用下面的命令向系统添加官方DOCK软件库的GPG密钥:
$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 –recv -keys 58118E89F3A912897C070ADBF76221572C52609D
对于Ubuntu 16.04,需要执行以下命令:
$ echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" | sudo
tee /etc/apt/sources.list.d/docker.list
对于Ubuntu 18.04,需要执行以下命令:
$ echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" | sudo
tee /etc/apt/sources.list.d/docker.list
使用新添加软件库中的Docker包来更新功能包数据库,使用的命令如下所示:
$ sudo apt-get update
接下来确保我们是从Docker软件库,而不是从默认的Ubuntu软件库完成下载:
$ apt-cache policy docker-engine
注意此时如果还没有安装docker-engine,可以使用下面的命令来安装它:
$ sudo apt-get install -y docker-engine
检查Docker是否启动:
$ sudo systemctl status docker
使用以下命令来启动Docker服务:
$ sudo service docker start
$ docker
我们可以使用docker命令的search子命令在Docker Hub中查找可用的镜像。
$ sudo docker search Ubuntu
最后使用下面的命令来运行Docker container:
$ sudo docker run -it hello-world
Docker镜像是类似于虚拟机中设置完毕的操作系统的快照文件。有些服务器中提供了镜像,用户只需要执行下载操作即可。主服务器是Docker Hub,从这里你可以找到不同类型系统和经过各种配置的Docker镜像。
好了!在官方的ROS软件库中列出了所有的ROS Docker镜像。我们将使用ROS Kinetic镜像,下面给出了获取它的命令:
$ sudo docker pull ros
$ sudo docker pull kinetic-ros-core
$ sudo docker pull kinetic-ros-base
$ sudo docker pull kinetic-robot
$ sudo docker pull kinetic-perception
我们使用相同的方法也可以获取ROS Melodic镜像,下面给出了获取它的命令:
$ sudo docker pull ros
$ sudo docker pull melodic-ros-core
$ sudo docker pull melodic-ros-base
$ sudo docker pull melodic-robot
$ sudo docker pull melodic-perception
成功下载容器之后,我们可以使用下面的命令来运行它:
$ docker run -it ros
这就像进入到Docker container的会话中一样。前面的命令将从主镜像中创建新的container,这个主镜像中已经安装好了完整的Ubuntu操作系统和ROS Kinetic。这样我们就能像使用常规系统一样,安装额外的包和运行ROS节点。
下面的命令可以列出所有可用的Docker containers以及它们镜像的源:
$ sudo docker ps
恭喜你现在已经完成了Docker的安装。为了在Container中建立ROS环境以便开始使用ROS,我们必须运行以下命令(ros_version: kinetic/melodic):
$ source /opt/ros/<ros_version>/setup.bash
虽然运行docker应该已经足够了,但是我们可以使用SSH通过名称或者ID来远程控制一个运行的Docker containers,就像控制一个普通设备一样。
$ sudo docker attach 665b4a1e17b6 #by ID ...OR
$ sudo docker attach loving_heisenberg #by Name
如果使用attach命令的话,那么我们只能使用shell的一个实例。但是如果我们想在containers中打开新的命令行(shell),并且可以启动新的进程,就需要运行以下的几条命令:
$ sudo docker exec -i -t 665b4a1e17b6 /bin/bash #by ID ...OR
$ sudo docker exec -i -t loving_heisenberg /bin/bash #by Name
我们在另外的一个命令行(shell)中使用docker stop也可以结束Docker containers,而且它们也可以使用docker rm命令来删除。
本书附带了一个可以正常工作的Docker镜像,它基于ROS Kinetic建立并包含了所有的实例代码。在GitHub软件库可以找到下载和安装它的说明文件,在那里还可以找到其他的代码。
从事商业机器人产品研发的行业对运行在嵌入式平台(主要是ARM平台)上的ROS有很高的要求。现在维护开源ROS的OSRF已经宣布对ARM平台的正式支持。
目前主要有两个支持ARM平台上运行的ROS操作系统系列:
其中Ubuntu ARM最受研究人员的欢迎,因为它易于安装,而且已经得到了很多ARM板的支持。在图1-7中列出了其中的一部分ARM板。此外,许多ROS包已经得到了Ubuntu ARM的支持或者可以通过最小的修改就可以移植到Ubuntu ARM。
图1-7 Ubuntu ARM支持的平台
而OpenEmbedded则主要被专业人员用来开发商业产品。表1-2中给出了两者的比较。
表1-2
Ubuntu ARM |
OpenEmbedded |
---|---|
二进制ROS包 |
用于基于caktin的ROS包的交叉编译工具链 |
可以编译为通用ARM体系架构 |
从源编译所有的包 |
使用常用的Ubuntu工具(dpkg、APT等)进行安装 |
支持多个架构:ARM、MIPS、PowerPC等 |
安装简便、快捷 |
易于适应新的机器和结构 |
无须编译源的基本ROS包 |
允许对基本ROS包进行更改 |
标准Ubuntu风格 |
小型Linux内核和镜像 |
在开发板上进行额外编译 |
需要一个强大的系统设置来保证构建机器和工具链运行 |
虽然有多种选择,我们还是决定在Ubuntu ARM上安装ROS,因为这个系列的发行版更为普遍,而且也可以在多种基于ARM的平台上运行,例如UDOO、ODROID-U3、ODROID-X2和Gumstix Overo。我们建议你在平台上使用Ubuntu ARM 16.04 Xenial armhf操作系统与ROS一起工作。
当我们在向指定的ARM平台上安装ROS之前,必须先满足一些先决条件。由于本书的重点是ROS,因此我们只会列出这些内容,并不会给出详细的讲解。不过对于特定的ARM平台来说,你可以通过它们的网站、论坛或者相关的书籍来查阅有关Ubuntu ARM的信息。
当我们选定的平台上已经安装完Ubuntu ARM后,就需要安装网卡,并通过配置网络设置(例如IP、DNS和网关)来提供访问网络的功能。
一个适用于大多数ARM平台的Ubuntu镜像可以安装到一个大小为1GB~4GB的MicroSD卡中。不过它的容量并不能承载ROS Kinetic的大部分功能包。为了解决这个问题,我们可以使用更大内存的SD卡,并通过重新分区将文件系统扩展到所有空间。
这里可以使用GParted软件。它是一个开源的图形工具,可以用来完成磁盘分区及其文件系统的创建、删除、调整大小、移动、检查和复制操作,如图1-8所示。
图1-8 GParted(一个分区工具)
好了,我们现在已经做好了安装ROS的准备。此后的安装过程与前面讲过的桌面系统下的安装过程非常类似。两者最大的区别在于在Ubuntu ARM平台下不能进行桌面完整版(Desktop-Full)安装。我们可以按照需要来自定义安装所需要的功能包,不过,这一点对于使用源代码来构建和安装ROS软件库中没有的包是十分方便的。
配置软件库的步骤如下所示。
第一步要配置Ubuntu软件库允许“restricted”“universe”和“multiverse”:
$ sudo vi /etc/apt/sources.list
我们对Ubuntu 16.04进行如下操作:
deb http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted universe multiverse
#deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted
universe multiverse deb http://ports.ubuntu.com/ubuntu-ports/ xenial-
updates main restricted universe multiverse
#deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main
restricted universe multiverse
#Kernel source (repos.rcn-ee.com) :
https://github.com/RobertCNelson/linux-stable-rcn-ee
#
#git clone https://github.com/RobertCNelson/linux-stable-rcn-ee
#cd ./linux-stable-rcn-ee #git checkout 'uname -r' -b tmp
# deb [arch=armhf] http://repos.rcn-ee.com/ubuntu/ xenial main
#deb-src [arch=armhf] http://repos.rcn-ee.com/ubuntu/ xenial main
同样,我们对Ubuntu 18.04进行如下操作:
deb http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted universe
multiverse
#deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted
universe multiverse deb http://ports.ubuntu.com/ubuntu-ports/ bionic-
updates main restricted universe multiverse
#deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main
restricted universe multiverse
#Kernel source (repos.rcn-ee.com) :
https://github.com/RobertCNelson/linux-stable-rcn-ee
#
#git clone https://github.com/RobertCNelson/linux-stable-rcn-ee
#cd ./linux-stable-rcn-ee
#git checkout 'uname -r' -b tmp
# deb [arch=armhf] http://repos.rcn-ee.com/ubuntu/ bionic main
#deb-src [arch=armhf] http://repos.rcn-ee.com/ubuntu/ bionic main
第二步使用如下操作更新源:
$ sudo apt-get update
ROS中的一些工具(例如Boost),需要调整系统区域设置。这个设置的命令如下所示:
$ sudo update-locale LANG=C LANGUAGE=C LC_ALL=C LC_MESSAGES=POSIX
接下来我们将要根据ARM平台上所安装的Ubuntu版本配置源列表。下面给出了安装Ubuntu armhf软件库的命令:
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release - cs) main" > /etc/apt/sources.list.d/ros-latest.list'
正如前文提到的那样,我们执行这个步骤的目的是确保代码的来源是准确的,而且没有人在代码所有者不知情的情况下对代码或者程序进行过修改。
$ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net --recv-key 0xB01FA116
在安装ROS包之前,需要确保所使用的Debian包索引是最新的。
$ sudo apt-get update
在ROS中包含很多不能完全与ARM相匹配的库和工具,因此我们不能进行桌面完整版(Desktop-Full)的安装。这里只能对所需的ROS包进行单独的安装。
我们可以安装ros-base(准系统),它包含了ROS包、构建和通信库,但是不包含图形化操作工具(当允许操作时使用ENTER(Y))。
$ sudo apt-get install ros-<ros_version>-ros-base
另外,我们也可以尝试去安装桌面系统,它包括ROS、rqt、RViz和机器人通用库。
$ sudo apt-get install ros-<ros_version>-desktop
我们可以使用如下命令来安装一个指定的ROS包:
$ sudo apt-get install ros-<ros_version>-PACKAGE
使用以下命令查找可用的包:
$ apt-cache search ros-<ros_version>
在我们使用ROS之前,必须要安装和初始化命令行工具rosdep。rosdep可以在你需要编译某些源码的时候为其安装一些系统依赖,同时也是某些ROS核心功能组件所必须用到的工具。
$ sudo apt-get install python-rosdep
$ sudo rosdep init
$ rosdep update
现在我们已经完成了在ARM平台上安装ROS的操作。大部分的ROS脚本和可执行文件都安装在/opt/ros/<ros_version>中。
如果要访问这些脚本和可执行文件,需要将ROS环境变量添加到bash会话中。我们需要使用source命令来指定下面的bash文件:
$ source /opt/ros/<ros_version>/setup.bash
如果每次启动新的shell时,ROS环境变量都会自动添加到BASH会话中,这是十分方便的:
$ echo "source /opt/ros/<ros_version>/setup.bash" >> ~/.bashrc
$ source ~/.bashrc
如果你安装有多个ROS版本,需要使用 source命令来指定你当前使用版本所对应的 setup.bash。
$ source /opt/ros/<ros_version>/setup.bash
rosinstall 是ROS中一个独立的常用命令行工具,有了它,只要用一条命令,你就可以很容易为指定功能包下载完整的源码树。
该工具是基于Python的,你可以使用以下命令来安装它:
$ sudo apt-get install python-rosinstall
下面给出一个基本的例子。首先我们在命令行(shell)上运行ROS核心:
$ roscore
然后在另一个命令行(shell)中,发布一条Pose信息:
$ rostopic pub /dummy geometry_msgs/Pose Position: x: 3.0 y: 1.0 z: 2.0 Orientation: x: 0.0 y: 0.0 z: 0.0 w: 1.0 -r 8
接下来,在桌面系统(位于同一网络中)设置ROS_MASTER_URI指向我们的ARM平台(IP为192.168.X.X)。
在笔记本计算机中添加以下内容:
$ export ROS_MASTER_URI=http://192.168.1.6:11311
我们将会看到从ARM平台向笔记本计算机发布的pose。
最后向笔记本计算机中添加以下内容:
$ rostopic echo -n2 /dummy Position: x: 1.0 y: 2.0 z: 3.0 Orientation: x:0.0 y: 0.0 z: 0.0 w: 1.0 ---