ROS学习|SMACH状态机一(安装与初探)

系列文章目录

ROS基础
ROS单线程与多线程
navigation基本导航
navigation基本导航
SMACH状态机一(安装与初探)


SMACH简介

SMACH是StateMachine的缩写,它为任务执行量身定做,实现简单,易于维护,重构任务简单。它是一种基于python强大可伸缩的分级状态机库。Smach库不依赖ROS,executive_smach堆栈提供了ROS很好的集成。

smach提供了actionlib整合和smach viewer两大组件。samch viewer可以实时查看任务执行当前的状态结点位置,便于开发调试。smach还整合了动作状态,例如定点导航,可以把topic,service转化为状态,也可以把一个类转化为状态结点。smach还可以实现状态的并发执行,任务的重复执行,层次嵌套复杂的状态机。
SMACH 有 利 于控制机器人复杂动作 的 具 体 实 现 、 在SMACH中 , 所 有 可 能 的 状 忘 和状态转移都能被明确定义。SMACH有以下特点:

  • 快 速 原 型 : 利 用 基 于 Python 的 状 态 机 语 法 , 能 够 快 速 构 建 可 执 行 的 状 态 机 。
  • 复 杂 状 态 机 : SMACH 支 持 设 计 、 维 护 和 调 试 大 型 的 复 杂 的 层 次 状 态 机 。
  • 自 省 : SMACH 可 以 创 建 状 态 机 的 自 省 程 序 , 包 括 状 态 转 移 、 用 户 数 据 等 要 素 的 初 始 化 。

由 于SMACH旨在提 供任务级的状态机描述,因此并不适用于无结构性的任务,以及需要较高执行效率的底层系统。

安装

直接用apt-get安装

sudo apt-get install ros-melodic-executive-smach

基础知识

ROS任务调度

ROS提供了抢占式的任务调度接口acionlib,该接口不但可以调度任务的执行,而且具备中断任务、任务状态跟踪与周期状态反馈、执行过程中间结果反馈的能力。

在actionlib中,客户端发送请求到服务器端,服务器端根据相应的任务调度策略进行任务调度,被选择的任务将会抢占当前任务的执行权。同时客户端还可以发送取消请求,服务器端依照一定的原则选择取消一个或多个任务的执行。

actionlib接口中提供了Simple调度策略。具体策略为:服务器端一次只选择一个任务进行调度执行,后来的任务总是抢占当前任务的执行,不管当前任务是否执行完毕。

action的设计与编译

action用于定义任务,包括Gaol,Feedback和Result等。action是一种与平台,编程语言无关的接口定义语言,其本质是消息。action文件依次定义了goal、result、feedback;编译action将会产生7个结构体,分别为Action ActionGaol ActionFeedback ActionResult Goal Feedback Result结构体
在这里插入图片描述ActionClient与ActionServer的交互采用了 “ 发 布 / 订 阅 “ 模 型 , 即 基 于 主 题 的 异 步 数 据 流 通 信 模 型 , 其 体 实 现 中 依 赖 XMLRPC 进 行 远 程 过 程 调 用 ,KXMLRPC 的 底 层实 现 采 用 的 是 select 异 步 网 络 模 型 ,具体见下图。
在这里插入图片描述actionlib 接 口 设 计 了 专 用 于 区 分 目 标 的 GoallD 类 。GoallID 类 中 有 ID 和 Stamp 两 个 成 员 ,1D 是 唯 一 标 识 每 一 个 Goal 的 字 符 申 ,Stamp 代 表 每 一 个 Goal 发 送 的时间截 。GoallID 类 为 ActionServer 与 ActionClient 的 交 互 提 供 了 一 个 稳 健 的 方 式 , 来 保 证 两 者 之 间 的 任 务 请 求 和 执 行 结 果 的 一 一 对 应 关 系 。GoallD 的 ID 由 节 点 名 、 节 点 计 数 及时间戳构 成 , 节 点 名 本 身 具 有 全 局 唯 一 性 ; 节 点 计 数 采 用 锁机 制 , 以 保 证 全 局 唯 一 ; 再 结 合 不 同 的 时 间 戳 , 来 保 证 每 一 个 Goa 的有 唯 一 标 识 。 图 5-4 是 简 羊 的 GoallD 示 例 .
在这里插入图片描述

ActionClient 与ActionServer交互

在这里插入图片描述

action状态变换

actionlib接口提供了任务状态追踪能力。ActionServer与ActionClient分贝维护一个状态机。Server从接收到任务到完成任务会执行一系列状态变换,周期性地发送任务状态至client,client依据接受的状态自主更新自身维护的任务状态,actionlib中俄状态机以server为主,client为辅。

在这里插入图片描述任务状态包括过程状态和终止状态, 过程状态包括pending、 active, recalling, preempting, 终止状态包括rejected, recalled, preempted, aborted及succeeded, 各状态的含义具体如下:

  • pending状态代表任务正在等待ActionServer执行。
  • active状态表示任务正在执行。
  • recalling状态表示任务在等待执行期间收到ActionClient的任务取消请求,但ActionServer尚末确认该任务取消。
  • preempting状态表示任务在执行过程中接收到ActionClient的任务取消请求,但ActionServer末确认该任务取消。
  • rejected状态是指任务末开始执行且ActionServer在没有接受到ActionClient的取消请求的情况下拒绝执行任务。
  • aborted状态表示任务在ActionServer未接收到任务取消情况下被放弃执行
  • recalled状态表示任务末开始执行时ActionServer接收到任务取消请求,或者被新的任务抢占执行。
  • preempted状态表示任务执行过程中被新任务抢占, 或者ActionServer接收到任务取消请求。
  • succeeded状态表示任务成功执行。
    在这里插入图片描述ActionClient跟踪的任务状态包括橓时状态和终止状态。瞬时状态包括wait_for_goal_ack、 pending、active, recalling, preempting, wait_for_cancel_ack、wait_for_result等状态, 终止状态为done, 各状态的含义具体如下。
  • wait_for_goal_ack表示ActionClient在发送任务请求后还末接收到服务器端发布的状态更新前的状态.
  • pending表示任务处于等待执行的状态。
  • active表示任务正在执行。
  • recalling表示任务在等待执行时,ActionServer接收到取消请求但末确认取消任务。
  • preempting表示任务在执行过程,ActionServer接收到取消请求但末确认取消任务。
  • wait_for_cancel_ack表示任务处于等待ActionServer确认取消任务的状态。 -wait_for_result表示等待任务执行结果。
  • done表示任务完成,可细分为成功执行、被拒绝执行、被放弃执行或被抢占4种情况。
    在这里插入图片描述
    在这里插入图片描述

Actionlib接口具体实现

在这里插入图片描述在服务器端, ActionServer类继承ActionServerBase,该类用于任务实体存储, 任务到达后创建StatusTracker类对象用于保存该任务, 同时创建 ServerGoalHandle对象用于管理任务。 ActionServer类对任务进行调度, 周期性发布任务执行状态。SimpleAction-Server类是Simple策路的具体实现者,可调用 ActionServer对象进行任务管理。
在这里插入图片描述
在客户端, ActionClient类创建GoalManager对象和ConnectionMonitor对象,前者通过创建GoallDGenerator对象产生GoalID,后者则实现服务器端连接。 ActionClient通过一系列的对象创建,可实现任务状态追踪和功能子对象的建立。

状态机

状态机表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
而状态转移则表示了当前状态到下一状态的 对应关系及转移条件,因此当前状态执行结束的情在这里插入图片描述有限状态机包含4个要素,具体如下:
现态:指状态机当前所处的状态。
条件:又被称为“事件”。当某一条件满足时,将触发相应的时间或执行相应状态的迁移。
动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,或者仍保持源状态。条件满足时,也可以不执行任何动作,直接迁移至新状态。
次态:条件满足后要转换到的状态。“次态”相对于“现态”而言,“次态”一旦被激活,就会成为新的“现态”。
如果我们作进一步的归纳,把“现态”和“次态”统一,而忽略“动作”的话,那么状态机有两个基本且关键的要素:状态和迁移条件。
在这里插入图片描述机器人是以微控制器为控制核心的,微控制器内嵌程序的运行决定了机器人的动作或行为。如何为不同应用的机器人设计控制程序一直是困扰设计人员的难题之一. 在明确需求的基咄上,将工作任务细分, 确定各个任务之间的内在联系, 就可以用有限状态机模型来指导不同类型机器人控制程序的设计。有限状态机是一种记录给定时刻状态的数学模型,根据输入而改变其状态或引发一个动作。应用有限状态机或状态转换方法实现机器人控制程序设计,可以理清思路,简化设计过程。
ROS作为面向机器人的操作系统, 控制程序设计支持尤为重要. 为了提高代码复用,适应不同应用场景的机器人控制要求, 有限状态机SMACH应运而生. SMACH提供了机器人任务控制所需的不同状态和状态机容器,使得设计人员在面对特定的机器人控制程序设计时, 能够组合不同类型的状态机,不但可提高代码的复用性,同时设计也更加简单高效。
这里需要说明的是,有限状态机和SMACH中的状态机既有联系又有区别。在通用有限状态机模型中,事件是状态转移的触发因素,某一事件的出而状态转移则表示了当前状态到下一状态的 对应关系及转移条件,因此当前状态执行结束的情现使得相应的动作 被执行,或者发生状态转移, 状态机从当前状态转移到下一个状态, 状态反映的是系统从开始到现在时刻的输入变化。转移是两个状态之间的关系, 它由某个事件触发, 然后 执行特定的操作或评估并导致特定的结束状态. 动作是在给定时刻要进行的活动描述,是系统此刻需要执行的活动. 而SMACH设计的初衷是用于描述具有层次结构的机器人 高层复杂任务. 机器人的复杂任务可以被逐层分解成可执行的子任务,然后用SMACH的状态明确定义这些可执行的子任务, 状态之间通过状态转移条件关联, 这样就可以用 状态机的形式明确表示一个复杂的机器人任务。因此可以看出, S M A C H$中的状态是对机器人任务执行过程中某一子任务的描述,而状态转移则表示了当前状态到下一状态的 对应关系及转移条件,因此当前状态执行结束的情形決定了状态转移的方向。

参考文献

ROS Smach官方教程
《机器人操作系统ROS原理与应用》周兴社 杨刚 王岚等

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值