我工作是基於一個狀態機上的機器人控制程序。雖然該程序使用Qt狀態機框架,但我也試圖使用Boost.statechart(BS)作爲理論練習和學習/評估庫的方式來實現它。反應以所有正交狀態已經完成在Boost.statechart
在Qt版本我在幾個地方使用了以下圖案:化合物狀態具有平行嵌套的子圖,其中每一個最終達到最終狀態。當所有並行子狀態完成時,父狀態發出「完成()」信號,這將導致機器轉換到下一個頂級狀態。例如。 (請注意:僞圖):依次
Idle -calibRequest-> Calibrate(calibrate_camera | calibrate_arm) -finished-> Idle
和calibrate_*
州已經嵌套狀態內他們像S -trigger[calibrated?]-> F
其中F
是最終狀態。當兩個calibrate_*
狀態到達它們各自的F
狀態finished
信號使狀態機中轉變成Idle
。
Qt的並行子狀態類似於BS的正交嵌套狀態。起初我雖然「終止」是BS對最終狀態的模擬,但事實上並非如此。它更像是「終止狀態機,除非還有一些正交的事情正在進行」 - 一旦終止所有正交狀態,父狀態也終止,而沒有任何過境的機會。終止時發佈事件也無濟於事,因爲這些事件沒有可傳遞到的狀態。
我最終實現「最終狀態」達成,並在此事件在父狀態反應時發佈通知事件 - 檢查是否所有的正交狀態已經達到他們的最終事件,然後過渡。這基本上是重新實現了Qt狀態機的方法,但每當我需要這種模式時必須重做。但可能我只是習慣了達到這種效果的一種方式,我沒有看到替代方案?
thanks! 我的機器人在工作,但我可能想看看STTCL用於與FSM的下一個項目。 – artm 2012-06-05 10:18:44