参考官方文档,学习actionlib的基本原理
http://wiki.ros.org/actionlib
http://wiki.ros.org/actionlib/DetailedDescription
https://gaoyichao.com/Xiaotu/?book=ros&title=Action
整理:
ROS提供了两种基本的节点之间通信方式:发布和订阅主题、请求服务。主题订阅的方式解耦了数据生产者与消费者之间的关系,但是当生产者想要获取消息的消费情况时, 系统就会变复杂,我们还需要再订阅一个反馈消息的主题。而服务的方式可以满足我们希望获得反馈的需求,但是这种反馈也只是在服务结束之后给出,如果我们想要跟进一个任务的进度, 纯粹使用服务请求模式也会把系统搞得很复杂。因而,ROS提供了第三种节点间通信方式:Action。
Action可以看做是两种基本通信方式的组合,它像服务器模式那样,提供了一种请求响应机制。又像订阅者模式那样,不断地发布反馈消息。比如说,控制移动机器人从A点运动到B点, 我们就可以通过Action的形式来实现,我们请求机器人运动,在运动过程中可以实时监视机器人的位置,完成任务后还可以反馈完成状态,而且可以在运动过程中打断任务。
实际使用中:
服务器端一般用执行回调函数executecb,处理接收到目标后的操作;
客户端一般订阅status状态,在回调函数中处理不同状态下的操作,获取goalid,用于发布取消目标点的操作;也可以用waitforserver的函数,函数返回true时执行相应的操作。定义action服务器端和客户端,用到actionlib中定义的指针类型。
服务器端可以定义状态发布的频率,这也从另一方面说明了,服务器发送的反馈信息和话题消息是一样的机制。
而客户端发送目标点给服务器端,只发送一次,说明和服务消息是一样的机制。
综合来看,action消息机制结合了服务和话题消息的,通过actionlib来定义。