ROS系统架构

ROS系统的架构主要被设计和划分为三部分,每一部分代表一个层级的概念:

文件系统级(The filesystem level)

计算图级(The computation graph level)

开源社区级(The community level)

 

  1. 理解ROS文件系统级

与其他操作系统类似,一个ROS程序的不同组件要被放在不同的文件夹下。这些文件夹是根据功能的不同来对文件进行组织的:

  • 功能包Package):功能包是ROS中软件组织的基本形式。一个功能包具有用于创建ROS程序的最小结构和最少内容。它可以包含ROS运行的进程(节点)、配置文件等;
  • 功能包清单Package Manifest):功能包清单提供关于功能包、许可信息、依赖关系、编译标志等的信息。一个包的清单有一个名为package.xml的文件管理;
  • 综合功能包Metapackage/Stack):将几个具有某些功能的功能包组织在一起,就获得了一个综合功能包(Stack)
  • 功能包清单(Stack manifest stack.xml 提供一个关于功能包集的清单,包括开源代码的许可证信息,与其他功能包集的依赖关系。
  • 消息类型Messagemsg type):消息是一个节点发送到其他节点的信息。ROS系统有很多的标准消息类型。消息类型的说明存储在对应功能包的msg文件夹下。
  • 服务类型Servicsrc type):服务描述说明存储在对应功能包的src文件夹下,定义了在ROS中由每个进程提供的关于服务请求和响应的数据结构。

 

1.1 工作空间

工作空间就是一个包含功能包、可编辑源文件或编译包的文件夹。当想同时编译不同的功能包时非常有用,并且可以用来保存本地开发包,一般包含srcbuliddevel这三个文件夹。

  • 源文件空间src文件夹):在源文件空间放置了功能包、项目、克隆包等。在这个空间中最重要的是CMakefile.txt。当你在工作空间中配置功能包时,src文件夹CMakefile.txt调用CMake
  • 编译空间build文件夹):在build文件夹里,CMakecatkin为功能包和项目保存缓存信息、配置和其他中间文件。
  • 开发空间devel文件夹):devel文件夹用来保存编译后的程序,这些是无需安装就能用来测试的程序。

 

1.2 功能包

功能包指的是一种特定的文件结构和文件夹组合。这种结果如下所示:

  • include/package_name/:此目录包含了你需要的库的头文件。
  • msg/:如果你要开发非标准消息,请把文件放在这里。
  • script/:其中包括BashPytho或其他任何脚本的可执行脚本文件。
  • src/:这是存储程序源文件的地方。你可能会为节点在此创建一个文件夹。
  • CMakefile.txt:这是CMake的生成文件。
  • package.xml:这是功能包清单文件。


功能包的目录结构图如下图所示:

 

CMakeLists.txt 文件的内容结构图如下图所示:

 

package.xml 文件的内容结构图如下图所示:

 

功能包还能配置launch文件,launch文件编写规则如下图所示:

 

为了创建、修改或使用功能包,ROS给我们提供了一些工具:

  • rospack find [package_name] 使用此命令可以返回功能包的路径信息
  • catkin_create_pkg 用于创建一个新的功能包
  • catkin_make 用于编译工作空间
  • rosdep 此命令安装功能包的系统依赖项
  • rqt_dep 用来查看功能包的依赖关系图


若要在文件夹和功能包之间移动文件,ROS提供了非常有用的rosbash功能包,其中包含了一些非常类似于LInux命令的命令,例如:

  • roscd 此命令用来更改目录
  • rosed 此命令用来编辑文件
  • roscp 此命令用于从一些功能包复制文件
  • rosd 此命令列出功能包的目录
  • rosls 此命令列出功能包下的文件
  •  

1.3 综合功能包

综合功能包是一些只有一个package.xml文件的特定包,它不包含其他文件,如代码等。综合功能包用于引用其他功能特性类似的功能包,例如导航包、ros_tutorials等。

如果你想定位 ros_tutorials 综合功能包,可以使用下面的命令:

rosstack find ros_tutorials

显示路径为: /opt/ros/indigo/share/ros_tutorials

 

1.4 消息

ROS使用了一种简化的消息类型描述语言来描述ROS节点发布的数据值。通过这样的描述语言,ROS能够使用多种编程语言生成不同类型消息的源代码。

ROS提供了很多预定义消息类型。如果你创建了一种新的消息类型,那么就要把消息的类型定义放到功能包的msg文件夹下。在该文件夹中,有用于定义各种消息的文件。这些文件都以.msg为扩展名。

消息类型必须具有两个主要部分:字段和常量。字段定义了要在消息中传输的数据类型,例如int32string或之前创建的新类型。常量用于定义字段的名称。

ROS中有一些处理消息的工具。例如 rosmsg 命令行工具能够输出消息定义信息,并可以找到使用该消息类型的源文件。

 

1.5 服务

ROS使用了一种简化的服务描述语言来描述ROS的服务类型。这直接借鉴了ROS msg消息的数据格式,以实现节点之间的请求/响应通信。服务的描述存储在功能包的 srv/ 子目录下 .srv 文件中。

若要调用服务,你需要使用该功能包的名称及服务名称。例如 sample_package/srv/sample.srv 文件,可以把它称为 sample_package1/sample1 服务。

ROS中有一些执行服务的工具。rossrv 工具能输出服务说明、.srv 文件所在的功能包名称,并可以找到使用某一服务类型的源代码文件。

如果你想要在ROS中创建一个服务,可以使用服务生成器。这些工具能够从基本的服务说明中生成代码。你只需要在 CMakefile.txt 文件中加一行 gensrv() 命令。

 

 

  1. 理解ROS计算图级

ROS会创建一个连接到所有进程的网络。在系统中的任何节点都可以访问此网络,并通过该网络与其他节点交互,获取其他节点发布的信息,并且将自身数据发布到网络上。如下图所示:

在这一层级中最基本的概念包括节点、节点管理器、参数服务器、消息、服务、主题和消息记录,这些概念都以不同的方式向计算图级提供数据:

  • 节点Node 节点是主要的计算执行进程。最好让每一个节点都具有特定的单一的功能,而不是创建一个包罗万象的大节点。节点需要使用如 roscpp rospy ROS客户端进行编写。其中roscpp使用C++实现ROS的各种功能。它提供了一个客户端库。程序员能够调用这些接口快速完成与ROS的主题,服务和参数相关的开发工作。
  • 节点管理器Master 节点管理器向ROS系统中其他节点提供命名和注册服务。它像服务一样追踪主题的发布者和订阅者。节点管理器的作用是使节点之间能够互相查找。一旦这些节点找到了彼此,就能建立点对点的通信。
  • 参数服务器Parameter Server 参数服务器是可通过网络访问的共享的多变量字典。节点使用此服务器来存储和检索运行时的参数。
  • 消息Message 节点通过消息完成彼此的沟通。消息包括一个节点发生到其他节点的信息数据。ROS中包括很多种标准类型的消息,同时你也可以基于标准消息开发自定义类型的消息。
  • 主题Topic 每个消息都必须有一个名称来被ROS网络路由。每一条消息都要发布到相应的主题。当一个节点发送数据时,我们就说该节点正在向主题发布消息。节点可以通过订阅某个主题,接受来自其他节点的消息。主题的名称必须是独一无二的,否则在同名主题之间的消息路由就会发生错误。
  • 服务Service 当你需要直接与节点通信并获得应答时,将无法通过主题实现,从而需要服务。此外,服务必须有唯一的名称。当一个节点提供某个服务时,所有的节点都可以通过使用ROS客户端编写的代码与它通信。
  • 消息记录包Bag 消息记录包是一种用于保存和回收ROS消息数据的文件格式(.bag)。它能够获取并记录各种难以收集的传感器数据。我们可以通过消息记录包反复获取实验数据,进行必要的开发和算法测试。在使用复杂机器人进行实验工作时,需要经常使用消息记录包。

 

2.1 节点(Node)

节点都是各自独立的可执行文件,能够通过主题,服务或参数服务器与其他进程(节点)通信。ROS通过使用节点将代码和功能解耦,提高了系统容错能力和可维护性,使系统简化。同时,节点允许了ROS系统能够布置在任意多个机器上并同时运行。节点在系统中必须有唯一的名称。节点可以使用不同的库编写,如roscpprospyroscpp基于C++

ROS提供了处理节点的工具,如rosnode:一个用于显示节点信息的命令行工具。

2.2 主题(Topic)

一个主题可以有多个订阅者也可以有多个发布者,但是需要注意用不同的节点发布同样的主题,否则会产生冲突。

每个主题都是强类型的,发布到主题上的消息必须与主题的ROS消息类型相匹配,并且节点只能接受类型匹配的消息。节点要想订阅主题,就必须具有相同的消息类型。

ROS的主题可以使用 TCP/IP UDP 传输。基于 TCP 传输称为 TCPROS,它使用 TCP/IP 长连接。这是ROS默认的传输方式。

基于 UDP 传输称为 UDPROS,它是一种低延迟高效率的传输方式,但可能产生数据丢失。所以它适合像远程操控的任务。

 

ROS有一个 rostopic 工具用于主题操作。使用rostopic -h命令,可以查看此工具的所有支持命令:

  • rostopic echo [/topic_name] 将消息输出到屏幕
  • rostopic find message_type 按照类型查找主题
  • rostopic info [/topic_name] 输出活动主题、发布的主题、主题订阅者和服务的信息
  • rostopic list 输出活动主题的列表
  • rostopic pub [/topic_name] [type] [args] 将数据发布到主题。它允许我们直接从命令行中对任意主题创建和发布数据。
  • rostopic type [/topic_name] 输出主题的类型,或者说主题中发布的消息类型
  • rostopic hz [/topic_name] 显示主题的发布频率
  • rostopic bw [/topic_name] 显示主题所使用的带宽

 

2.3 服务(Service)

当你需要直接与节点通信并获得应答时,将无法通过主题实现,从而需要服务。服务需要由用户开发,节点并不提供标准服务。包含服务源代码的文件存储在 srv 文件夹中。

像主题一样,服务关联一个以功能包中 .srv 文件名称来命名的服务类型。与其他基于ROS文件系统的类型一样,服务类型是功能包名称和 .srv 文件名称的组合。例如 chapter2_tutorials/srv/chapter2srv1.srv 文件的服务类型是 chapter2_tutorials/chapter2srv1

 

ROS关于服务的命令行工具有两个:rossrv rosservice。我们可以通过 rossrv 看到有关服务数据结构的信息,并且与 rosmsg 具有完全一致的用法。使用rosservice -h命令,可以查看此工具的所有支持命令:

  • rosservice args [/service_name] 打印服务参数
  • rosservice call [/service_name] args 根据命令行参数调用服务
  • rosservice find [msg-type] 根据服务类型查询服务
  • rosservice info [/service_name] 输出服务信息
  • rosservice list 输出活动服务清单
  • rosservice type [/service_name] 输出服务类型
  • rosservice uri [/service_name] 输出服务的ROSRPC URI

 

2.4 消息(Message)

消息的类型在ROS中按照以下标准命名方式进行约定:功能包名称 /.msg 文件名称。例如,std_msgs/msg/String.msg 的消息类型是 std_msgs/String

 

ROS有一个 rosmsg 工具用于消息操作。使用rosmsg -h命令,可以查看此工具的所有支持命令:

  • rosmsg show 显示一条消息的字段
  • rosmsg list 列出所有消息
  • rosmsg package 列出功能包的所有消息
  • rosmsg packages 列出所有具有该消息的功能包
  • rosmsg md5 显示一条消息的MD5求和结果

2.5 消息纪录包

消息纪录包是由ROS创建的一组文件。它使用 .bag 格式保存消息、主题、服务和其他ROS数据信息。你可以在事件发生后,通过使用可视化工具调用和回放数据,检查在系统中到底发生了什么。

 

若要使用纪录包文件,我们可以使用以下ROS工具:

  • rosbag 用来录制、播放和执行其他操作
  • rqt_bag 用来可视化图形环境中的数据

 

2.6 节点管理器

节点管理器通常使用 roscore 命令运行,它会加载ROS节点管理器及其他ROS核心组件。

 

2.7 参数服务器

参数服务器使用 XMLRPC 数据类型为参数赋值,包括以下类型:

  • 32位整数(32-bit integer
  • 布尔值(Boolean
  • 字符串(String
  • 双精度浮
  • 点(Double
  • 列表(List

ROS中关于参数服务器的工具是 rosparam。使用'rosparam -h'命令,可以查看此工具的所有支持命令:

  • rosparam list 列出了服务器中的所有参数
  • rosparam get [parameter] 获取参数值
  • rosparam set [parameter] [value] 设置参数值
  • rosparam delete [parameter] 删除参数
  • rosparam dump file 将参数服务器保存到一个文件
  • rosparam load file 加载参数文件到参数服务器

 

 

 

  1. 理解ROS开源社区级

ROS开源社区级的概念主要是ROS资源,其能够通过独立的网络社区分享软件和知识。这些资源包括:

  • 发行版
  • 软件库
  • ROS维基
  • Bug提交系统
  • 邮件列表
  • ROS问答
  • 博客

 

Logo

开源、云原生的融合云平台

更多推荐