01 ROS简介
很多初学者一听到“机器人操作系统”这个词,可能就会被“操作系统”这个词吓到。其实简单来说,ROS是一个分布式通信框架,可以帮助程序进程更方便地进行通信。
一个机器人通常包含多个部件,每个部件都有自己的控制程序来实现机器人的运动和视听功能。那么如何协调机器人中的这些组件,或者协调由多个机器人组成的机器人群呢?这时候就需要让分散的组件能够相互通信。在多机器人集群中,这些分散的组件也分散在不同的机器人上。解决这个分布式通信问题就是ROS的初衷。
随着越来越多的人参与ROS开发和源码贡献,社区中涌现了大量的第三方工具和实用的开源软件包,才造就了今天的ROS。
初学者经常困惑的一件事是,学习ROS是否意味着你也知道如何开发机器人?当然不是。严格来说,ROS只是一个通信框架。机器人中的各种算法和应用仍然使用C++和Python等通用编程语言进行开发。
1. ROS的性能特点
在正式学习ROS之前,我先介绍一下ROS的几个特性,即元操作系统、分布式通信机制、松耦合的软件框架、丰富的开源函数库等,帮助大家建立一些感性的认识。
ROS是机器人领域的元操作系统。换句话说,它并不是真正意义上的操作系统。其底层任务调度、编译、设备驱动等仍由其原生操作系统Ubuntu Linux完成。
ROS实际上是一个子操作系统,或者说软件框架,运行在Ubuntu Linux上,但它提供了类似操作系统的功能,如硬件抽象、函数调用、进程管理等。它还提供了获取、编译、跨平台的功能和工具。
ROS的核心思想是将机器人的软件功能做成节点,节点之间通过发送消息进行通信。这些节点可以部署在同一台主机上,也可以部署在不同的主机上,甚至可以部署在互联网上。 ROS网络通信机制中的主节点(master)负责管理和调度网络中各个节点之间的通信过程,同时还提供配置网络中全局参数的服务。
ROS是一个松耦合的软件框架,采用分布式通信机制实现节点之间的进程通信。 ROS的软件代码采用松耦合的方式组织,开发流程灵活,易于管理和维护。
ROS拥有丰富的开源函数库。 ROS是基于BSD(伯克利软件分发)协议的开源软件,允许任何人修改、重用、重新分发以及在商业和闭源产品中使用它。使用ROS,您可以快速构建自己的机器人原型。
2.ROS发行版
与Linux发行版类似,ROS发行版内置了一系列常用的功能包,这些功能包就是将ROS系统打包安装到原生系统中。 ROS最初是基于Ubuntu系统开发的。 ROS的发布版本名称也采用与Ubuntu相同的规则,即版本名称由两个首字母相同的英文单词组成,并且版本的首字母按字母升序选取,图1-图1 显示了ROS 的一些主要版本。
图1-1 ROS主要版本
3.如何学习ROS
要学好并使用ROS,需要大量的练习。因此,在快速了解ROS的核心概念和编程范式后,需要结合大量的实际项目来深入了解ROS。学会用正确的方式解决问题可以帮助你更快地提升自己的能力。 ROS的主要学习资源包括以下几个。
官网:www.ros.org 源代码:github.com Wiki:wiki.ros.org 问答:answers.ros.org02 ROS系统架构
安装完ROS后,很多朋友应该都渴望立即开始编写程序。由于ROS的架构比较复杂,为了方便理解后面遇到的各种概念,我们先讨论一下ROS的系统架构,以便大家能够对ROS中的各种概念有一个全面的了解。根据官方的说法,ROS架构可以从计算图、文件系统和开源社区的角度来理解。
1.从计算图的角度理解ROS架构
ROS中可执行程序的基本单元称为节点。节点之间通过消息机制进行通信,从而形成网络图,也称为计算图,如图1-3所示。
图1-3 ROS计算图结构
节点是可执行程序,通常称为进程。 ROS功能包中创建的每个可执行程序在启动并加载到系统进程后就成为一个ROS节点,如图1-3中的节点1、节点2、节点3等。
节点通过发送和接收消息进行通信。消息发送和接收机制分为三种类型:主题、服务和动作。如图1-3所示,节点2和节点3、节点2和节点5采用主题通信,节点2和节点4采用服务通信,节点1和节点2采用动作通信。计算图中的节点、主题、服务和操作必须具有唯一的名称作为标识符。
ROS利用节点来解耦代码和功能,提高系统的容错性和可维护性。因此,最好让每个节点服务于特定的单一功能,而不是创建一个庞大的、包罗万象的节点。如果使用C++编写节点,则需要使用ROS提供的roscpp库;如果使用Python编写节点,则需要使用ROS提供的rospy库。
消息是计算图的关键,包括消息机制和消息类型。消息机制分为三种类型:主题、服务和操作。每种消息机制中传输的数据都有特定的数据类型(即消息类型)。消息类型可以分为主题消息类型、服务消息类型和动作消息类型。消息机制和消息类型将在1.5节中解释。
数据包(rosbag)是ROS中的一个文件,专门用于保存和回放主题中的数据。一些难以采集的传感器数据可以记录在数据包中,然后反复回放以调试算法性能。
参数服务器可以为整个ROS网络中的节点提供方便修改的参数。参数可以认为是节点中可以外部修改的全局变量,包括静态参数和动态参数。静态参数一般用于在节点启动时设置节点工作模式;动态参数可用于在节点运行时动态配置节点或改变节点工作状态,如电机控制节点中的PID控制参数。
主节点负责各个节点之间通信过程的调度和管理。因此,必须先启动master节点,可以通过roscore命令启动。
2.从文件系统角度理解ROS架构
ROS程序的不同组件应放置在不同的文件夹中。这些文件夹根据不同的功能来组织文件。这就是ROS的文件系统结构,如图1-4所示。
图1-4 ROS文件系统结构
工作空间是一个包含函数包、编译包和编译后的可执行文件的文件夹。用户可以根据自己的需求创建多个工作区,并在每个工作区中开发不同用途的功能包。在图1-4中,我们创建了一个名为catkin_ws的工作空间,其中包含三个文件夹:src、build和devel。
src文件夹中包含各个功能包以及配置该功能包的CMake配置文件CMakeLists.txt。这里解释一下,由于ROS中的源码是使用catkin工具编译的,而catkin工具是基于CMake技术的,所以我们会在src源文件空间和各个函数包中看到一个CMake配置文件CMakeLists.txt。这个文件起到了配置编译的作用。 build文件夹包含编译CMake和catkin功能包时生成的缓存、配置、中间文件等。 devel文件夹中包含编译好的可执行程序,无需安装即可直接运行。功能包源代码编译和测试完成后,这些编译后的可执行文件可以直接导出并与其他开发人员共享。函数包是ROS中软件组织的基本形式。它具有创建ROS程序的最小结构和最少内容。包含ROS节点源码、脚本、配置文件等。
CMakeLists.txt是函数包配置文件,用于编译Cmake函数包的编译配置。 package.xml是功能包清单文件。它使用XML标签格式来标记功能包的各种相关信息,例如包的名称、开发者信息、依赖项等,主要是为了使功能包的安装和分发更加容易。 include/是函数包头文件目录,可以放置函数包程序包含的*.h头文件。 include目录之所以需要添加一级路径,是为了更好的区分自定义头文件和系统标准头文件,并替换为实际功能包的名称。但是,这个文件夹不是必需的。例如,有些程序没有头文件。 msg、srv和action这三个文件夹分别用于存放非标准主题消息、服务消息和动作消息的定义文件。 ROS支持用户自定义消息通信过程中使用的消息类型。这些自定义消息不是必需的,因为程序仅使用标准消息类型。 scripts目录存放的是Bash、Python等脚本文件,不是必须的。 launch目录存放节点的启动文件。 *.launch 文件用于启动一个或多个节点。它在具有多个节点的大型项目中很有用,但不是必需的。 src目录存放的是功能包节点对应的源代码。一个功能包中可以有多个节点程序来完成不同的功能,并且每个节点程序可以独立运行。这里的src目录存放的是这些node程序的源代码。您可以根据需要创建文件夹和文件来组织源代码。源码可以用C++、Python等编写。 3.从开源社区的角度理解ROS架构
ROS 是开源软件。各个独立的在线社区共享并贡献软件和教程,形成强大的ROS开源社区,如图1-5所示。
图1-5 ROS开源社区结构
ROS的开发依赖于开源和共享软件。这些代码由不同的组织共享和发布,如GitHub源码共享、Ubuntu软件仓库发布、第三方库等。ROS的官方wiki是一个重要的文档讨论社区,在这里你可以方便地发布和修改相应的文档页。 ROS解答主页包含了大量ROS开发者的提问和解答,关于ROS开发中遇到的各种问题的讨论非常活跃。
作者简介:张虎,深圳市锐思智行科技有限公司CEO。曾就职于深圳市智能机器人研究院,主导机器人自主导航研究项目。工作期间,以“小虎哥爱学习”网名在知乎、CSDN、bilibili等平台创作了大量与机器人SLAM导航相关的优质博客文章和视频教程,深受广大网友喜爱的网友。他对强人工智能的研究非常感兴趣,致力于先进智能机器人的产业化。
本文摘自《机器人SLAM导航:核心技术与实战》,经出版社授权发布。 (书号:9787111697428)
《机器人SLAM导航:核心技术与实战》
点击上图即可了解并购买
转载请联系微信:DoctorData
**推荐:**机器人SLAM导航百科全书,真正打通软硬件,突破SLAM和导航的技术壁垒,加速算法和机器人产品落地;全面剖析传感器、ROS、SLAM和导航核心算法,深入数学原理,分析流行框架,带你一步步从头开始构建真正的机器人。