Simulink を使用した Gazebo での差動駆動型ロボットの制御

この例では、Simulink を使用した Gazebo コシミュレーションで差動駆動型ロボットを制御する方法を説明します。ロボットは、姿勢と車輪エンコーダー位置を読み取って一連の中間点を追従し、ロボットを駆動するトルク制御コマンドを生成します。

この例で使用される仮想マシン (VM) をダウンロードするには、ROS 2 Bouncy および Gazebo を使用する仮想マシンを参照してください。

Gazebo コシミュレーションおよび初回の接続の概要については、Simulink と Gazebo 間のコシミュレーションの実行を参照してください。

VM の実行

ROS 2 Bouncy および Gazebo を使用する仮想マシンからインストールした仮想マシンを開きます。

Gazebo ワールド

この例では、既定の物理設定をもつ単純な地面として VM に指定されているワールド differentialDriveRobot.world を使用します。ワールドは、既定のコントローラーが削除された Pioneer ロボットを使用するため、組み込みコントローラーは Simulink から指定されるトルクと競合しません。Pioneer ロボットは Gazebo の既定のインストールで使用できます。Gazebo プラグインは、Simulink への接続に必要なプラグインを参照します。詳細については、Simulink と Gazebo 間のコシミュレーションの実行を参照してください。

[Gazebo Differential Drive Robot] アイコンをダブルクリックします。

あるいは、ターミナルで次のコマンドを実行します。

cd /home/user/src/GazeboPlugin/export 
export SVGA_VGPU10=0 
gazebo ../world/differentialDriveRobot.world

モデルの概要

モデルを開きます。

open_system('GazeboDifferentialDriveControl') 

モデルには 4 つのセクションがあります。

  • Gazebo Pacer

  • センサー データの読み取り

  • モバイル ロボットの制御

  • 作動データを Gazebo に送信

Gazebo Pacer

このセクションは Gazebo への接続を確立します。GazeboPacer ブロックをダブルクリックしてそのパラメーターを開き、[Gazebo のネットワークおよびシミュレーション設定の構成] リンクをクリックします。これにより、ダイアログが開きます。

VM の [IP アドレス] を指定します。既定で、Gazebo はポート 14581 に接続します。[テスト] ボタンをクリックして Gazebo への接続を確認します。

テストが成功しない場合は、Simulink と Gazebo 間のコシミュレーションの実行の手順を確認し、Gazebo が適切に構成されていて、関連するワールドが実行中であることを確認します。

Gazebo センサーの出力

このセンサーは Gazebo から読み取ったセンサー データを出力し、適切な Simulink のブロックに渡します。XY グラフに現在のロボットの位置がプロットされ、姿勢データがシミュレーション出力に保存されます。

Read Gazebo Sensors サブシステムは、ロボットの姿勢と車輪のセンサー データを抽出します。姿勢データは xy 座標と、方向を示す四元数です。車輪速度は、車輪の回転に伴う車輪位置の変化率に基づいて計算されます。

Mobile Robot Control

Mobile Robot Control セクションは、一連のターゲット中間点、現在の姿勢および現在の車輪速度を受け入れ、中間点を追跡するパスをロボットが追従するために必要な車輪トルクを出力します。

3 つの主要コンポーネントがあります。

Pure Pursuit ブロックは、現在の姿勢に基づいて固定速度で中間点を追従するために必要とされる、車両の車輪速度と回頭角速度を指定するコントローラーです。

MATLAB Function ブロック Set Wheel Speed は、差動駆動型ロボットの運動学を使用して、車両の速度と回頭角速度を左右の車輪速度に変換します。

ϕ˙L=1r(v-𝜔d2)

ϕ˙R=1r(v+𝜔d2)

ϕ˙Lϕ˙R は左右の車輪速度、v は車両速度、𝜔 は車両の回頭角速度、d はトラック幅、r は車輪半径です。さらに、この MATLAB® 関数には車輪速度を調整するコードが含まれています。Pure Pursuit ブロックは全体を通して固定速度を使用するため、MATLAB Function ブロック内には 2 つの if ステートメントがあります。最初のステートメントは、ロボットが特定の距離しきい値内にあるときに、ゴールまでの距離に比例する割合で減速させます。2 番目の if ステートメントは、狭いしきい値内にあるときにロボットを停止させます。これにより、ロボットはスムーズに停止できます。

最後に、Pioneer Wheel Control サブシステムが、比例コントローラーを使用して目的の車輪速度をトルクに変換します。

アクチュエータ トルク コマンド

モデルの最後のセクションは、コントローラーにより出力されたトルク コマンドを受け取り、Gazebo Co-Simulation Library のブロックを使用して Simulink に送信します。

このブロックの各サブシステム内で Bus Assignment ブロックを使用して、ジョイント トルクが正しいジョイントに割り当てられます。

たとえば、上に示されている Left Wheel Gazebo Torque Command サブシステム内で、ApplyJointTorque コマンド タイプの Gazebo Blank Message を使用してバス タイプが指定されます。モデル名およびジョイント名は、Gazebo ワールド内の左車輪に関連付けられたジョイント left_wheel_hinge にリンクされている、Gazebo Select Entity ブロックによって指定されます。トルクは 0.01 秒のステップ時間全体で適用されます。これらの入力は整数として指定しなければならないため、これはナノ秒単位で指定します。バスの出力は Gazebo Apply Command ブロックに渡されます。

ロボットのシミュレーション

モデルを実行するには、中間点を初期化してサンプル時間を設定します。

waypoints = [0 0; 4 2; 3 7; -3 6];
sampleTime = 0.01;

[再生] ボタンをクリックするか、sim コマンドを使用してモデルを実行します。実行中、ロボットが Gazebo 内を移動し、Simulink で観測された姿勢が [XY プロット] により更新されます。

Figure に、一連の中間点と最終的に実行されたロボットのパスがプロットされます。