不知道为什么会把这么严肃认真的一篇技术整理贴起这么一个故事会风格类似的名字,就这样吧:^)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的身世之谜的更多相关文章

  1. ROS actionlib学习(一)

    actionlib是ROS中一个很重要的功能包集合,尽管在ROS中已经提供了srevice机制来满足请求—响应式的使用场景,但是假如某个请求执行时间很长,在此期间用户想查看执行的进度或者取消这个请求的 ...

  2. ROS知识(17)----Actionlib使用的例子

    1.Actionlib原理 英文版:DetailedDescription 翻译版:actionlib的身世之谜 2.Actionlib官方教程 Actionlib是ros的重要部件,对于复杂动作的执 ...

  3. ROS actionlib学习(三)

    下面这个例子将展示用actionlib来计算随机变量的均值和标准差.首先在action文件中定义goal.result和feedback的数据类型,其中goal为样本容量,result为均值和标准差, ...

  4. ROS actionlib学习(二)

    在ROS actionlib学习(一)中的例子展示了actionlib最基本的用法,下面我们看一个稍微实际一点的例子,用actionlib计算斐波那契数列,并发布反馈(feedback)和结果(res ...

  5. ROS知识(15)----Actionlib的使用(一)

    Actionlib是ROS非常重要的库,像执行各种运动的动作,例如控制手臂去抓取一个杯子,这个过程可能复杂而漫长,执行过程中还可能强制中断或反馈信息,这时Actionlib就能大展伸手了. 1.原理 ...

  6. 第十二课 Actionlib(1)

    一\Actionlib概念 在ROS系统中,有时需发送请求给某个节点完成相应的任务,同时获得一个一个响应,这种情况下可以通过ROS服务来 完成;然而,在某些情况下,服务需要很长时间才能执行完,如让机器 ...

  7. 通过actionlib控制jaco机械臂

    为了安全,先写一个简单控制三个手指的程序: 根据驱动包内kinova_fingers_action.cpp服务器写客户端程序 #include <ros/ros.h> #include & ...

  8. actionlib学习

    ROS中的服务service是一问一答的形式,你来查询了,我就返给你要的信息. action也有服务的概念,但是它不一样的地方是:不是一问一答,而多了一个反馈,它会不断反馈项目进度. 如navigat ...

  9. 第十三课 Actionlib(2)

    上节课讲到了客户端,这节课讲解一下服务器 1.创建服务器源文件touch fibonacciserver.cpp 2.编写源文件 3.修改CMakeLists.txt 4.编译之catkin_make ...

随机推荐

  1. 一款效果精致的 jQuery 多层滑出菜单插件

    想要以用户友好的方式呈现多级菜单是件不容易的事情,而且还要跨浏览器兼容就更难了.Multi-Level Push Menu 这款 jQuery 插件提供了呈现这种菜单的解决方案,能够让你无限制的展示菜 ...

  2. One Page Scroll – 实现苹果风格的单页滚动效果

    单页滚动网站已经被广泛使用了有一段时间了,它们对于快速提供信息是很有用的.One Page Scroll 是一个 jQuery 插件,简化了创建此类网站的步骤,只需创建 HTML 结构,进行简单设置, ...

  3. 送给我的朋友——Cry on my shoulder

    If the hero never comes to you如果你的真命天子仍未来到 If you need someone you"re feeling blue如果你情绪低落需要有人陪伴 ...

  4. Office 365 – SharePoint 2013 Online 中添加域和域名

    1.在SharePoint Online管理中心,点击菜单上的添加域,如下图: 2.进入管理域的页面,点击添加域来添加我们自己的域名,如下图: 3.进入“在 Office 365中添加新域”的向导,跟 ...

  5. Troubleshooting FIM: (No Display Name) in FIM Portal

    from: http://social.technet.microsoft.com/wiki/contents/articles/12682.troubleshooting-fim-no-displa ...

  6. 动态改变actionbar上menu的图标

    工作中遇到了一个需求是,在滚动的时候让actionbar上的图标进行变色.实现后在这里总结下思路. 一.先在主题中定义好Actionbar的style <style name="App ...

  7. 《The Linux Command Line》 读书笔记03 ls命令与长格式输出解释 文件权限

    ls命令与长格式输出解释 文件权限 ls命令 ls 命令用于列出目录内容,不带参数时列出当前工作目录的内容,也可以指定目标目录(可以指定多个),列出目标目录下的内容. ls命令的参数 ls -l 长格 ...

  8. Ubuntu 16.04 LTS 安装配置 Nginx 1.10.0 Php7.0-FPM

    1. 安装Nginx,Php-7.0 ~$ sudo add-apt-repository ppa:nginx/stable ~$ sudo apt-get update ~$ sudo apt-ge ...

  9. 内外分离接口依赖及UIScrollView知识点

    1:Class Extension 还能巧妙的解决一个接口暴露问题 有些属性或者方法对外可以提供,有些只针对内部的类进行调用: // Sark.framework/Sark.h @interface ...

  10. iOS 9 使用HTTP的方法

    问题 在ios 9中使用HTTP请求,Xcode就会抛出下面的Exception: App Transport Security has blocked a cleartext HTTP (http: ...