SMACH 文档
概念
结果语义
所有的SMACH容器,包含的接口状态是通过状态结果定义。状态的潜在结果是状态实例的属性,必须在执行之前声明。如果SMACH的计划是手写的,在创建过程中需要声明所有可能的结局,并且可以很容易检查状态转换而不需要运行它。
状态结果可能会导致不同类型的容器中发生不同的事情,但结果发布之后发生的事情与状态的节点无关。从这个意义上说,结果可以被认为是一个给定状态的“局部”。
例如,一个状态可能提供的结果如'成功'、'失败或抢占,就状态而言,这是它与任务级状态流的交互方式。在状态机的上下文中,这些结果将与其他状态相关联,从而形成一个过渡。然而,在另一个容器中,它们可能受到不同的对待。结果仅仅是扮演一个状态和容器之间的通用接口。
用户数据
SMACH容器各有一平面数据库用来协调不同状态之间的数据传递。当计算一些结果或返回一些传感器信息时,这就变得很有用了。这允许执行级保存这些数据,并提供给其他任务或过程。
同样的结果,userdata关键字可以在每一个描述的状态中设置和检索,通过状态间的输入键和输出键。这些也是状态实例的属性,必须在执行前声明。在所有这些相互作用的声明中,当SMACH计划变得复杂时,所有这些交互的声明可以防止错误和帮助调试。
对于用户数据API,可以查看在SMACH中操作Userdata.
抢占
抢占传播是内置在SMACH。状态基类包括在容器和包含状态间协调优先请求的接口。每种容器类型都有自己明确的行为应对抢占请求。这使得系统能够对终端用户的终端信号进行干净的响应,并能由可以由高级执行人员以编程方式取消。
内省
SMACH容器可以提供一个调试接口,允许开发者(通过ROS)设置一个全部初始状态的SMACH树。这是可视化的SMACH查看器。它包括每个容器的初始状态标签以及每个级别上的用户数据结构内容。
状态
"状态"在不同的上下文中可能意味着不同的事物。在SMACH中,一个"状态"是一个执行的局部状态,或等价对应于系统执行一些任务的"状态"。这不同于正式的状态机,其中每个状态都不描述系统正在做什么,而是描述系统的给定配置。这允许用户关注系统执行的内容和执行结果,而不是在执行之间命名。在SMACH中状态对应更多的结构化编程。更多关于这一区别,以及如何在可视化SMACH中的状态,查看状态图 VS 流程图。
提供状态类
类 |
描述 |
结果 |
状态 |
状态基本接口 |
None |
SPAState |
有三种常用的预先定义的结果状态。 |
succeeded, preempted, aborted |
一个状态订阅ROS话题并当满足条件给出框图。 |
valid, invalid, preempted |
|
一个状态运行一个条件回调。 |
true, false |
|
一个状态扮演一个简单行为代理。 |
succeeded, preempted, aborted |
容器
SMACH库提供了几个容器类型。不同容器提供不同的执行语义,但它们都可以像其他容器中的状态一样对待。容器可能有自己的方法来指定包含状态的转换,因为“转换”在不同的上下文中意味着不同的东西。
所有的SMACH容器有以下性能:
它们包含一个目标状态字典用于目标实现smach。通过字符串labels键入状态接口。
- 它们包含一个userdata接口,用于所有子项可以访问。
按序修改一个容器的结构,它必须处于opened (如下).
构造时打开容器
在容器目标上,可以通过使用Python的with关键词,或调用open和close()。with关键字不论是和容器目标本身,还是在容器的opened方法都可以使用。
向容器添加状态
SMACH容器提供静态方法来添加子项。这些方法访问当当前打开的容器来添加相应的状态。