2011-06-07 43 views
1

我工作是基於一個狀態機上的機器人控制程序。雖然該程序使用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狀態機的方法,但每當我需要這種模式時必須重做。但可能我只是習慣了達到這種效果的一種方式,我沒有看到替代方案?

回答

1

我不知道這是否會幫助你,但我已經實現替代C++的statemachine框架:STTCL 的sttcl :: ConcurrentCompositeState <>類跟蹤完成(正交狀態)的區域,當所有會自動完成他們已經完成。終結可以被實現類掛鉤。

WBR Günther

+0

thanks! 我的機器人在工作,但我可能想看看STTCL用於與FSM的下一個項目。 – artm 2012-06-05 10:18:44

相關問題