問題タブ [boost-msm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
507 参照

c++ - Boost MSM のすべての状態からのエラーを処理する

Boost MSM を使用して、ロボットの動作をモデル化しています。「ManualMove」、「AutoMove」、「Work」、「Idle」など、複数の状態があります。しかし、どの状態からでもロボットを強制停止させて、動けない状態にして、新しいコマンドを受信できないため、「EmergencyStopped」ステートを作成しました。 ロボットが再武装するように求められると、ロボットは「アイドル」状態に戻る必要があります。

ただし、Boost は、すべての状態から単一の状態への遷移を作成することを推奨しておらず、直交状態を使用することを好みます。したがって、たとえば、「AllOk」とinterrupt_state「EmergencyStopped」の直交状態を実行できます。

問題は、ロボットを「EmergencyStopped」にすることは簡単にできますが、ロボットを終了して以前の状態から「アイドル」状態にすることはできません。たとえば、ロボットが次のことを行うとします。

  • [作業、すべてOK] -> 停止
  • [作業、緊急停止] -> 復旧

ロボットは [Work, AllOk] 状態になりますが、[Idle, AllOk] 状態にしたいです。

だから私の質問は:

  • このワークフローに直交状態を使用できますか? はいの場合、直交状態「EmergencyStopped」を終了するときに状態を強制的に「アイドル」にする方法は?
  • または、「EmergencyStopped」を非直交にして、すべての状態からそれへの遷移を宣言する必要がありますか?
  • それとも別の解決策がありますか?
0 投票する
0 に答える
234 参照

c++ - Boost MSM を使用して含まれているステート マシンを取得する方法

私はブースト MSM を使用しており、データを渡したり、ステート マシンで関数を使用したりする必要があります。このために、アクションまたは on_entry フックを使用して、イベントからデータget_state()を取得するか、以前の使用状態からデータを取得します。

ただし、この手法では基になるステート マシンにアクセスできず、サブ ステート マシンにいる場合はメイン ステート マシンにまったくアクセスできません。

たとえば(遊び場リンク付き):

では、を取得するために使用することも、ProcessingState::on_entryを使用することもできません。に解決されることはわかっていますが、取得する方法はありますか?get_stateSubStateMachineMainStateMachineFSMSubStateMachineMainStateMachine

0 投票する
0 に答える
80 参照

c++ - boost.msm 現在の状態メソッドを呼び出す方法

パブリック インターフェイス (API) を使用していくつかのロジックを実装する必要があります。

各 API 呼び出しの戻り値と「意味」は、状態によって異なります。ルールの例: api_open() 呼び出しが成功する前に API 呼び出しを行うと、エラーが返されます。ここには、初期状態と開いた状態の 2 つの状態があります。初期状態では、api_open() を除くすべての API 呼び出しでエラーが返されます。開いた状態の api_1() と api_2() で、いくつかのアクションを実装します。

通常、これは、パブリック インターフェイスと具体的な型で実装された状態を持つ状態パターンとして実装します。例: https://www.robertlarsononline.com/2017/05/11/state-pattern-using-cplusplus/

それから私は思った..各boost.msm状態がこのようなものなら

次に、必要なのは、ステート マシンから現在の状態にアクセスし、API メソッドを呼び出すことだけです。

ただし、ドキュメントから引用します。 current_state 現在アクティブな状態の ID を返します。通常は、デバッグまたはロギングの目的でのみ必要になります。

boost.msm ライブラリを誤用しようとしているように感じます....古典的な oop 状態パターンを msm と混ぜようとしていると思います。これは良くない....

各 API 呼び出しをイベントとして (API 呼び出しパラメーターを表すデータと共に) ステート マシンに渡し、何らかの形でそこから戻り値を取得する必要があります...どのように?

ステート マシンにデータを送信し、それを取得することは明らかではないように感じます。それとも、私は要点を得ていないのでしょうか?

主な質問は次のとおりです:boost.msmで私の問題を解決する適切な方法は何ですか?