ROS系统的架构主要被设计和划分为三部分,每一部分代表一个层级的概念:
文件系统级(The filesystem level)
计算图级(The computation graph level)
开源社区级(The community level)
与其他操作系统类似,一个ROS程序的不同组件要被放在不同的文件夹下。这些文件夹是根据功能的不同来对文件进行组织的:
1.1 工作空间
工作空间就是一个包含功能包、可编辑源文件或编译包的文件夹。当想同时编译不同的功能包时非常有用,并且可以用来保存本地开发包,一般包含src、bulid和devel这三个文件夹。
1.2 功能包
功能包指的是一种特定的文件结构和文件夹组合。这种结果如下所示:
功能包的目录结构图如下图所示:
CMakeLists.txt 文件的内容结构图如下图所示:
package.xml 文件的内容结构图如下图所示:
功能包还能配置launch文件,launch文件编写规则如下图所示:
为了创建、修改或使用功能包,ROS给我们提供了一些工具:
若要在文件夹和功能包之间移动文件,ROS提供了非常有用的rosbash功能包,其中包含了一些非常类似于LInux命令的命令,例如:
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为扩展名。
消息类型必须具有两个主要部分:字段和常量。字段定义了要在消息中传输的数据类型,例如int32、string或之前创建的新类型。常量用于定义字段的名称。
在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() 命令。
ROS会创建一个连接到所有进程的网络。在系统中的任何节点都可以访问此网络,并通过该网络与其他节点交互,获取其他节点发布的信息,并且将自身数据发布到网络上。如下图所示:
在这一层级中最基本的概念包括节点、节点管理器、参数服务器、消息、服务、主题和消息记录,这些概念都以不同的方式向计算图级提供数据:
2.1 节点(Node)
节点都是各自独立的可执行文件,能够通过主题,服务或参数服务器与其他进程(节点)通信。ROS通过使用节点将代码和功能解耦,提高了系统容错能力和可维护性,使系统简化。同时,节点允许了ROS系统能够布置在任意多个机器上并同时运行。节点在系统中必须有唯一的名称。节点可以使用不同的库编写,如roscpp和rospy。roscpp基于C++。
ROS提供了处理节点的工具,如rosnode:一个用于显示节点信息的命令行工具。
2.2 主题(Topic)
一个主题可以有多个订阅者也可以有多个发布者,但是需要注意用不同的节点发布同样的主题,否则会产生冲突。
每个主题都是强类型的,发布到主题上的消息必须与主题的ROS消息类型相匹配,并且节点只能接受类型匹配的消息。节点要想订阅主题,就必须具有相同的消息类型。
ROS的主题可以使用 TCP/IP 和 UDP 传输。基于 TCP 传输称为 TCPROS,它使用 TCP/IP 长连接。这是ROS默认的传输方式。
基于 UDP 传输称为 UDPROS,它是一种低延迟高效率的传输方式,但可能产生数据丢失。所以它适合像远程操控的任务。
ROS有一个 rostopic 工具用于主题操作。使用rostopic -h命令,可以查看此工具的所有支持命令:
2.3 服务(Service)
当你需要直接与节点通信并获得应答时,将无法通过主题实现,从而需要服务。服务需要由用户开发,节点并不提供标准服务。包含服务源代码的文件存储在 srv 文件夹中。
像主题一样,服务关联一个以功能包中 .srv 文件名称来命名的服务类型。与其他基于ROS文件系统的类型一样,服务类型是功能包名称和 .srv 文件名称的组合。例如 chapter2_tutorials/srv/chapter2srv1.srv 文件的服务类型是 chapter2_tutorials/chapter2srv1。
ROS关于服务的命令行工具有两个:rossrv 和 rosservice。我们可以通过 rossrv 看到有关服务数据结构的信息,并且与 rosmsg 具有完全一致的用法。使用rosservice -h命令,可以查看此工具的所有支持命令:
2.4 消息(Message)
消息的类型在ROS中按照以下标准命名方式进行约定:功能包名称 /.msg 文件名称。例如,std_msgs/msg/String.msg 的消息类型是 std_msgs/String。
ROS有一个 rosmsg 工具用于消息操作。使用rosmsg -h命令,可以查看此工具的所有支持命令:
2.5 消息纪录包
消息纪录包是由ROS创建的一组文件。它使用 .bag 格式保存消息、主题、服务和其他ROS数据信息。你可以在事件发生后,通过使用可视化工具调用和回放数据,检查在系统中到底发生了什么。
若要使用纪录包文件,我们可以使用以下ROS工具:
2.6 节点管理器
节点管理器通常使用 roscore 命令运行,它会加载ROS节点管理器及其他ROS核心组件。
2.7 参数服务器
参数服务器使用 XMLRPC 数据类型为参数赋值,包括以下类型:
ROS中关于参数服务器的工具是 rosparam。使用'rosparam -h'命令,可以查看此工具的所有支持命令:
ROS开源社区级的概念主要是ROS资源,其能够通过独立的网络社区分享软件和知识。这些资源包括: