1 引入背景
actionlib是ROS中一个很重要的功能包集合,尽管在ROS中已经提供了srevice机制来满足请求-响应式的使用场景,但是加入某个请求执行时间很长,在此期间用户想查看执行的进度或者取消这个请求的话,service机制就不能满足了,但是actionlib可满足用户这种需求。
2 actionlib工作机制
actionlib使用client-server工作模式,ActionClient 和ActionServer通过"ROS Action Protocol"进行通信,"ROS Action Protocol"以ROS消息方式进行传输。此外ActionClient 和ActionServer给用户提供了一些简单的接口,用户使用这些接口可以完成goal请求(client边)和goal执行(server边)。
ActionClient 和ActionServer的应用场景中通讯机制大致如下图所示:
3 ROS Action Protocol
ActionClient 和ActionServer之间使用action protocol通信,action protocol就是预定义的一组ROS message,这些message被放到ROS topic上在 ActionClient 和ActionServer之间进行传实现二者的沟通。
3.1 Goal IDs
goal ID是action message中一个字符串字段,这使得ActionClient 和ActionServer之间传输的message与Goal完全对应起来不会导致通信失配错误。goal ID通常由node name,counter和timestamp组成。
3.2 Message
3.2.1 goal topic: Sending Goals
goal topic使用自动创建的ActionGoal message (example: actionlib/TestActionGoal), goal topic被用于向action server发送新的goal。 ActionGoal message封装了一条goal message并包含Goal ID。
当acttion client发送goal时候将创建独一无二的goal ID和时间戳。但是也允许留空它们,这时action server将填充它们:
-
Empty stamp: action server收到这个时候,时间戳将设置为now()
-
Empty id: action server收到这个时候,ID自动随机创建。不过这个ID由于action client无法知道其对应的goal,所以意义不大。
3.2.2 cancel topic: Cancelling Goals
cancel topic使用消息 actionlib_msgs/GoalID , 每个cancel message都有一个时间戳和goal ID,基于这些字段信息对应goal将会被取消。
3.2.3 status topic: Server 端goal状态更新
status topic使用消息 actionlib_msgs/GoalStatusArray, 通知action clients有关 server goal status信息。 action server将会以固定速率发送该消息(一般是10 Hz)。
action server将一直跟踪actionclient请求的每一个目标,知道目标状态为完成。但是为了提高通信可靠性,通常在目标状态变为完成后几分钟,server才发送完成状态。
3.2.4 feedback topic: Asynchronous goal information
feedback topic使用自动创建的ActionFeedback消息, 在处理goal过程中server周期性通知client状态。因为ActionFeedback也有一个 goal ID, 所以action client 能决定是否丢弃收到的feedback messages,发送feedback message非强制是可选的。
3.2.5 result topic: Goal information upon completion
result topic使用自动生成的ActionResult message (如actionlib/TestActionResult), 通过它server端实现者可以发送goal完成结果给client。 ActionResult也有一个 goal ID, 所以action client 能决定是否丢弃收到的result messages。 虽然result可以是empty message, 但在goal完成后是强制要求必须发送的。 因此,当server端goal状态机过渡到完成状态 (Rejected, Recalled, Preempted, Aborted, Succeeded)时,result message必须发送出去。
4 action server和action client状态机
箭头上的蓝色字是一些命令,server端user code也可以通过命令触发,白色的框由action server library自行切换。