[Stateflow の概要] タスク 11. チャートの階層

ロボット掃除機の運転モード

導入

背景
これまで学習したように、Stateflow モデルで階層を使用すると、共通の機能を持つ状態をグループ化するのに役立ちます。このプロジェクトでは、階層を使用して、以前にモデル化したロボット掃除機の駆動ロジックと同様のものをモデル化します。ドッキングまたはバキュームの 2 つのモードで駆動できます。これらの各モードに対するロボットの命令は次のとおりです: (
学習したばかりのとおり、Stateflow モデルで階層を使用すると、共通の機能を持つ状態をグループ化するのに役立ちます。このプロジェクトでは、階層を使用して次のことを行います。前にモデル化したロボット掃除機の駆動ロジックに似たものをモデル化します。このプロジェクトでは、ロボットは 2 つのモードで駆動できます: ドッキングまたは掃除機をかけることができます。ロボットは各モードに応答します。手順は次のとおりです :)

SeekDock – ドックまで運転してから停止します (SeekDock – ドックまで運転してから停止します)。

掃除機をかける – 部屋の隅まで移動し、ジグザグのパターンに従います。

したがって、ロボットには 2 つの運転動作が必要でした: 特定の位置まで運転することと、ジグザグ パターンに従うことです。これらは、階層内の最上位の状態として実装できます。それぞれの下位状態は、各動作を実装するために必要な特定の状態です。たとえば、ある場所まで運転する場合、ロボットの動作は、純粋な回転を使用した方向調整、純粋な平行移動を使用した駆動、および停止に分類できます (したがって、ロボットには、ある場所までの運転とジグザグ パターンに従うという 2 つの運転動作が必要です
。これらは、階層内のトップレベルの状態として実装できます。それぞれのサブ状態は、各動作を実装するために必要な特定の状態です。たとえば、ある場所に移動するとき、ロボットの動きは次のように分類できます。純粋な回転を使用すると、純粋な移動を使用した方向が駆動され、停止されます。)
ここに画像の説明を挿入します
プロジェクト
このプロジェクトでは、ロボットがドッキングするか、部屋の周囲でランダムなパターンで駆動できる駆動パターンを実装します (ロボット掃除機の初期モデルまたは割引モデルの多くは、実装が簡単ですが、効率は劣りますが、ランダム パターンに従っています)。したがって、DriveToLocation と RandomDrive は 2 つのスーパーステートです。Stateflow チャートには、それ以上の駆動コマンドが送信されない TaskComplete 状態も含まれます。( このプロジェクトでは、ロボットがドッキングできる駆動モードを実装します
。または、部屋の周囲をランダムなパターンで走行します (多くの初期モデルまたは割引モデルのロボット掃除機はランダム パターンに従っており、地図を使用するほど効率的ではありませんが、実装は簡単です)。フローチャートも TaskComplete 状態になり、それ以上のドライバー コマンドは送信されません)。
ここに画像の説明を挿入します
ロボット掃除機監視制御プロジェクトと同様に、ロボット掃除機の駆動ダイナミクスは Simulink で構築されています。必要な速度および角速度コマンドを設定するために、このモデルからのシミュレートされたセンサー データとその他の情報を Stateflow チャートに接続します。 (ロボット
掃除機モニタリング プロジェクトと同様に、ロボット掃除機の駆動ダイナミクスは Simulink に組み込まれています。このモデルからのシミュレートされたセンサー データとその他の情報を状態フロー図に接続して、送信される設定が)ここに画像の説明を挿入します
このモデルは 2 つの部分で構築します。パート 1 では、駆動モード ロジックの高レベル構造を定義します。次に、パート 2 で実装を記入します。詳細を確認し、Stateflow チャートを Simulink に接続します
(このモデルは 2 つの部分に分けて構築します。パート 1 では、駆動モード ロジックの高レベル構造を定義します。次に、パート 2 で実装の詳細を入力します。 Stateflow に接続します。グラフは Simulink に接続されます。)

パート1

タスク1(タスク1)

前述したように、運転行動は 3 つの状態 (指定された場所まで運転する、ランダムに運転する、および駐車する) によって捕捉できます
。)

DriveToLocationRandomDrive およびTaskComplete の状態作成しますDriveToLocation をデフォルトの状態として指定します

ここに画像の説明を挿入します

タスク2(タスク2)

このシステムには 3 つの内部状態がありますが、全体的な駆動モードは 2 つだけです

1.ドックまで運転します。(ドックまで運転します。)
2.部屋の中心まで運転し、ランダム パターンを開始します。(部屋の中心まで運転し、ランダム パターンを開始します。)

モードはチャート入力 driveMode によって設定されます。どちらの動作でも、最初のステップは指定された場所まで運転することです。したがって、どちらのドライブ モードも最初に DriveToLocation 状態に入ります。その後、driveMode == 1 の場合、タスクは完了します。 driveMode2 の場合、ランダムなドライブを開始します
(モードはグラフ入力 driveMode によって設定されます。どちらの動作でも、最初のステップは車を指定された場所まで運転することです。したがって、両方のドライブ モードは最初に DriveToLocation 状態に入ります。ドライブモード1、タスクは完了です。ドライブモードの場合2、ランダム運転を開始します。)

PositionReached == 1 の場合、システムは DriveToLocation 状態を終了できます
(positionReached == 1 の場合、システムは DriveToLocation 状態を終了できます)。

  1. DriveToLocationからRandomDriveおよびTaskCompleteへの遷移を追加します変数positionReachedおよびdriveModeを使用して上記の動作実装するために必要な条件)

  2. 状態エントリアクションを追加して、 positionReachedの値を0に初期化します
    。 (2. 状態エントリアクションを追加して、positionReachedの値を0に初期化します。)

PositionReachedのデータ スコープをローカル データに設定します。driveModeはユーザー入力であるため、そのスコープは入力データである必要があります。
ここに画像の説明を挿入します

タスク3(タスク3)

ランダム掃除機タスクは、壁にぶつかるまで運転し、ランダムな量回転し、衝突/回転シーケンスを繰り返すことで構成されます。バンプ センサーが 50 回以上登録すると、タスクは完了します。(ランダム掃除機タスクは、壁にぶつかるまで運転することで構成されます)壁
衝突させ、ランダムな量で回転させ、衝突/回転シーケンスを繰り返します。換気センサーが 50 回以上登録すると、タスクは完了します。)

カウンタbumpCount基づいて適切な遷移と条件を追加しRandomDrive状態入ると、bumpCount0設定します

シンボルをローカル データとして定義します。
ここに画像の説明を挿入します

タスク4(タスク4)

「位置への駆動」動作は、次の順序で 3 つのステップで発生します: 正しい方向への純粋な回転、正しい位置への純粋な移動、そして停止 : 正しい方向への純粋な回転、正しい位置への純粋な移動
、そして停止します。)

DriveToLocationのサブステートとして状態PureRotatePureTranslate、およびStopを作成します説明されたシーケンスを実装するために遷移を追加します。(パート 2 で条件を追加します)説明されたシーケンスを実装します。(パート 2 で条件を追加します。))

ここに画像の説明を挿入します

タスク5(タスク5)

「ランダム駆動」の動作は、壁を見つける、回転するという 2 つのアクションで構成されます。ランダム駆動中、ロボットはこれらのアクションを繰り返し実行します (
ロボットはこれらのアクションを繰り返します)。

RandomDriveのサブステートとして状態FindWallおよびRotateRandom を作成し、必要な遷移も作成します。 FindWall がこのレベルの階層のデフォルトの状態である必要があります(状態FindWallおよびRotateRandom をRandomDriveのサブ状態として作成し、必要な遷移FindWall をこのレベルにする必要があります。デフォルト構造レベルでの状態。)

ここに画像の説明を挿入します

パート2

タスク1(タスク1)


右側のグラフには、前回のレッスンで構築した運転モード フレームワークが含まれています。次に、各状態に特定の動作を追加します。

このチャートは速度と角速度のコマンドを出力します。これらはロボットの Simulink モデルに渡されます。純粋な回転では、速度 v を 0 に設定し、角速度 w を 1 に設定します。純粋な平行移動では、 v=3 および w=0。停止すると、両方の値は 0 に等しくなります。
(このグラフは速度と角速度のコマンドを出力します。これらはロボットの Simulink モデルに渡されます。純粋な回転では、速度を設定します) v を 0 に設定し、角速度 w を 1 に設定します。純粋な変換では、v=3、w=0。停止すると、両方の値は 0 に等しくなります。)

1. PureRotate PureTranslate 、およびStop状態エントリアクションを追加して状態のvw適切設定します w適切な値を設定します。) 2. vwのスコープを定義して、 Simulink モデルに渡されます(2. Simulink モデルに渡されるように、vwのスコープを定義します。) 3. Stopにエントリアクションを追加します。



状態をpositionReached1
に設定します。 (3. stop状態エントリ操作を追加し、到達した位置を1設定します。)
ここに画像の説明を挿入します

タスク2(タスク2)

Simulink からの 4 つの追加入力は、特定の動作中のロボットの進行状況を追跡するのに役立ちます

desiredDist – 目的地までの希望の距離 (desiredDist –
目的地までの希望の距離)desiredRot – 目的地までの希望の回転 (desiredRot – 目的地までの希望の回転) elapsedDist
– 瞬間的な経過距離 (elapsedDist – 瞬間的な通過距離)
elapsedRot – 瞬間的な経過回転 (elapsedRotation – 瞬間的な通過) (回転)これらは、DriveToLocation サブ状態間で移行するための条件を提供します: 現在の回転または距離がターゲットを満たすか超えるとすぐに、タスクが完了します (これらは、DriveToLocation サブ状態
ここに画像の説明を挿入します
間で移行するための条件を提供します: 現在の回転または距離が達成されたら、タスクは完了します)
目標に達するか超えれば、ミッションは完了です。)

DriveToLocationサブ状態間の遷移に条件を追加します。すべての新しいシンボルを入力データに設定します( DriveToLocation
サブ状態間の遷移に条件を追加します。すべての新しいシンボルを入力データに設定します)。

注: 回転の場合、角度をラップする必要があるため、対象となる値はmod(elapsedRot,2*pi .)です。)

ここに画像の説明を挿入します

タスク3(タスク3)

DriveToLocation の動作はこれで完了です。RandomDrive の動作も同様で、 FindWall での純粋な移動と RotateRandom での純粋な回転 (
純粋な回転) で構成されます。

FindWallRotateRandomに状態エントリアクションを追加して各状態速度vと角速度wを設定します。PureTranslate 状態と PureRotate 状態と同じ値を使用します。各状態速度v角速度w使用ますPureTranslateおよびPureRate状態と同じ値。)

ここに画像の説明を挿入します

タスク4(タスク4)

壁に衝突した後、ロボットはランダムな回転動作に移行します。これは衝突センサーによって検出され、Simulink 信号のバンプに記録されます。値 1 は検出を示します。回転動作。これは衝突センサーによって検出され、
Simulink 信号に記録される、つまり衝突。値 1 は検出を示します。)

FindWallからRotateRandomへの遷移に、バンプが検出されとき遷移が有効になるように条件を追加します。バンプを入力データとして定義します。バンプを入力データとして定義します。)

次に、条件が true のときに、bumpCount
を 1 ずつ増やす条件アクションを追加します (次に、条件が true のときに、bumpCount を1 ずつ増やす条件アクションを追加します)。
ここに画像の説明を挿入します

タスク5(タスク5)

ランダムな回転を実現するには、回転状態に留まる時間を表すランダム変数 tRotate を作成します。その後、この値を時間演算子の引数として使用して、いつ FindWall に戻るかを決定できます。 (
ランダムな回転を実装するには、回転された状態に留まる時間を表すランダム変数 tRotate を作成できます。その後、その値を一時演算子の引数として使用して、いつ FindWall に戻るかを決定できます)状態。)

次の MATLAB コマンドをRotateRandomエントリ
アクションに追加します。このコマンドは 2.5 ~ 4 の範囲の乱数を生成します

tRotate = 行(1) * 1.5+2.5;

tRotateと時間演算子を使用して、 2.5 ~ 4 秒後に RotateRandom から FindWall に遷移します未定義の定義としてデータローカルtRotate をシンボルないください )

ここに画像の説明を挿入します

タスク6(タスク6)

特定のドライブ モード タスクが完了したら、フラグを Simulink に送り返します

TaskComplete状態に入ると、completeを1設定します。これをシンボルペインの出力データとして定義します

ここに画像の説明を挿入します

タスク7(タスク7)

Simulink に移動し、信号名に基づいて、未接続の信号を Stateflow チャート上の対応するポートに接続します

ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

タスク8(タスク8)

最後に、信号の交差を解除するには、Stateflow チャートでポートの順序を変更します
(最後に、信号の交差を解除するには、Stateflow チャートでポートの順序を変更します)。

バンプの入力ポートをポート 2 に変更すると、入力ポートの順序は次のようになります
(バンプの入力ポートをポート 2 に変更すると、入力ポートの順序は次のようになります)。

1 – driveMode
2 –バンプ
3 –desiredDist
4 –desiredRot
5 –elapsedDist
6 –elapsedRot
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/J_WangJiang/article/details/129811679