ステート マシンに基づくロボット制御プログラムに取り組んでいます。このプログラムは Qt State Machine Framework を使用していますが、理論的な演習とライブラリの学習/評価の方法として、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 のアプローチの再実装ですが、このパターンが必要になるたびにやり直す必要があります。しかし、私はこの効果を達成するための 1 つの方法に慣れすぎて、別の方法が見つからないのではないでしょうか?