actionlib的身世之谜
不知道为什么会把这么严肃认真的一篇技术整理贴起这么一个故事会风格类似的名字,就这样吧:^)shenmegui
园子里有人整理了actionlib的初学者教程,我来整理下actionlib的细节描述吧。初版偏向于逐字翻译+少量个人理解。等我再长大一些感悟更多的时候再修改更新我的更多理解。我boss说开始学ROS相关就是会很乱的。我是一个喜欢划分割线的奇女子~\(≧▽≦)/~
一、服务端描述
1)goal是在ActionClient端启动的(client会发送sendgoal嘛),一旦ActionServer接收到goal请求,它就会为这个goal创建一个状态机来追踪goal的状态转换,重复三遍,状态机是跟踪goal的不是跟踪ActionServer的:
zou是这个状态转换图,下面来细说这些个状态:
2)服务端状态
- 这些状态的转换大多是服务的实施者触发的(这么生硬的翻译,其实就是服务的程序下同),用小一串命令:
setAccepted - 检查到有goal之后,决定开始处理它
setRejected - 检察到goal后,决定不去处理它,因为它是个无效请求(溢出,资源不可用,无效等)
setSucceeded - 告知goal被正确执行
setAborted - 告知goal在处理时遇到了问题不得不被终止了
setCanceled - 告知因cancle请求,goal不再被执行了
action client也能异步触发状态转换:
CancelRequest: 客户端通知action server它想要server停止处理这个goal服务端状态
服务端状态
中间状态
(前面说了,simple的状态有三个,就是等待执行挂起)
Pending - goal还没有被ActionServer处理
Active - goal正在被AS处理
Recalling - goal没有被处理并且从客户端已发送取消它的命令,但AS还不确定goal已经被取消了(时差导致的?)
Preempting - goal正被处理呢,从AC端收到了取消请求,但AS还不确定goal已经被取消了
终点状态
Rejected - AC没有发cancle请求,goal被AS不处理直接拒绝了The goal was rejected by the action server without being processed and without a request from the action client to cancel
Succeeded - goal被AS成功实现 was achieved successfully by the action server
Aborted - goal被AS终止没有AC的cancle请求
Recalled - 在AS开始执行之前这个goal被另一个goal或者cancle请求取消了
Preempted - 处理中的goal被另一个goal或者AC的取消请求给取消了
并发问题
setAccepted-CancelRequest vs CancelRequest-setAccepted:
直接的说就是AS能在收到CR之后仍然能把goal给SA。这是因为执行CR的异步竞争机制,那是,因为除了server之外的其他代码触发了状态转换,server不能确定现在到底是在[PENDING]还是 [RECALLING]状态。
二、客户端描述
1)客户端状态机
actionlib中,认为server的状态机是主机,client的状态机是从机/耦合机,它在追随主机的状态。
2)客户端转换
服务端触发转换
Reported [State]: 因为client在追随主机状态,很多状态的转换都是通知自己状态转换后触发client的状态转换
Receive Result Message: 这种状态,server给client发送result message。接收到result就意味着追踪这个goal 结束了
客户端触发转换
Cancel Goal: 请求server停止处理这个goal
"略过" 状态
- 鉴于ROS是基于传输层协议,非常有可能client并不能收到所有server状态的更新。因此,我们允许客户端状态机“略过”server的触发状态
Example: 客户端在 [WAITING FOR GOAL ACK]状态, 收到 [PREEMPTED]server的更新状态, 客户端状态可以跳过 [ACTIVE]状态,直接转移到 [WAITING FOR RESULT]状态
因为多AC可以连接单一AS,因此允许一个client取消另一个client的goal。因此当收到server的[RECALLING]状态时允许client从 [PENDING] 转移到 [RECALLING]状态
三、Action接口和传输协议
Action客户端和服务端通过预定义的action协议交流。这个action协议依赖ROS topics在一个ROS规定的命名空间中传递消息
- ROS Messages
goal - 用于给目标发送新的服务
cancel - 用来给服务发送取消命令
status - 用来通知当前状态下系统中所有goal的状态
feedback - 用来给客户端定期定期发送辅助信息
- result - 用来在goal完成后给发送客户端一次信息
1)数据组合和goal ID
goal ID是字符串类型字段
------明天写*^_^*
四、协议
1)Simple Action Client
一般,高层的应用和可执行文件并不关心goal是否被处理或是否完整。他们才不关心中间状态呢。Simple Action Client的原始客户端状态机只有三个状态:Pending, Active, & Done
1.1)客户端状态模糊
单独客户端状态是不够确定SimpleClient状态的,但这很容易通过观察客户端状态转移来解决.如果客户端状态转移并未使SC状态转移.SC状态就不更新.
栗子:如果客户端从RECALLING转移到WAITING FOR RESULT,SC的状态仍然在PENDING.
1.2)多goal协议
Simple Action Client一次只追踪一个goal。当用户使用simple client发送一个goal时, 它会取消前一个goal的所有回调并使停止追踪它的状态,注意它并不是取消前一个goal!
1.3)线程模式(C++)
基于简单的action客户端结构,用户决定是否要自旋另一个线程
不要额外线程 (推荐)
- 客户端所有用户都注册到全局回调队列
- 用户的action回调是从ros::spin中回调的,因此,阻断用户的动作回调会组织全局回调队列被服务端处理
自旋一个线程
- action client的所有订阅者都会注册到一个回调队列。这个队列与全局回调队列分离,这个队列服务于自旋线程
- 用户的action回调队列被称为spun up线程,虽然堵在action回调不会阻止其他ROS消息被服务,但仍不推荐这样用,因为这个action的status feedback和反馈都不能被服务
一个(可能是唯一一个)自旋一个额外线程的有点是用户可以不用在app中调用ros::spin()
2)Simple Action Server
很多action server遵循同样的模式,就是在同一时间只能有一个标签是活跃的,并且新的goal可以抢占先前的goal。设计action server包装的simple action server是为了强制这个简单协议去处理goal
当从action client接收到一个新goal时,simple action server将这个goal移到等待槽。如果这个goal已经占据了等待槽,sipmle action server 将这个目标设置为cancle,并用线上到来的其他目标取代它。
好没有动力继续写啊。。。。。。%>_<%
actionlib的身世之谜的更多相关文章
- ROS actionlib学习(一)
actionlib是ROS中一个很重要的功能包集合,尽管在ROS中已经提供了srevice机制来满足请求—响应式的使用场景,但是假如某个请求执行时间很长,在此期间用户想查看执行的进度或者取消这个请求的 ...
- ROS知识(17)----Actionlib使用的例子
1.Actionlib原理 英文版:DetailedDescription 翻译版:actionlib的身世之谜 2.Actionlib官方教程 Actionlib是ros的重要部件,对于复杂动作的执 ...
- ROS actionlib学习(三)
下面这个例子将展示用actionlib来计算随机变量的均值和标准差.首先在action文件中定义goal.result和feedback的数据类型,其中goal为样本容量,result为均值和标准差, ...
- ROS actionlib学习(二)
在ROS actionlib学习(一)中的例子展示了actionlib最基本的用法,下面我们看一个稍微实际一点的例子,用actionlib计算斐波那契数列,并发布反馈(feedback)和结果(res ...
- ROS知识(15)----Actionlib的使用(一)
Actionlib是ROS非常重要的库,像执行各种运动的动作,例如控制手臂去抓取一个杯子,这个过程可能复杂而漫长,执行过程中还可能强制中断或反馈信息,这时Actionlib就能大展伸手了. 1.原理 ...
- 第十二课 Actionlib(1)
一\Actionlib概念 在ROS系统中,有时需发送请求给某个节点完成相应的任务,同时获得一个一个响应,这种情况下可以通过ROS服务来 完成;然而,在某些情况下,服务需要很长时间才能执行完,如让机器 ...
- 通过actionlib控制jaco机械臂
为了安全,先写一个简单控制三个手指的程序: 根据驱动包内kinova_fingers_action.cpp服务器写客户端程序 #include <ros/ros.h> #include & ...
- actionlib学习
ROS中的服务service是一问一答的形式,你来查询了,我就返给你要的信息. action也有服务的概念,但是它不一样的地方是:不是一问一答,而多了一个反馈,它会不断反馈项目进度. 如navigat ...
- 第十三课 Actionlib(2)
上节课讲到了客户端,这节课讲解一下服务器 1.创建服务器源文件touch fibonacciserver.cpp 2.编写源文件 3.修改CMakeLists.txt 4.编译之catkin_make ...
随机推荐
- 理解 OpenStack 高可用(HA) (6): MySQL HA
本系列会分析OpenStack 的高可用性(HA)概念和解决方案: (1)OpenStack 高可用方案概述 (2)Neutron L3 Agent HA - VRRP (虚拟路由冗余协议) (3)N ...
- [Tool] SourceTree初始化GitFlow遇到错误(git command not found)的解决方案
[Tool] SourceTree初始化GitFlow遇到错误(git command not found)的解决方案 问题情景 使用SourceTree,可以方便开发人员快速的套用GitFlow开发 ...
- ASP.Net之数据绑定
---恢复内容开始--- [概述]数据绑定是指从数据源获取数据或向数据源写入数据.简单的数据绑定可以是对变量或属性的绑定,比较复杂的是对ASP.NET数据绑定控件的操作 1.简单的属性绑定 基于属性的 ...
- Reapp - 下一代的 Hybrid App 开发框架
Reapp 与 React Native 有着惊人的相似之处,二者都使用 React 来创建应用程序用户界面的框架.然而,在底层机制上这两个框架之间却具有明显的哲学差异.React Native 将 ...
- 也来谈谈wap端瀑布流布局
Definition 瀑布流布局,在视觉上表现为参差不齐的多栏布局,随着页面滚动条向下滚动,新数据不断被加载进来. 瀑布流对于图片的展现,是高效而具有吸引力的,用户一眼扫过的快速阅读模式可以在短时间内 ...
- sharepoint列表如何进行随机取几条记录?
sharepoint列表如何进行随机取记录?由于itemid是不连续.可能存在删除添加等操作导致 我们可以采用随机取第几条记录.把记录集合取出来.产生随机第几条数.这里关键是如何产生不重复的随机数 方 ...
- linux 压缩命令详解
原文地址:http://www.2cto.com/os/201112/114982.html 编写shell脚本的时候经常需要解压缩到指定的文件夹,tar命令是最常用的 参考一下说明,其中注意-C的用 ...
- iOS开发之图片分辨率与像素对齐
像素对齐的概念 在iOS中,有一个概念叫做像素对齐,如果像素不对齐,那么在GPU渲染时,需要进行插值计算,这个插值计算的过程会有性能损耗. 在模拟器上,有一个选项可以把像素不对齐的部分显示出来.  ...
- 操作系统开发系列—12.c.从Loader加载ELF内核,顺便解释下函数调用过程 ●
实际上,我们要做的工作是根据内核的Program header table的信息进行类似下面这个C语言语句的内存复制: memcpy(p_vaddr, BaseOfLoaderPhyAddr+p_of ...
- iOS Address Book指南
尽管OC是一门面向对象的语言,但是在你做开发的时候你会发现,并不是所有你用的frameworks都是面向对象的.有些是用C写的,例如Address Book的API,接下来让我们去学习一下Addres ...