ロボット掃除機の運転モード
導入
背景
これまで学習したように、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 つの状態 (指定された場所まで運転する、ランダムに運転する、および駐車する) によって捕捉できます
。)
DriveToLocation、RandomDrive 、およびTaskComplete の状態を作成します。DriveToLocation をデフォルトの状態として指定します。
タスク2(タスク2)
このシステムには 3 つの内部状態がありますが、全体的な駆動モードは 2 つだけです
。
1.ドックまで運転します。(ドックまで運転します。)
2.部屋の中心まで運転し、ランダム パターンを開始します。(部屋の中心まで運転し、ランダム パターンを開始します。)
モードはチャート入力 driveMode によって設定されます。どちらの動作でも、最初のステップは指定された場所まで運転することです。したがって、どちらのドライブ モードも最初に DriveToLocation 状態に入ります。その後、driveMode == 1 の場合、タスクは完了します。 driveMode2 の場合、ランダムなドライブを開始します
(モードはグラフ入力 driveMode によって設定されます。どちらの動作でも、最初のステップは車を指定された場所まで運転することです。したがって、両方のドライブ モードは最初に DriveToLocation 状態に入ります。ドライブモード1、タスクは完了です。ドライブモードの場合2、ランダム運転を開始します。)
PositionReached == 1 の場合、システムは DriveToLocation 状態を終了できます
(positionReached == 1 の場合、システムは DriveToLocation 状態を終了できます)。
-
DriveToLocationからRandomDriveおよびTaskCompleteへの遷移を追加します。変数positionReachedおよびdriveModeを使用して、上記の動作を実装するために必要な。条件)
-
状態エントリアクションを追加して、 positionReachedの値を0に初期化します
。 (2. 状態エントリアクションを追加して、positionReachedの値を0に初期化します。)
PositionReachedのデータ スコープをローカル データに設定します。driveModeはユーザー入力であるため、そのスコープは入力データである必要があります。
タスク3(タスク3)
ランダム掃除機タスクは、壁にぶつかるまで運転し、ランダムな量回転し、衝突/回転シーケンスを繰り返すことで構成されます。バンプ センサーが 50 回以上登録すると、タスクは完了します。(ランダム掃除機タスクは、壁にぶつかるまで運転することで構成されます)壁に
衝突させ、ランダムな量で回転させ、衝突/回転シーケンスを繰り返します。換気センサーが 50 回以上登録すると、タスクは完了します。)
カウンタ、bumpCountに基づいて適切な遷移と条件を追加し、RandomDrive状態に入ると、bumpCountを0に設定します。
シンボルをローカル データとして定義します。
タスク4(タスク4)
「位置への駆動」動作は、次の順序で 3 つのステップで発生します: 正しい方向への純粋な回転、正しい位置への純粋な移動、そして停止 : 正しい方向への純粋な回転、正しい位置への純粋な移動
、そして停止します。)
DriveToLocationのサブステートとして状態PureRotate、PureTranslate、および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に状態エントリアクションを追加して、各状態のvとwに適切な値を設定します。 wに適切な値を設定します。) 2. vとwのスコープを定義して、 Simulink モデルに渡されます(2. Simulink モデルに渡されるように、vとwのスコープを定義します。) 3. Stopにエントリアクションを追加します。
状態をpositionReachedに1
に設定します。 (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 での純粋な回転 (
純粋な回転) で構成されます。
FindWallとRotateRandomに状態エントリアクションを追加して、各状態の速度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