学习参考:
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通讯再添加一些内容。