smach guide
容器与状态
容器
状态机一般说就是一个容器, 包含了各种状态, 以及各种状态之间的轮转。
当然一个状态机容器又可以是一个状态,这就是所谓的层级、分层。
状态
状态名字一般大写
状态都需要继承smach.State, 并实现State.excute()
状态的结果在__init__(self, outcomes=[’’,’’,’’]), 列举出来, 结果一般是字符串表示
指定用户数据
状态的输入和输出数据称为userdata, 可以认为是个map结构体, 键值区分输入和输出, 定义在 input_keys, output_keys
input_keys列表列出了一个状态需要运行的所有输入. input_keys 显式声明了userdata所有字符串字段, 只能读取, 不能写入.
output_keys列表列出了一个状态提供的所有输出.
连接用户数据
不同状态转换时, 关联前后状态的输入输出, 需要使用名称映射连接用户数据字段,那么你可以将这两个用户数据端口连接在一起, 以便允许状态之间传递数据.
关键字为 remapping={‘key_before_output’:‘key_after_input’, ‘’:’’}
每个状态机容器也是一个状态。因此,你可以通过将状态机容器添加到另一个状态机容器中来搭建状态机
状态机容器的结果用红色标记
Smach附带了一个完整的预先实现的状态库,比如
- StateMachine: 生成状态机容器
- Concurrence: 可以并行运行多个状态的状态机
- Sequence: 一种状态机,它使执行一组状态的顺序变得容易