ROS 通讯框架实战

  1. Apollo与ROS,应用层与框架层
  2. ROS结构关系与实践
    1. 计算图级 Computation Graph level
      1. 节点 Node
      2. 消息 Message
      3. 主题 Topic
      4. 消息记录包 Bag
      5. 服务 Service
      6. 节点管理器 Master
      7. 参数服务器 Parameter Server
    2. 文件系统级 FileSystem level
      1. 功能包(Package)
      2. 功能包清单(Manifest)
      3. 功能包集(Stack)
      4. 功能包集清单(Stack manifest)
      5. 消息类型(Message/msg type)
      6. 服务类型(Service/srv type)
    3. 社区级 Community level
  3. 核心的几点理解
    1. 通讯
      1. 中心进程服务的通讯
      2. 节点之间的通讯
    2. 数据
  4. 如何调试
  5. 如何尝试新设备?
  6. 实战建议
  7. 参考

这是一篇关于ROS从基础到实践的整理教程,结合了Apollo部分的内容,主要还是以ROS核心为主。写于2017年末,2018初。

Apollo与ROS,应用层与框架层

ROS (Robot Operating System, 机器人操作系统)是一个适用于机器人的开源操作系统。

包括开发者,在使用Apollo的过程中也有一定的疑惑,Apollo为什么选择ROS?

正如Apollo开放软件平台中指定的模块一样,Apollo是一些应用模块的堆积,这些应用需要底层运行框架的支撑,比如ROS。Apollo开放的姿态选择ROS,自然是合乎情理之中。当然在于合作伙伴的合作中,使用的也许就是定制化的运行平台。

架构有不同粒度,根据架构目标:

系统架构:分层

ROS是一个系统级别的framework,apollo是在framework之上的应用集合。我们需要感知决策规划等模块运行核心内容,同时也需要数据消息同步通讯。

通过以下两点增加理解为什么需要ROS:

从以上两点来看,ROS主要解决了这方面的问题:

ROS结构关系与实践


ROS总体框架结构:

计算图级 Computation Graph level

计算图是ROS处理数据的一种点对点的网络形式。程序运行时,所有进程以及他们所进行的数据处理,将会通过一种点对点的网络形式表现出来。这一级主要包括几个重要概念:节点(node)、节点管理器(Master)、消息(message)、主题(topic)、服务(service)、消息包(Bag)。

节点 Node

节点是主要的计算执行进程。一个功能包可以有多个节点功能,就是说可以有多个main入口。如果你想要有一个可以与其他节点交互的进程,那么需要创建一个节点,并将节点链接到ROS网络。通常情况下,系统包含能够实现不同功能的多个节点,为了减少系统的风险,最好每个节点的功能都是功能较为单一的,而不是在系统中创建一个保罗万象的大节点。节点能够使用如roscpp(C++)或rospy(python)的ros客户端库编写节点程序。

(节点是ros中非常重要的一个概念,为了帮助初学者理解这个概念,这里举一个通俗的例子:

例如,咱们有一个机器人,和一个遥控器,那么这个机器人和遥控器开始工作后,就是两个节点。遥控器起到了下达指 令的作用;机器人负责监听遥控器下达的指令,完成相应动作。从这里我们可以看出,节点是一个能执行特定工作任务的工作单元,并且能够相互通信,从而实现一个机器人系统整体的功能。在这里我们把遥控器和机器人简单定义为两个节点,实际上在机器人中根据控制器、传感器、执行机构等不同组成模块,还可以将其进一步细分为更多的节点,这个是根据用户编写的程序来定义的。)

rosnode 显示当前运行的ROS节点信息。rosnode list指令列出活跃的节点:

$ rosnode list

消息 Message

节点之间是通过消息传递通讯。每一个消息都是一个严格的数据结构。原来标准的数据类型(整型,浮点型,布尔型等等)都是支持的,同时也支持原始数组类型。消息可以包含任意的嵌套结构和数组(很类似于C语言的结构structs)。

主题 Topic

消息以一种发布/订阅的方式传递。一个节点可以在一个给定的主题中发布消息。一个节点针对某个主题关注与订阅特定类型的数据。可能同时有多个节点发布或者订阅同一个主题的消息。总体上,发布者和订阅者不了解彼此的存在。

消息记录包 Bag

消息记录包是一种用于保存和回放ROS消息数据的文件格式。消息记录包是一种用于存储数据的 重要机制。他能够获取并记录各种难以收集的传感器数据。我们可以通过消息记录包反复获取实验数据,进行必要的开发和算法测试。在使用复杂机器人进行实验工 作时,需要经常使用消息记录包。

服务 Service

虽然基于话题的发布/订阅模型是很灵活的通讯模式,但是它广播式的路径规划对于可以简化节点设计的同步传输模式并不适合。在ROS中,我们称之为一个服务,用一个字符串和一对严格规范的消息定义:一个用于请求,一个用于回应。这类似于web服务器,web服务器是由URIs定义的,同时带有完整定义类型的请求和回复文档。需要注意的是,不像话题,只有一个节点可以以任意独有的名字广播一个服务:只有一个服务可以称之为“分类象征”,比如说,任意一个给出的URI地址只能有一个web服务器。

节点管理器 Master

在上面概念的基础上,需要有一个控制器可以使所有节点有条不紊的执行,这就是一个ROS的控制器(ROS Master)。
ROS Master 通过RPC(Remote Procedure Call Protocol,远程过程调用)提供了登记列表和对其他计算图表的查找。没有控制器,节点将无法找到其他节点,交换消息或调用服务。
比如控制节点订阅和发布消息的模型如下:

ROS的控制器给ROS的节点存储了主题和服务的注册信息。节点与控制器通信从而报告它们的注册信息。当这些节点与控制器通信的时候,它们可以接收关于其他以注册及节点的信息并且建立与其它以注册节点之间的联系。当这些注册信息改变时控制器也会回馈这些节点,同时允许节点动态创建与新节点之间的连接。

节点与节点之间的连接是直接的,控制器仅仅提供了查询信息,就像一个DNS服务器。节点订阅一个主题将会要求建立一个与出版该主题的节点的连接,并且将会在同意连接协议的基础上建立该连接。
另:ROS控制器控制服务:

参数服务器 Parameter Server

参数服务器是共享的,多变量的字典,可以通过网络API访问。节点使用参数服务器存储参数,但参数服务器不是为了高性能运算而设计,所以最好用于静态、非二进制数据,比如配置参数。参数服务器使得参数全局可见,便于更改。
参数服务器使用了通用XML语言的RPC互联网传输机制,运行再ROSMaster中,这也使得参数服务器的API可以通过XMLRPC的库访问。

文件系统级 FileSystem level

功能包(Package)

功能包是ROS中软件组织的基本形式。一个功能包具有最小的结构和最少的内容,用于创建ROS程序。它可以包含ROS运行的进程(节点),配置文件等。

功能包清单(Manifest)

功能包清单提供关于功能包,许可信息,依赖关系,编译标志等的信息。功能包清单是一个manifests.xml文件,通过这个文件能够实现功能包的管理。

功能包集(Stack)

如果你将几个具有某些功能的功能包组织在一起,那么你将会获得一个功能包集。在ROS系统中,存在大量的不同用途的功能包集例如导航功能包集。

功能包集清单(Stack manifest)

功能包清单(stack.xml)提供了一个关于功能包集的清单,包括开源代码的许可证信息,与其他功能包集的依赖关系等。

消息类型(Message/msg type)

消息是一个进程发送到其他进程的信息。ROS系统有许多已经定义好的标准消息,你也可以自定义消息,消息存储在对应功能包的msg文件夹下。 消息类型的说明存储在mypackage/msg/MyMessageType.msg中,也就是对应功能包的msg文件夹下。

服务类型(Service/srv type)

对服务类型进行描述说明的文件,在ROS系统中服务的请求和相应的数据结构,这些描述说明存储在mypackage/srv/MyServiceType.srv中,也就是对应功能能包的srv文件夹下。

社区级 Community level

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

$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

rostopic pub 参数解析

-l 使用tostopic 发布一条消息后马上退出
/turtle1/cmd_vel topic name
geometry_msgs/Twist msg_type
-- 告知解析器,之后的参数均不是命令选项

核心的几点理解

通讯

中心进程服务的通讯

节点之间的通讯

数据

如何调试

1、使用GDB调试器调试ROS节点

2、输出调试信息
ROS自带了大量的能够输出调试信息的函数和宏。这些信息包括错误、警告、或简单的提示信息。提供了如信息级别、条件触发消息和STL的流接口等诸多方式。

ROS_INFO(' MY INFO message');

如何尝试新设备?

实战建议

(非广告)非常建议在实验楼这样已经为你提供基础环境中实践,真正关注ROS中的核心内容。

如果你有数据获取的相关经验,ROS的通讯机制对你来说就是一种请求交互。

随着人工智能的火热,ROS分布式系统,入门级的介绍会有很多,最经典的是官方的wiki。所以本文更关注ROS内部的实现原理,从核心进程的创建到节点之间的通讯过程等等内容。

参考

本篇关于ROS的教程主要参考了以下部分材料:

script>