ROS进阶功能—action通信机制
一、总述
ROS中常用的通信机制是话题(Topic)和服务(Service),但是在很多场景下,这两种通信机制往往满足不了所有需求。比如机械臂控制,如果用话题发布运动目标,由于话题是单向通信,则需要另外订阅一个话题来获得机器人运动过程中的状态反馈。如果用服务发布运动目标,虽然可以获得一次反馈信息,但是对于控制来说数据太少,而且当反馈迟迟没有收到时,就只能等待,做不了其他事情。那么有没有一种更加合适的通信机制来满足类似这样场景的需求呢?即action。
二、action
ROS中包含一个名为actionlib的功能包,用于实现action的通信机制。action是一种类似于Service的问答通信机制,不同之处在于action带有连续反馈,可以不断反馈任务进度,也可以在任务过程中中止运行。
三、action的工作机制
action也采用客户端/服务器(Client/Server)的工作模式。
client和server之间通过actionlib定义的“action protocol”进行通讯。这种通讯协议是基于ROS的消息机制实现的,为用户提供了client和server的接口。
Client向Server端发布任务目标以及在必要的时候取消任务,Server会向Client发布当前状态、实时反馈和任务执行的最终结果。
1)goal:任务目标。
2)cancel:请求取消任务。
3)status:通知client当前的状态。
4)feedback:周期反馈任务运行的监控数据。
5)result:向client发送任务的执行结果,这个topic只会发布一次。
四、action的简单案例
这个案例简单地实现了一个洗盘子的action通信功能。客户端发送洗盘子的目标,服务器端返回洗盘子的结果,并随时反馈洗盘子的进度。共用到action消息中的:goal、feedback和result.
首先是需要新建一个action文件夹,在其下定义一个action文件。
action文件中的内容如下:
# Define the goal
uint32 dishwasher_id # Specify which dishwasher we want to use
---
# Define the result
uint32 total_dishes_cleaned
---
# Define a feedback message
float32 percent_complete
之后要在CMakeLists.txt 文件中加入以下编译规则:
find_package(catkin REQUIRED genmsg actionlib_msgs actionlib)
add_action_files(DIRECTORY action FILES DoDishes.action) generate_messages(DEPENDENCIES actionlib_msgs)