本节总结了常用的ROS术语,所以读者可以用作ROS术语词典。大部分应该是初次遇到的术语。即使有不明白的术语,让我们先略过。这些可以通过后面各章的例子和实习掌握到。
ROS
ROS是一个用于开发机器人应用程序的、类似操作系统的机器人软件平台。ROS提供开发机器人应用程序时所需的硬件抽象、子设备控制,以及机器人工程中广泛使用的传感、识别、绘图、运动规划等功能。此外ROS还提供进程之间的消息解析、功能包管理、库和丰富的开发及调试工具。
主节点
主节点(master)负责节点到节点的连接和消息通信,类似于名称服务器(NameServer)。roscore是它的运行命令,当您运行主节点时,可以注册每个节点的名字,并根据需要获取信息。没有主节点,就不能在节点之间建立访问和消息交流(如话题和服务)。主节点使用XML远程过程调用(XMLRPC,XML-Remote Procedure Call)与节点进行通信。XMLRPC是一种基于HTTP的协议,主节点不与连接到主节点的节点保持连接。换句话说,节点只有在需要注册自己的信息或向其他节点发送请求信息时才能访问节点并获取信息。通常情况下,不检查彼此的连接状态。由于这些特点,ROS可用于非常大而复杂的环境。XMLRPC也非常轻便,支持多种编程语言,使其非常适合支持各种硬件和语言的ROS。
当启动ROS时,主节点将获取用户设置的ROS_MASTER_URI变量中列出的URI地址和端口。除非另外设置,默认情况下,URI地址使用当前的本地IP,端口使用11311。
节点
节点(node) 是指在ROS中运行的最小处理器单元。可以把它看作一个可执行程序。在ROS中,建议为一个目的创建一个节点,建议设计时注重可重用性。例如,在移动机器人的情况下,为了驱动机器人,将每个程序细分化。也就是说,使用传感器驱动、传感器数据转换、障碍物判断、电机驱动、编码器输入和导航等多个细分节点。
节点在运行的同时,向主节点注册节点的名称,并且还注册发布者(publisher)、订阅者(subscriber)、服务服务器(service server)、服务客户端(service client)的名称,且注册消息形式、URI地址和端口。基于这些信息,每个节点可以使用话题和服务与其他节点交换消息。
节点使用XMLRPC与主站进行通信,并使用TCP/IP通信系列的XMLRPC或TCPROS 5进行节点之间的通信。节点之间的连接请求和响应使用XMLRPC,而消息通信使用TCPROS,因为它是节点和节点之间的直接通信,与主节点无关。URI地址和端口则使用存储于运行当前节点的计算机上的名为ROS_HOSTNAME的环境变量作为URI地址,并将端口设置为任意的固有值。
功能包
功能包(package)是构成ROS的基本单元。ROS应用程序是以功能包为单位开发的。功能包包括至少一个以上的节点或拥有用于运行其他功能包的节点的配置文件。它还包含功能包所需的所有文件,如用于运行各种进程的ROS依赖库、数据集和配置文件等。目前注册为官方功能包的数量以2017年7月为准为:ROS Indigo多达约2500个(http://repositories.ros.org/status_page/ ros_indigo_default.html),ROS Kinetic多达约1600个(http://repositories.ros.org/status_page/ros_kinetic_default.html)。
除此之外,用户们开发并共享的功能包虽然会有一些重复,但也有约4600个(http://rosindex.github.io/stats/)。
元功能包
元功能包(metapackage) 是一个具有共同目的的功能包的集合。例如,导航元功能包包含AMCL、DWA、EKF和map_server等10余个功能包。
消息
点之间通过消息(message)来发送和接收数据。消息是诸如integer、floatingpoint和boolean等类型的变量。用户还可以使用诸如消息里包括消息的简单数据结构或列举消息的消息数组的结构。使用消息的通信方法包括TCPROS,UDPROS等,根
据情况使用单向消息发送/接收方式的话题(topic)和双向消息请求(request)/响应response)方式的服务(service)。
话题
话题(topic) 就是“故事”。在发布者(publisher)节点关于故事向主节点注册之后,它以消息形式发布关于该故事的广告。希望接收该故事的订阅者(subscriber)节点获得在主节点中以这个话题注册的那个发布者节点的信息。基于这个信息,订阅者节
点直接连接到发布者节点,用话题发送和接收消息。
发布与发布者
发布(publish)是指以与话题的内容对应的消息的形式发送数据。为了执行发布,发布者(publisher)节点在主节点上注册自己的话题等多种信息,并向希望订阅的订阅者节点发送消息。发布者在节点中声明自己是执行发布的个体。单个节点可以成为多个发布者。
订阅与订阅者
订阅是指以与话题内容对应的消息的形式接收数据。为了执行订阅,订阅者节点在主节点上注册自己的话题等多种信息,并从主节点接收那些发布此节点要订阅的话题的发布者节点的信息。基于这个信息,订阅者节点直接联系发布者节点来接收消息。订阅者在节点中声明自己执行订阅的个体。单个节点可以成为多个订阅者。
发布和订阅概念中的话题是异步的,这是一种根据需要发送和接收数据的好方法。另外,由于它通过一次的连接,发送和接收连续的消息,所以它经常被用于必须连续发送消息的传感器数据。然而,在某些情况下,需要一种共同使用请求和响应的同步消息交换方案。因此,ROS提供叫做服务(service)的消息同步方法。服务分为响应请求的服务服务器和请求后接收响应的服务客户端。与话题不同,服务是一次性的消息通信。当服务的请求和响应完成时,两个节点的连接被断开。
服务
服务(service) 消息通信是服务客户端(service client)与服务服务器(serviceserver)之间的同步双向消息通信。其中服务客户端请求对应于特定目的任务的服务,而服务服务器则负责服务响应。
服务服务器
服务服务器(service server)是以请求作为输入,以响应作为输出的服务消息通信的服务器。请求和响应都是消息,服务器收到服务请求后,执行指定的服务,并将结果下发给服务客户端。服务服务器用于执行指定命令的节点。
服务客户端
服务客户端(service client)是以请求作为输出并以响应作为输入的服务消息通信的客户端。请求和响应都是消息,并发送服务请求到服务服务器后接收其结果。服务客户端用于传达给定命令并接收结果值的节点。
动作
动作(action)是在需要像服务那样的双向请求的情况下使用的消息通信方式,不同点是在处理请求之后需要很长的响应,并且需要中途反馈值。动作文件也非常类似于服务,目标(goal)和结果(result)对应于请求和响应。此外,还添加了对应于中途的反馈(feedback)。它由一个设置动作目标(goal)的动作客户端(action client)和一个动作服务器(action server),动作服务器根据目标执行动作,并发送反馈和结果。
动作服务器
动作服务器(action server)以从动作客户端接收的目标作为输入并且以结果和反馈值作为输出的消息通信的服务器。在接收到来自客户端的目标值后,负责执行实际的动作。
动作客户端
动作客户端(action client)是以目标作为输出并以从动作服务器接收待结果和反馈值作为输入的消息通信的客户端。它将目标交付给动作服务器,收到结果和反馈,并给出下一个指示或取消目标。
参数
ROS中的参数(parameter)是指节点中使用的参数。可以把它想象成一个Windows程序中的*.ini配置文件。这些参数是默认(default)设置的,可以根据需要从外部读取或写入。尤其是,它可以通过使用外部的写入功能实时更改设置值,因此非常有
用。例如,您可以指定与外部设备连接的PC的USB端口、相机校准值、电机速度或命令的最大值和最小值等设置值。
参数服务器
参数服务器(parameter server) 是指在功能包中使用参数时,注册各参数的服务器。参数服务器也是主节点的一个功能。catkin
catkin 是指ROS的构建系统。ROS的构建系统基本上使用CMake(Cross PlatformMake),并在功能包目录中的CMakeLists.txt文件中描述构建环境。在ROS中,我们将CMake修改成专为ROS定制的catkin构建系统。catkin从ROS Fuerte版本开始进行alpha测试,并从Groovy版本开始核心功能包转换为catkin,且从Hydro版本开始应用于大部分功能包。catkin 构建系统让用户方便使用与ROS相关的构建、功能包管理以及功能包之间的依赖关系等。现在使用ROS的话,需要使用catkin而不是rosbuild。
rosbuild
ROS构建(rosbuild) 是在构建catkin构建系统之前使用的构建系统,虽然仍有一些用户可以使用,但这只是为ROS版本兼容性保留的,并不是官方推荐的。如果您必须使用rosbuild构建系统使用旧的功能包,我们建议您将rosbuild更改为catkin。
roscore
roscore是运行ROS主节点的命令。也可以在另一台位于同一个网络内的计算机上运行它。但是,除了支持多roscore的某些特殊情况,roscore在一个网络中只能运行一个。运行ROS时,将使用您在ROS_MASTER_URI变量中列出的URI地址和端口。如果用
户没有设置,会使用当前本地IP作为URI地址并使用端口11311。
rosrun
rosrun是ROS的基本运行命令。它用于在功能包中运行一个节点。节点使用的URI地址将存储在当前运行节点的计算机上的ROS_HOSTNAME环境变量作为URI地址,端口被设置为任意的固有值。
roslaunch
如果rosrun是执行一个节点的命令,那么roslaunch 是运行多个节点的概念。该命令允许运行多个确定的节点。其他功能还包括一些专为执行具有诸多选项的节点的ROS命令,比如包括更改功能包参数或节点名称、配置节点命名空间、设置ROS_ROOT和ROS_PACKAGE_PATH以及更改环境变量等。roslaunch使用*.launch文件来设置可执行节点,它基于可扩展标记语言(XML),并提供XML标记形式的多种选项。
bag
用户可以保存ROS中发送和接收的消息的数据,这时用于保存的文件格式称为bag,是以*.bag作为扩展名。在ROS中,这个功能包可以用来存储信息并在需要时可以回放以前的情况。例如,当使用传感器执行机器人实验时,使用bag将传感器值以消息形
式保存。有了这些保存的信息,即使不重复执行之前的实验,也能通过回放保存的bag文件来反复利用当时的传感器值。特别的,如果利用rosbag的记录和回放功能,在开发那些需要反复修改程序的算法的时候会非常有用。
ROS Wiki
ROS的基本说明是一个基于wiki的页面(http://wiki.ros.org/),它解释了ROS提供的每个功能包和功能。这个维基页面描述了ROS的基本用法、每个功能包的简要说明、用到的参数、作者、许可证、主页、存储库和教程等内容。目前,ROS Wiki拥有超过
17,000页的内容。
存储库
每一个公开的功能包在该功能包的wiki上指定一个存储库(repository)。存储库是存储功能包的网站的URL地址,并使用源代码管理系统(如svn、hg和git)来管理问题、开发、下载等。许多当前可用的ROS功能包将github用作存储库。如果您对每个功
能包的源代码内容感兴趣,则可以在相应的存储库中进行查阅。
状态图
上面描述的节点、话题、发布者和订阅者之间关系可以通过状态图(graph)直观地表示。它是当前正在运行的消息通信的图形表示。但不能为一次性服务创建状态图。执行它是通过运行rqt_graph功能包的rqt_graph节点完成的。有两种执行命令:rqt_graph和rosrun rqt_graph rqt_graph。
名称
节点、参数、话题和服务都有名称(name)。当使用主节点的参数、话题和服务时,向主节点注册该名称并根据名称进行搜索,然后发送消息。此外,名称非常灵活,因为它们可以在运行时被更改。另外,对于一个节点、参数、话题和服务,也能给其设定多个不同的名称。这种取名规则使得ROS适用于大型项目和复杂系统。
客户端库
ROS是一个客户端库(client library),它为各种语言提供开发环境,以减少对所用语言的依赖性。主要的客户端库包括C++、Python和Lisp。其他语言包括Java、Lua、.NET、EusLisp和R。为此,开发了诸如roscpp、rospy、roslisp、rosjava、
roslua、roscs、roseus、PhaROS、rosR等客户端库。
URI
统一资源标识符(URI,Uniform Resource Identifier)是代表Internet上资源的唯一地址。该URI被用作Internet协议中的标识符,是在Internet上所需的基本条件。
MD5
MD5(Message-Digest algorithm 5) 是128位密码散列函数。它主要用于检查程序或文件的完整性,以查看它是否保持原样。在使用ROS消息的通信中,使用MD5来检查消息发送/接收的完整性。
RPC
远程过程调用(RPC,Remote Procedure Call)意味着远程(Remote)计算机上的程序调用(Call)另一台计算机中的子程序(Procedure)。这个利用TCP/IP、IPX等传输协议的技术在不需要程序员一一进行编程的情况下也能允许计算机在另一个地址空间通过远程控制运行函数或子程序。
XML
可扩展标记语言(XML,Extensible Markup Language)是W3C推荐用于创建其他特殊用途标记语言的通用标记语言。它是通过使用标签来指定数据结构的语言之一。在ROS中用于*.launch、*.urdf和package.xml等各个部分。
XMLRPC
XML-Remote Procedure Call(XMLRPC)是一种RPC协议,其编码形式采用XML编码格式,而传输方式采用既不保持连接状态、也不检查连接状态的请求和响应方式的HTTP协议。XMLRPC是一个非常简单的约定,仅用于定义小数据类型或命令。所以它比较简单。有了这个特点,XMLRPC非常轻便,支持多种编程语言,因此非常适合支持各种硬件和语言的ROS。
TCP/IP
传输控制协议(TCP,Transmission Control Protocol)是一种传输控制协议,通常被称为TCP/IP。从互联网协议层的角度来看,它基于IP(Internet Protocol)且使用传输控制协议TCP,以此保证数据传输,并按照发送顺序进行发送/接收。TCPROS消息和服务中使用的基于TCP/IP的消息方式称为TCPROS,而UDPROS消息及服务中使用的基于UDP的消息方式称为UDPROS。在ROS中,常用的是TCPROS。
CMakeLists.txt
ROS 构建系统的catkin基本上使用了CMake,因此在功能包目录的CMakeLists.txt 文件中描述着构建环境。
package.xml
包含功能包信息的XML文件,描述功能包名称、作者、许可证和依赖包。
到目前为止,还没有详细解释ROS实际上是如何工作的。在本节中,我们来看看ROS的核心功能和概念。对ROS的概念描述中使用的各个术语的详细描述,请参阅前面介绍的术语表,本节仅涉及概念。为了最大化用户的可重用性,ROS是以节点的形式开发的,而节点是根据其目的细分的可执行程序的最小单位。
节点则通过消息(message)与其他的节点交换数据,最终成为一个大型的程序。这里的关键概念是节点之间的消息通信,它
分为三种。单向消息发送/接收方式的话题(topic);双向消息请求/响应方式的服务(service);双向消息目标(goal)/结果(result)/反馈(feedback)方式的动作(action)。另外,节点中使用的参数可以从外部进行修改。这在大的框架中也可以被
看作消息通信。消息通信可以用一张图来说明,如所示,而不同之处总结在了表4-1中。在对ROS进行编程时,为每个目的使用合适的话 题、服务、动作和参数是很重要的。
如图所示,话题消息通信是指发送信息的发布者和接收信息的订阅者以话题消息的形式发送和接收信息。希望接收话题的订阅者节点接收的是与在主节点中注册的话题名称对应的发布者节点的信息。基于这个信息,订阅者节点直接连接到发布者节点来发送和接收消息。例如,通过计算移动机器人的两个车轮的编码器值生成可以描述机器人当前位置的测位(odometry) 28 信息,并以话题信息(x, y, i)传达,以此实现异步单向的连续消息传输。话题是单向的,适用于需要连续发送消息的传感器数据,因为它们通过一次的连接连续发送和接收消息。另外,单个发布者可以与多个订阅者进行通信,相反,一个订阅者可以在单个话题上与多个发布者进行通信。当然,这两家发布者都可以和多个订阅者进行通信。
服务消息通信是指请求服务的服务客户端与负责服务响应的服务服务器之间的同步双向服务消息通信,如图所示。前述的发布和订阅概念的话题通信方法是一种异步方法,是根据需要传输和接收给定数据的一种非常好的方法。然而,在某些情况下,需要一
种同时使用请求和响应的同步消息交换方案。因此,ROS提供叫做服务的消息同步方法。一个服务被分成服务服务器和服务客户端,其中服务服务器只在有请求(request)的时候才响应(response),而服务客户端会在发送请求后接收响应。与话题不同,服务是一次性消息通信。因此,当服务的请求和响应完成时,两个连接的节点将被断开。该服务通常被用作请求机器人执行特定操作时使用的命令,或者用于根据特定条件需要产生事件的节点。由于它是一次性的通信方式,又因为它在网络上的负载很小,所以它也被用作代替话题的手段,因此是一种非常有用的通信手段。例如,如图所示,当客户端向服务器请求当前时间时,服务器将确认时间并作出响应。
动作 消息通信是在如下情况使用的消息通信方式:服务器收到请求后直到响应所需的时间较长,且需要中途反馈值。这与服务非常相似,服务具有与请求和响应分别对应的目标(goal)和结果(result)。除此之外动作中还多了反馈(feedback)。收到请
求后需要很长时间才能响应,又需要中间值时,使用这个反馈发送相关的数据。消息传输方案本身与异步方式的话题(topic)相同。反馈在动作客户端(action client)和动作服务器(action server)之间执行异步双向消息通信,其中动作客户端设置动作目标(goal),而动作服务器根据目标执行指定的工作,并将动作反馈和动作结果发送给动作客户端。例如,如图所示,当客户端将家庭服务器设置为服务器时,服务器会时时地通知客户端洗碗、洗衣和清洁等进度,最后将结果值发送给客户端。与服务不同,动作通常用于指导复杂的机器人任务,例如发送一个目标值之后,还可以在任意时刻发送取消目标的命令。
在这种情况下,发布者、订阅者、服务服务器、服务客户端、动作服务器和动作客户端都存在于不同的节点中,这些节点需要连接才能进行消息通信。这时候,主节点是帮助节点之间的连接。主节点就像节点名称、话题和服务、动作名称、URI地址和端口以及参数们的名称服务器。换句话说,节点同时向主节点注册自己的信息,并从主节点获取其他节点希望通过主节点访问的节点的信息。然后,节点和节点直接连接进行消息通信。如图所示。
信息通信主要分为话题、服务和动作,而从大的框架来看,参数也可以看作一种消息通信。可以认为参数是节点中使用的全局变量。参数的用途与Windows程序中的*.ini配置文件非常类似。默认情况下,这些设置值是指定的,有需要时可以从外部读取或写入参数。特别是,由于可以通过使用来自外部的写入功能来实时地改变设置值,因此它是非常有用的,因为它可以灵活地应对多变的情况。
尽管参数严格的来说并不是消息通信,但笔者认为它们属于消息通信的范畴,因为它们使用消息。例如,用户可以设置要连接的USB端口、摄像机色彩校正值以及速度和命令的最大值和最小值。
主节点管理节点信息,每个节点根据需要与其他节点进行连接和消息通信。在这里,我们来看看最重要的主节点、节点、话题、服务和动作信息的过程。
运行主节点
节点之间的消息通信当中,管理连接信息的主节点是为使用ROS必须首先运行的必需元素。ROS 主节点使用roscore命令来运行,并使用XMLRPC运行服务器。主节点为了节点与节点的连接,会注册节点的名称、话题、服务、动作名称、消息类型、URI地址和端口,并在有请求时将此信息通知给其他节点。
$ roscore
运行订阅者节点
订阅者节点使用rosrun或roslaunch命令来运行。订阅者节点在运行时向主节点注册其订阅者节点名称、话题名称、消息类型、URI地址和端口。主节点和节点使用XMLRPC进行通信。
$ rosrun PACKAGE_NAME NODE_NAME
$ roslaunch PACKAGE_NAME LAUNCH_NAME
运行发布者节点
发布者节点(与订阅者节点类似)使用rosrun或roslaunch命令来运行。发布者节点向主节点注册发布者节点名称、话题名称、消息类型、URI地址和端口。主节点和节点使用XMLRPC进行通信。
通知发布者信息
主节点向订阅者节点发送此订阅者希望访问的发布者的名称、话题名称、消息类型、URI地址和端口等信息。主节点和节点使用XMLRPC进行通信。
订阅者节点的连接请求
订阅者节点根据从主节点接收的发布者信息,向发布者节点请求直接连接。在这种情况下,要发送的信息包括订阅者节点名称、话题名称和消息类型。发布者节点和订阅者节点使用XMLRPC进行通信。
发布者节点的连接响应
发布者节点将TCP服务器的URI地址和端口作为连接响应发送给订阅者节点。发布者节点和订阅者节点使用XMLRPC进行通信。
TCPROS连接
订阅者节点使用TCPROS创建一个与发布者节点对应的客户端,并直接与发布者节点连接。节点间通信使用一种称为TCPROS的TCP/IP方式。
发送消息
发布者节点向订阅者节点发送消息。节点间通信使用一种称为TCPROS的TCP/IP方式。
服务请求及响应
上述内容相当于消息通信中的话题。话题消息通信是只要发布者或订阅者不停止,会持续地发布和订阅。服务分为下面两种。
■ 服务客户端: 请求服务后等待响应
■ 服务服务器: 收到服务请求后执行指定的任务,并发送响应。
服务服务器和客户端之间的连接与上述发布者和订阅者之间的TCPROS连接相同,但是与话题不同,服务只连接一次,在执行请求和响应之后彼此断开连接。如果有必要,需要重新连接。
动作的目标、结果和反馈
动作(action)在执行的方式上好像是在服务(service)的请求(goal)和响应(result)之间仅仅多了中途反馈环节,但实际的运作方式与话题相同。事实上,如果使用rostopic命令来查阅话题,那么可以看到该动作的goal、status、cancel、result
和feedback等五个话题。动作服务器和客户端之间的连接与上述发布者和订阅中的TCPROS连接相同,但某些用法略有不同。例如,动作客户端发送取消命令或服务器发送结果值会中断连接。
在前面的内容中,我们用turtlesim测试了ROS的操作。在这个测试中,使用了主节点和两个节点,并且在两个节点之间,使用/turtle1/cmd_vel话题将平移和旋转消息传送给虚拟海龟。如果按照上面描述的ROS概念思考它,可以以图表达出来。让我们回顾
一下之前的ROS操作测试,并再次用ROS概念思考一下吧。
消息(message) 是用于节点之间的数据交换的一种数据形式。前述的话题、服务和动作都使用消息。消息可以是简单的数据结构,如整数(integer)、浮点(floating point)和布尔值(boolean),或者是像“geometry_msgs/PoseStamped” 一样消
息包含消息的简单的数据结构,或者也可以是像 “float32[ ] ranges”或“Point32[10]points”之类的消息数组结构。另外,ROS中常用的头(header、std_msgs/Header)也可以作为消息来使用。这些消息由两种类型组成:字段类型(fieldtype)和字段名称
(fieldname)。
fieldtype1 fieldname1
fieldtype2 fieldname2
fieldtype3 fieldname3
字段类型应填入ROS数据类型,如表所示。字段名称要填入指示数据的名称。例如,您可以按照下面两行填入。这只是最简单的消息形式,如果要添加更多的消息,则可以将字段类型作为如表所示的数组,并且常常使用消息包含消息的形式。
int32 x
int32 y
前面讲到ROS中常用的头(header、std_msgs/Header)可以作为消息来使用。更具体来说,正如std_msgs的Header.msg文件中描述,会记录序列号、时间戳和框架ID,利用它们在消息中记录消息的计数以及时间的计算。
消息在程序中的实际用法如下。在ROS操作测试中执行的turtlesim功能包的teleop_turtle_key节点的例子中,根据方向键(←、→、↑、↓)将turtlesim节点的转速(meter/sec)和旋转速度(radian/sec)用消息发送给turtlesim_node节点。乌龟机器人使用接收到的速度值在屏幕上移动。此时使用的消息是geometry_msgs中的Twist消息,是如下形式。
Vector3 linear
Vector3 angular
它以Vector3消息的形式声明了linear和angular。它是消息包含消息的形式,其中,Vector3消息是geometry_msgs 之一。这个Vector3具有以下形式。
float64 x
float64 y
float64 z
换句话说,从teleop_turtle_key节点发布的话题是linear.x、linear.y、linear.z、angular.x、angular.y和angular.z。所有这些都是float64格式,这是上面描述的ROS基本类型之一。利用它,键盘的箭头以平移速度(meter/sec)和旋转速度(radian/sec)
消息传送,从而驱动TurtleBot。上一节中描述的基于消息的话题、服务和动作都使用消息,这些消息在形式和概念上都是相似的,但根据其用法分为三类。这将在下一节中更详细地讨论。
msg文件是用于话题的消息文件,扩展名为*.msg。例如,上述geometry_msgs中的Twist消息是有代表性的。这种msg文件只包含一个字段类型和一个字段名称。
Vector3 linear
Vector3 angular
srv文件是服务使用的消息文件,扩展名为*.srv。例如,sensor_msgs的SetCameraInfo 消息是典型的srv文件。与msg文件的主要区别在于三个连字符(---)作为分隔符,上层消息是服务请求消息,下层消息是服务响应消息。
sensor_msgs/CameraInfo camera_info
---
bool success
string status_message
action消息文件是动作中使用的消息文件,它使用*.action扩展名。与msg和srv不同,它不是一个比较常见的消息文件,所以没有典型的官方消息文件,但是可以像下面的例子一样使用它。与msg和srv文件的主要区别在于,三个连字符(---)在两个地方用
作分隔符,第一部分是goal消息,第二部分是result消息,第三部分是feedback消息。最大的区别是来自action文件的feedback信息。action文件的goal消息和result消息与上述srv文件的请求消息和响应消息角色相同,但action文件的feedback消息用于传输指
定进程执行过程中的中途值。在下面的例子中,当机器人的出发点start_pose和目标点goal_pose的位置和姿态作为请求值被传送时,机器人移动到预定的目标位置并且将发送最终到达的result_pose的位置和姿态。另外,用percent_complete消息,周期性地发送到达目标地点进程的百分比。
geometry_msgs/PoseStamped start_pose
geometry_msgs/PoseStamped goal_pose
---
geometry_msgs/PoseStamped result_pose
---
float32 percent_complete