我正在研究一种基于状态机的机器人控制程序。虽然该程序使用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 State Machine方法的重新实现,但每次我需要这种模式时都必须重做。但是,我可能只是习惯于实现这种效果的一种方法,我没有看到另一种选择?
答案 0 :(得分:1)
我不知道这是否会对您有所帮助,但我已经实现了另一种C ++状态机框架:STTCL sttcl :: ConcurrentCompositeState<> class跟踪已完成的(正交状态)区域,并在所有区域完成后自动完成。最终化可以被实现类挂钩。
WBR 京特