最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

ROS 対応ロボットのフィードバック制御

この例では、Simulink® を使用して、別の ROS ベースのシミュレーターで実行中のシミュレートされたロボットを制御する方法を説明します。

はじめに

この例では、シンプルな閉ループ比例コントローラーを実装するモデルを実行します。コントローラーはシミュレートされたロボット (別の ROS ベースのシミュレーターで実行中) から位置情報を受信し、速度コマンドを送信してロボットを指定位置まで駆動します。モデルの実行中にいくつかのパラメーターを調整し、シミュレートされたロボットでの効果を観察します。

次の図は、Simulink とロボット シミュレーターとの相互作用をまとめたものです (図内の矢印は ROS メッセージの伝送を示す)。"/odom" トピックは位置情報を伝え、"/mobile_base/commands/velocity" トピックは速度コマンドを伝えます。

タスク 1 - ロボット シミュレーターの起動と Simulink の構成

Simulink® から ROS 対応ロボットへの接続の例の手順に従って以下を行います。

  • MATLAB® または Gazebo® ロボット シミュレーターの起動

  • ROS ネットワークに接続する Simulink の構成

タスク 2 - 既存のモデルを開く

ROS ネットワークに接続した後、モデル例を開きます。

open_system('robotROSFeedbackControlExample.slx');

モデルは差動駆動型の移動ロボットの比例コントローラーを実装します。各タイム ステップで、アルゴリズムによりロボットは目的の場所へと向きを変え、前方に駆動されます。目的の場所に到達すると、アルゴリズムによりロボットが停止します。

open_system('robotROSFeedbackControlExample/Proportional Controller');

モデルには 4 つの調整可能なパラメーター (色付きブロックで表示) があります。

  • 目的の位置 (モデルの最上位): 目的の場所の (X,Y) 座標

  • 距離のしきい値: 目的の場所からこの距離以内に近づくとロボットが停止

  • 線形速度: ロボットの前進の線形速度

  • ゲイン: ロボットの向きを修正するときの比例ゲイン

モデルにはまた、Simulation Rate Control ブロックがあります (モデルの最上位)。このブロックにより、シミュレーションの更新間隔が実際の経過時間に必ず従うようになります。

タスク 3 - モデルの実行

このタスクでは、モデルを実行し、ロボット シミュレーターでロボットの動作を観察します。

  • Simulink モデルとロボット シミュレーターの両方を観察できるように、画面にウィンドウを配置します。

  • Simulink の [再生] ボタンをクリックしてシミュレーションを開始します。

  • シミュレーションの実行中に Desired Position ブロックをダブルクリックして、[Constant] の値を [2 3] に変更します。ロボットの進行方向の変化を観察します。

  • シミュレーションの実行中に Proportional Controller サブシステムを開き、Linear Velocity (slider) ブロックをダブルクリックします。スライダーを 2 に動かします。ロボットの速度上昇を観察します。

  • Simulink の [停止] ボタンをクリックしてシミュレーションを停止します。

タスク 4 - 受信メッセージのレートの観察

このタスクでは、MATLAB ベースのシミュレーターを使用して受信メッセージのタイミングとレートを観察します。

  • 既存のロボット シミュレーターの Figure ウィンドウをすべて閉じます。

  • Simulink の [再生] ボタンをクリックしてシミュレーションを開始します。

  • Scope ブロックを開きます。Subscribe ブロックの IsNew 出力が常にゼロであることを観察します。これは、/odom トピックのメッセージがまったく受信されていないことを示します。プロットの横軸はシミュレーション時間を示します。

  • MATLAB コマンド ラインに ExampleHelperSimulinkRobotROS と入力して、MATLAB ベースのロボット シミュレーターを起動します。このシミュレーターは、実際の経過時間において約 20 Hz で /odom メッセージをパブリッシュします。

  • スコープ表示で、IsNew 出力が、実際の経過時間 1 秒あたり約 20 回のレートで値 1 を取ることを確認してください。

実時間との同期は、Simulation Rate Control ブロックによるものです。通常、Simulink シミュレーションはフリーランのループを実行し、その速度はモデルの複雑度と計算速度によって決まります (シミュレーション ループ フェーズ (Simulink)を参照)。Simulation Rate Control ブロックは、可能な限り、実時間で 0.02 秒 (これはモデルの基本サンプル時間と等しい) ごとに更新が行われるように Simulink の実行を調整しようとします。詳細については、ブロック内のコメントを参照してください。

さらに、Proportional Controller と Command Velocity Publisher の Enabled Subsystem により、真に新しいメッセージにのみモデルが反応するようになります。Enabled Subsystem を使用しない場合、モデルは同じ (最後に受信した) メッセージを何度も繰り返して処理するため、コマンド メッセージの無駄な処理と冗長なパブリッシュが行われることになります。

まとめ

この例では、シミュレートされるロボットのシンプルな閉ループ制御に Simulink を使用する方法を説明しました。また、Enabled Subsystem を使用して ROS ネットワークのオーバーヘッドを削減する方法も説明しました。