Main Content

Gazebo を使用した倉庫内でのモバイル ロボットのシミュレーション

この例では、Gazebo で倉庫ロボットをシミュレートする方法を説明します。Gazebo により、シミュレーション環境で特定のタスクを実行しながら、距離センサーを使用するモバイル ロボットをシミュレートすることが可能になりました。この例では、シミュレーターを使用して、倉庫のシナリオでロボットがパッケージを配達する倉庫ロボットのタスクの実行の例を適用する方法を詳細に説明します。ロボットは、Gazebo のシミュレートされた距離センサーを利用して、動的環境での衝突の可能性を検出し、衝突を回避します。

前提条件

モデルの概要

モデルを開きます。

open_system('simulateWarehouseRobotInGazebo.slx')

モデルは次の要素に分けることができます。

  • 検知: Gazebo のセンサーからデータを読み取ります。

  • スケジュール: パッケージを配達するロボットに、パッケージを割り当ててそのパスを計画します。

  • 制御: 事前定義されたパスに追従して障害物を避けるためのコマンドを生成します。

  • 作動: 環境内でロボットを作動させるコマンドを Gazebo に送信します。

スケジュール

ロボットは、充電ステーション、荷積みステーション、荷降ろしステーションの間を移動するタスクをスケジューラに従って実行します。

検知

現在のロボットの姿勢、車輪速度、および距離センサーの読み取り値が、Gazebo のシミュレーション環境から読み取られます。以下の図は、Read From Gazebo Sensors サブシステムの展開ビューです。

制御

コントローラーは、Pure Pursuit ブロックを使用してウェイポイントに追従するための制御コマンドを生成します。ロボット上の距離センサーがしきい値 avoidCollisionDistance 内に障害物を検出した場合、ロボットは停止します。また、ロボットは、ゴールに十分に近付いたときにも停止します。

作動

生成された制御コマンドに基づいて、"Pioneer Wheel Control" サブシステムが各車輪のトルク値を生成します。トルクは ApplyJointTorque コマンドとして適用されます。

設定

倉庫施設

例のマップ ファイル map を読み込みます。これは、倉庫内の占有スペースを示す logical 値の行列です。この行列を反転させてフリー スペースを示し、binaryOccupancyMap オブジェクトを作成します。1 メートルあたり 100 セルの分解能を指定します。

マップは、Building Editor を使用して、下記と同じスケーリング係数で作成された warehouseExtensions.world ファイルに基づいています。マップの .png ファイルは、collision_map_creator_plugin プラグインを使用してマップ行列を生成することで作成できます。プラグインのインストール方法の詳細については、Collision Map Creator Plugin を参照してください。

mapScalingFactor = 100;
load gazeboWarehouseMap.mat map
logicalMap = ~map;
map = binaryOccupancyMap(logicalMap,mapScalingFactor);
show(map)

倉庫内にある充電ステーション、仕分けステーションおよび棚近くの荷降ろし場所の xy 位置を割り当てます。選択された値は、Gazebo のシミュレートされたワールドに基づいています。

chargingStn = [12,5];
loadingStn = [24,5];
unloadingStn = [15,24];

マップ上にさまざまな位置を表示します。

hold on;

text(chargingStn(1), chargingStn(2), 1, 'Charging');
plotTransforms([chargingStn, 0], [1 0 0 0])

text(loadingStn(1), loadingStn(2), 1, 'Sorting Station');
plotTransforms([loadingStn, 0], [1 0 0 0])

text(unloadingStn(1), unloadingStn(2), 1, 'Unloading Station');
plotTransforms([unloadingStn, 0], [1 0 0 0])

hold off;

距離センサー

Sensing セクションの Read Lidar Scan ブロックは、シミュレートされた距離センサーから距離の値を読み取るために使用されます。warehouseExtensions.world ファイルには、シーン内のさまざまなモデルおよびアクター (倉庫の作業員) の詳細が含まれています。<actor> タグはビジュアル メッシュのみを含む静的リンクであるため、距離センサーのセンサー タイプは gpu_ray です。

また、距離センサーは 640 の範囲を使用しますが、既定値は 128 です。このため、Read Lidar Scan ブロック内で使用されるバスを変更する必要があります。exampleHelperWarehouseRobotWithGazeboBuses.mat ファイルを読み込んで、Gazebo_SL_Bus_gazebo_msgs_LaserScan.range が 640 に設定された変更済みのバスを取得します。変更済みのバスは、型エディターを使用して .mat ファイルに保存されています。

load exampleHelperWarehouseRobotWithGazeboBuses.mat

衝突回避

ワールド内のアクターは、事前定義された軌跡を歩いています。ロボットは、距離センサーを利用して、角度範囲 [-pi/10, pi/10] で 2.0 m (avoidCollisionDistance) の範囲内に障害物があるかどうかをチェックします。その範囲およびビュー内で読み取り値がゼロ以外になると、ロボットは停止し、範囲がクリアになった場合にのみ再開します。"Stop Robot On Sensing Obstacles" 関数ブロックにこのロジックが組み込まれています。

シミュレーションの実行中に、続行しても問題ないことをロボットが検知すると、停止ランプが緑になります。停止した場合、ランプは赤になります。

avoidCollisionDistance = 2; 

シミュレーション

シナリオをシミュレートするには、Gazebo への接続を設定します。

まず、Gazebo シミュレーターを実行します。バーチャル マシンで、[Gazebo Warehouse Robot] アイコンをクリックします。Gazebo シミュレーターが開かない場合は、プラグインの再インストールが必要となることがあります。Simulink と Gazebo 間のコシミュレーションの実行の「Gazebo プラグインの手動インストール」を参照してください。

Simulink で、Gazebo Pacer ブロックを開いて [Gazebo のネットワークおよびシミュレーション設定の構成] をクリックします。[ネットワーク アドレス][カスタム] にして、Gazebo シミュレーションの [ホスト名/IP アドレス] を指定し、[ポート]14581 (Gazebo の既定のポート) に指定します。VM のデスクトップに IP アドレスが表示されます。

Gazebo に接続してコシミュレーションを有効にする場合の詳細については、Simulink と Gazebo 間のコシミュレーションの実行を参照してください。

モデルの上部にある [モデルの初期化] ボタンをクリックして、上記で宣言したすべての変数を初期化します。

シミュレーションを "実行" します。ロボットは環境内を走行し、定義済みのしきい値内に作業員が入るたびに停止します。