倉庫内での A* パス計画と障害物回避
この例は、Gazebo を使用した倉庫内でのモバイル ロボットのシミュレーションの例の拡張です。例では、障害物を回避するために A* プランナーで PRM パス プランナーを変更し、Vector Field Histogram (VFH) アルゴリズムを追加することを説明します。
前提条件
Gazebo を使用した倉庫内でのモバイル ロボットのシミュレーションの例を確認して、検出と作動の要素を設定。この例では、バーチャル マシン (VM) をダウンロードして使用し、シミュレートされるロボットを設定する方法を扱います。
倉庫ロボットのタスクの実行の例で、倉庫シナリオのパス計画と移動のワークフローを確認。
モデルの概要
このモデルには、倉庫ロボットのタスクの実行の例からの主な変更点が 2 つあります。目標は、使用するパス プランナー アルゴリズムを置き換えて、環境内で障害物を回避するコントローラーを追加することです。
MATLAB® Function ブロック "Planner" は、plannerAStarGrid
(Navigation Toolbox)オブジェクトを使用して A* パス計画アルゴリズムを実行するようになっています。
"Obstacle Avoidance" サブシステムは、"Vector Field Histogram" ブロックをコントローラーの一部として使用するようになっています。rangeReadings
関数ブロックは、受信データが空でない場合は距離と角度を出力します。その後 VFH ブロックは、スキャン範囲内の障害物に基づいてステアリング方向を生成します。障害物が近い場合、ロボットは向きを変えて回避する必要があります。障害物回避のパフォーマンスを変えるには、VFH のパラメーターを調整します。
open_system("aStarPathPlanningAndObstacleAvoidanceInWarehouse.slx");
設定
倉庫施設
例のマップ ファイル map
を読み込みます。これは、倉庫内の占有スペースを示す logical 値の行列です。この行列を反転させてフリー スペースを示し、binaryOccupancyMap
オブジェクトを作成します。1 メートルあたり 100 セルの分解能を指定します。
マップは、VM に読み込まれる obstacleAvoidanceWorld.world
に基づいています。PNG ファイルは、collision_map_creator_plugin
プラグインでマップ行列として使用するために生成されました。詳細については、Collision Map Creator Plugin を参照してください。
close figure("Name","Warehouse Map","Visible","on") load exampleHelperWarehouseRobotWithGazeboBuses.mat load helperPlanningAndObstacleAvoidanceWarehouseMap.mat map logicalMap = map.getOccupancy; mapScalingFactor = 100; show(map)
倉庫内にある充電ステーション、仕分けステーションおよび棚近くの荷降ろし場所の xy 位置を割り当てます。選択された値は、Gazebo のシミュレートされたワールドに基づいています。
chargingStn = [2, 13]; loadingStn = [15, 5]; unloadingStn = [15, 15];
マップ上にさまざまな位置を表示します。
hold on; localOrigin = map.LocalOriginInWorld; localTform = trvec2tform([localOrigin 0]); text(chargingStn(1), chargingStn(2),1,'Charging'); plotTransforms([chargingStn, 0],[1 0 0 0]) text(loadingStn(1), loadingStn(2),1,'Loading 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;
シミュレーション
シナリオをシミュレートするには、Gazebo への接続を設定します。
まず、Gazebo シミュレーターを実行します。バーチャル マシンで、[Gazebo Warehouse Robot with Obstacles] アイコンをクリックします。Gazebo シミュレーターが開かない場合は、プラグインの再インストールが必要となることがあります。Simulink と Gazebo 間のコシミュレーションの実行の「Gazebo プラグインの手動インストール」を参照してください。
Simulink で、Gazebo Pacer ブロックを開いて [Gazebo のネットワークおよびシミュレーション設定の構成] をクリックします。[ネットワーク アドレス] を [カスタム] にして、Gazebo シミュレーションの [ホスト名/IP アドレス] を指定し、[ポート] を 14581
(Gazebo の既定のポート) に指定します。VM のデスクトップに IP アドレスが表示されます。
Gazebo に接続してコシミュレーションを有効にする場合の詳細については、Simulink と Gazebo 間のコシミュレーションの実行を参照してください。
モデルの上部にある [モデルの初期化] ボタンをクリックして、上記で宣言したすべての変数を初期化します。
シミュレーションを "実行" します。ロボットは環境内を走行し、予期していなかった障害物を回避します。
sim("aStarPathPlanningAndObstacleAvoidanceInWarehouse.slx");
占有マップには存在しない円柱形の障害物が 2 つあることに注意してください。この場合も、VFH アルゴリズムを使用して検出されると、ロボットはそれらを回避します。
ロボットが障害物の回避を試みているとき、緑色のランプ AvoidingObstacle が点灯します。