学习参考:

actionlib - ROS Wiki

actionlib/DetailedDescription - ROS Wiki

ROS 学习笔记(五)—— 动作 Action 详解_ros action 怎么理解-CSDN博客

此文本仅仅是加强个人记忆所编写学习记录,以及个人理解会存在一定偏差,不太具有学习价值,如果需要学习建议先看看第三条链接再看前两条

 

ROS中除了话题与服务通讯外还有第三种通讯actionlib通讯,这种通讯好像集合了两种通讯方式的优点,可以实时通讯并做到交流反馈,再大项目中常使用;

 

 

个人理解:

如话题,服务通讯一般,对其消息交流进行分块,话题的消息存在订阅者模块与发布者模块,服务的消息分为服务器模块与客户端模块,但是这个actionlib通讯分也是分成服务器,与客户端,但是其中进行传输的数据有有三种,一种是目标(goal),一种是反馈(feedback),一种是结果(result);

 

.action文件:
这文件好像就是设置所谓的行为规范的消息类型,行为规范三大块:目标,反馈,结果;

每一块定义使用三个---进行分离,如下图:

 使用action文件需要对相应的CMakeList文件与Package文件进行修改,有点类似于功能包的编写的感觉了,这毕竟是一个通讯话题,所以也确实是功能包。具体示例如下:

 注意修改的地方。

对package.xml中增加依赖

对CMakeList.txt中设置寻找包,设置可执行文件,设置消息类型;

 

 

服务器与客户端经过ROS进行信息的传递,但是使用者与服务器的交流与客户端的交流是通过一个API进行交互;

 最后:

 

创建简单的actionclient:

  代码感觉也挺好理解的,先是导入包,其中第二条roslib.load_manifest(pkg)搜索出来好像是启用.xml文件的

 导入actionlib用于创建actionlib通讯方式,从chores.msg包中取出DoDishes与DoDishesGoal消息类型(可能是这个意思吧,最后一句看不太懂)

 

主函数:
初始化节点给节点起名字为do_dishes_client

设置一个客户端,类似于话题与服务,将DoDishesAction消息类型发布到'do_dishes'这个主题中;

等待服务器的建立;

声明一个action文件的goal对象

使用客户端发送目标将goal消息类型送到服务端

等待服务端的返回的结果消息,看这个函数设置应该是每五秒接收一次;

 

服务端的创建:

导入包;

 定义一个洗盘子的服务类:
初始化

在类里面设置一个服务端,服务所在子空间为do_dishes在里面获取DoDishAction消息理想进入回调函数execute内部,False 参数表示关闭动作服务器的自动启动功能。

.start()调用服务端内部的开始服务函数

设置回调函数。

后续见到actionlib通讯再添加一些内容。