我正在研究基于状态机的机器人控制程序。虽然该程序使用 Qt 状态机框架,但我也尝试使用 Boost.statechart (BS) 作为理论练习和学习/评估库的一种方式来实现它。
在 Qt 版本中,我在几个地方使用了以下模式:复合状态具有并行嵌套的子图,每个子图最终都会达到最终状态。当所有并行子状态完成时,父状态发出“finished()”信号,这导致机器转换到下一个顶级状态。例如(当心:伪图):
Idle -calibRequest-> Calibrate( calibrate_camera | calibrate_arm ) -finished-> Idle
而calibrate_*
状态又在其中具有嵌套状态,例如最终状态S -trigger[calibrated?]-> F
在哪里。F
当两个calibrate_*
状态都达到它们各自的F
状态时finished
,信号使状态机转变为Idle
.
Qt 的并行子状态类似于 BS 的正交嵌套状态。起初我认为“终止”是 BS 对最终状态的类比,但实际上并非如此。它更像是“终止状态机,除非还有一些正交的东西在某处”——一旦你终止所有正交状态,父状态也会终止,没有任何转移的机会。在终止时发布事件也无济于事,因为没有可以将这些事件传递到的状态。
我最终实现了“最终状态”,它在到达时发布通知事件并在父状态中对此事件做出反应 - 检查所有正交状态是否已达到其最终事件并在那时过渡。这基本上是 Qt 状态机方法的重新实现,但是每次我需要这种模式时都必须重做。但也许我只是习惯了一种实现这种效果的方法,以至于我看不到替代方法吗?