一、ROS文件系统层级
ROS的文件和文件夹按如下层级来组织:
文件层级中每个模块的功能如下:
-
Packages: ROS中最基本的软件单元,包含ROS实时进程(nodes)、libraries、configuration files等。功能包是ROS软件的原子构建项和发布项。
-
Package manifest: 该package manifest文件包含在一个package中,包含该package、author、license、dependencies、compilation flags等相关信息。在ROS package的package.xml文件是该功能包的说明文件。
-
Meta packages: 该meta package是指由特定目的组成的一个group of packages。在原来的ROS版本中,packages group被称为stacks。一个meta package,如ROS navigation stack。
-
Meta packages manifest: 该meta package manifest类似于上述的package manifest。差别在于该manifest包含packages作为其runtime dependencies且声明一个export tag。
-
Messages(.msg): ROS 消息是一种ROS进程间传递的信息类型。在package的msg文件夹可自定义定制的消息类型。消息文件的后缀为.msg。
-
Services(.srv): ROS service是一种进程间的request/reply类的交互过程。可在package的srv文件夹中定义该reply和request数据类型。
-
Repositories: 大部分的ROS packages是使用版本控制系统(VCS)来维护的,如Git、subversion(svn)、mercurial(hg)等。共用一个common VCS的packages集合可称为repositories。在repositories的package可使用一个catkin自动发布工具来发布,该工具是bloom。
1、ROS packages
一个典型的ROS功能包的结构如下:
每个文件夹的作用如下:
-
config: 在该ROS package中使用的所有配置文件均保存在该文件夹。该文件夹由用户创建,且通常命名为config,来保存配置文件。
-
include/package_name: 该文件包含该package需要的头文件和libraries文件。
-
scripts:该文件夹保存可执行的Python 脚本文件。
-
src: 该文件夹保存C++源文件代码。
-
launch:该文件夹保存用于启动一个或多个ROS节点的launch 文件。
-
msg: 该文件夹保存定制的消息定义。
-
srv: 该文件夹保存service定义。
-
action:该文件夹保存action定义。
-
package.xml:该文件是该功能包的package manifest文件。
-
CMakeLists.txt: 该文件是该功能包的CMake构建文件。
与ROS packages相关的指令如下:
-
catkin_create_pkg: 用于创建一个新的package
-
rospack: 用于获取在该文件系统中该package的信息
-
catkin_make: 用于在工作空间构建该packages
-
rosdep: 用于安装该package所需的系统依赖项。
ROS提供了一个类bash的命令:rosbash,以便于操作packages,用于navigate和manipulate这些ROS package。一些主要的rosbash命令如下:
-
roscd: 用于更改the package folder。如果给定一个功能包名为参数,将切换到该功能包文件夹。
-
roscp: 用于从一个package中复制一个文件。
-
rosed: 用于编辑一个文件。
-
rosrun: 用于运行一个package中的一个可执行文件。
一个典型package的package.xml文件如下:
该package.xml文件包含该功能包名、功能包版本、功能包描述、作者详情、功能包构建依赖项和实时依赖项。该<build_depend></build_depend>tag包含构建该功能包源文件所需的packages。该<run_depend></run_depend>tag是在该功能包节点运行时所需的功能包。
2、ROS meta packages
Meta packages是ROS的特定功能包,只包含一个文件,即一个package.xml文件。Meta packages只是将一系列多个功能包组成一个单独的逻辑package。在该package.xml文件中,该meta packages包含一个export tag,如下:
<export>
<metapackage/>
</export>
此外,在meta packages中,没用用于catkin的<buildtool_depend>依赖项,只有<run_depend>依赖项。
该ROS navigation stack就是一个meta packages。切换到该navigation meta package文件夹,并打开其package.xml文件:
$ roscd navigation
$ gedit package.xml
其package.xml文件的内容如下:
3、ROS messages
ROS节点可以特定类型发布数据。数据类型由ROS messages来描述。ROS messages的数据类型描述存储在该ROS package的子目录msg文件中的.msg文件中。
消息定义由两种类型组成:fields和constants。该field可分为field types和field name。filed types就是传输消息的数据类型。而constants在该message文件中定义一个常量值。例如,一个消息定义为:
int32 number
string name
float32 speed
第一部分是field type,第二部分是field name。可使用该field name来获取该消息的数值,如使用msg.number来获取该消息的number的值。
可使用的内嵌的field types如下:
一种特定的ROS消息类型是message headers。Headers可携带信息,如time、参考坐标系或frame_id、序列数等。此类header信息主要用于发送数据,如robot joint transforms(TF)。
4、ROS services
ROS Services是一种用于ROS nodes间的request/response通讯机制。一个node发送一个request并等待,直到其从另一个node处接收到一个response。
在.srv文件中定义该service definition,该文件被保存在该package的子目录srv下。一个service description format的例子如下:
#Request message type
string str
---
#Response message type
string str
第一部分是request的消息类型,第二部分是response的消息类型,两部分由---分隔。
二、ROS 计算图层级
ROS的计算通过一个process网络来实现,这些process称为ROS nodes。该计算网络可称为计算图。该计算图的主要概念是ROS Nodes、Master、Parameter server、Messages、Topics、Services和Bags。
ROS通讯相关功能包(包括核心client库,如roscpp、rospy)和核心概念实现功能包(如topics、nodes、parameters和services)包含在一个ros_comm的stack中。该stack也包括其他工具来introspect上述概念,如rostopic、rosparam、rosservice、rosnode。
该ros_comm stack包括ROS通讯中间件功能包,这些功能包共同被称为ROS Graph layer。
每个图级概念的抽象如下:
-
Nodes:节点是执行计算的process。每个ROS节点都是使用ROS client 库来写的,如roscpp和rospy。使用client library APIs,可实现在ROS 节点间的不同类型的通讯。
-
Master:ROS Master提供名称注册和所有节点的lookup。在分布式系统中,应在一个computer上运行该master,其他远程nodes通过与该master通讯来相互找寻。
-
Parameter Server:该参数服务器允许将数据保存在一个中间位置。所有的节点都可以获取并修改这些值。Parameter Server是ROS Master的一部分。
-
Messages: 节点间使用Messages相互通讯。Messages只是一种数据结构。
-
Topics:ROS 的每个message是由buses来传送的,该buses被称为topics。当一个节点通过一个topic发送一个message时,可称为该节点正在发布一个topic。当一个节点通过一个topic接收一个message时,可称为该节点订阅了该topic。该publishing 节点和该subscribing节点是相互不知道对方的存在的,即消息的产生和消耗是decoupled。
-
Services:该publish/subscribe模型是一种单向传输系统,当在分布式系统时,可能需要一种request/response交互方式,ROS Services即用于这种情况。可定义一个service definition:一部分用于request,一部分用于response。为使用ROS Services,要编写一个server node和一个client node。
-
Bags:Bags是一种格式,用于保存并回放ROS message data。
1、ROS nodes
ROS nodes是一个执行计算的进程,使用ROS client libraries,如roscpp和rospy。节点间使用ROS Topics、Services和Parameters来通讯。
有一个rosbash工具来introspect ROS nodes。该rosnode命令用于获取一个ROS node的信息,用法如下:
-
$ rosnode info [node_name]: 打印该node的信息。
-
$ rosnode kill [node_name]: kill一个正在运行的node。
-
$ rosnode list: 列举正在运行的nodes。
-
$ rosnode machine [machine_name]: 列举在某个特定machine或一系列machines上运行的nodes。
-
$ rosnode ping: 检测一个node的connectivity。
-
$ rosnode cleanup: 清楚unreachable nodes的注册信息。
2、ROS messages
messages是一种包含field types的数据结构。ROS message支持标准的基本数据类型和基本数据类型的arrays。ROS使用一种MD5 checksum comparison来验证the publisher和the subscriber交换的数据类型。
ROS内嵌工具rosmsg用来获取ROS message的消息,一些rosmsg参数如下:
-
$ rosmsg show [message]: 显示该message 描述。
-
$ rosmsg list: 列举所有的messages。
-
$ rosmsg md5 [message]: 显示一个message的md5sum。
-
$ rosmsg package [package_name]: 列举一个package中的messages。
-
$ rosmsg packages [package_1] [package_2]: 列举包含messages的packages。
3、ROS topics
ROS nodes使用topics来通讯,使用基于TCP/IP的传输来实现,又称为TCPROS,这是ROS默认的传输方法。另一种通讯方式是UDPROS,具有低延迟、松传输的特点,只适用于远程操作。
ROS topic工具可用于获取ROS topics的信息,该命令语法如下:
-
$ rostopic bw /topic: 显示给定topic的所用带宽。
-
$ rostopic echo /topic: 打印给定topic的内容。
-
$ rostopic find /message_type: 查找使用给定message类型的topics。
-
$ rostopic hz /topic: 显示给定topic的发布频率。
-
$ rostopic info /topic: 打印一个active topic的信息。
-
$ rostopic list: 列举在ROS系统中的所有active topics。
-
$ rostopic pub /topic message_type args: 以特定message类型发布一个数值到一个topic。
-
$ rostopic type /topic: 显示给定topic的message类型。
4、ROS services
ROS services使用一对messages来定义,必须在一个srv文件中定义一个request 数据类型和一个response数据类型,该srv文件保存在功能包的srv文件夹。
有两个ROS工具来获取ROS service的信息,第一个工具是rossrv,类似于rosmsg,用于获取该service类型的信息;第二个工具是rosservice,用于列举和query正在运行的ROS services。
rosservice命令的用法如下:
-
$ rosservice call /service args: 使用给定参数来调用the service。
-
$ rosservice find service_type: 以给定service type来查找services。
-
$ rosservice info /services: 打印给定service的信息。
-
$ rosservice list: 列举正在系统上运行的active services。
-
$ rosservice type /service: 打印给定service的service type。
-
$ rosservice uri /service: 打印该service的ROSRPC URI。
5、ROS bags
ROS的bag文件用于存储来自topics和services的ROS message data,后缀为.bag。使用rosbag命令可创建bag文件,将订阅一个或多个topics并将接收的信息存储其message的data。rosbag的主要应用是数据记录。可记录机器人的数据并离线查看和处理。
rosbag命令的用法如下:
-
$ rosbag record [topoc_1] [topic_2] -o [bag_name]: 记录给定的topics到一个bag文件。也可以使用参数-a来保存所有的topics。
-
$ rosbag play [bag_name]: 回放已有的bag文件。
6、ROS Master
ROS Master类似于一个DNS server。ROS Master具有所有在ROS系统中运行的节点的详情。
当一个节点开始发布一个topic时,该node将该topic的详情(如name和data type)发送给ROS Master。ROS Master将会检测是否其他nodes订阅了同一topic。如果有节点订阅了同一topic,ROSMaster将会共享该发布者的节点详情给订阅者节点。获得节点详情后,这两个节点会使用TCPROS协议来相互交互。当我们停止任一节点,节点将再次与ROS Master检查。同样的方法适用于ROS services。
使用ROS client libraries编写nodes,如roscpp和rospy。这些clients使用基于XMLRPC(XML Remote Procedure Call)的APIs来与ROS Master进行交互,这些APIs是ROS系统APIs的基石。
环境参数ROS_MASTER_URI包含ROS Master的IP和port。使用该变量,ROS nodes能够定位ROS Master。如果该变量值是错误的,nodes间的通讯将不存在。当我们在单个系统中使用ROS时,可使用localhost的IP或localhost名称本身。但在分布式系统,即计算在不同的物理计算机上进行,应合适地定义ROS_MASTER_URI,只有如此,远程节点才能相互找到并通讯。在分布式系统,我们只需要一个Master,应在一个计算机上运行该Master,而其他计算机合适地与其进行ping以保证远程ROS nodes能够access the Master。
7、ROS parameter
当进行机器人编程时,可能必须定义机器人参数,如机器人控制器增益P、I、D。ROS提供一个parameter server,一个共享的server,即所有的ROS nodes都能够由该server获取parameters。一个node可从parameter server中read、write、modify和delete 参数值。
我们可以将这些参数存储在一个文件中并load到该server。该server能够存储大量的数据类型甚至存储dictionaries。使用者也可以设置该parameter的scope,即该parameter是否只由某个node或所有的nodes可accessed。
该parameter server支持以下XMLRPC数据类型,包括:
-
32-bit integers
-
Booleans
-
strings
-
doubles
-
iso8601 dates
-
lists
-
base64-encoded binary data
也可以将dictionaries存储在该parameter server。如果参数数目比较多,可使用一个YAML文件保存,以下是一个YAML文件的参数定义:
/camera/name : 'nikon' #string type
/camera/fps : 30 #integer
/camera/exposure : 1.2 #float
/camera/active : true #boolean
rosparam工具用于获取并设置ROS parameter,以下是命令用法:
-
$ rosparam set [parameter_name] [value] : 设置给定参数的值。
-
$ rosparam get [parameter_name]: 获取给定参数的值。
-
$ rosparam load [YAML file]: 可使用一个YAML文件保存ROS参数,使用该命令将其load到该parameter server。
-
$ rosparam dump [YAML file]: 将已有的ROS参数保存到一个YAML文件。
-
$ rosparam delete [parameter_name]: 删除一个给定参数
-
$ rosparam list: 列举已有的参数名称。
在nodes运行期间可动态地更改参数值,使用dynamic_reconfigure功能包。
三、ROS社区层级
ROS资源形成了一个新的ROS社区,用于交互software和knowledge。社区中包括多种资源:Distribution、Repositories、The ROSWiki、Bug ticket system、Mailing lists、ROS Answers、Blog。