A*ナビゲーションの使用
概要
A*(「Aスター」と発音します)ナビゲーションツールを使用して、タスク実行者の移動バリアを作成できます。A*システムに接続した固定リソースも、直接通過できないバリアとして扱われます。タスク実行者があるポイントから別のポイントへ移動する必要がある場合、A*ナビゲータはこれらのバリアと固定リソース周辺の移動しきい値を使用して、2つのポイント間の最短距離を計算します。
このトピックを読む前に、「移動に関する主要な概念」で説明されている概念について理解しておいてください。このトピックでは、A*ナビゲーションの仕組みの大まかな概要について説明します。
このトピックの残りの部分では、A*ナビゲーションシステムの構築に必要なさまざまなタスクの実行方法について説明します。
3DオブジェクトをA*ナビゲータに接続する
モデルにA*ナビゲータを追加したら、ナビゲーションシステムを使用するすべてのタスク実行者にA*ナビゲータを接続する必要があります。また、タスク実行者が通り抜けられないバリアとして扱われるべき固定リソースをモデルに追加する必要があります。
3DオブジェクトをA*ナビゲータに接続するには:
- 固定リソース間に入出力ポート接続(A接続)を作成するのと同じ方法で、A*ナビゲータを3Dオブジェクトに接続できます。ツールバーの[オブジェクトを接続]ボタン をクリックして、メニューを開きます。メニューから[オブジェクトを接続]を選択して接続モードをオンにします。
- 接続モードに入ると、マウスポインターが、チェーンリンクシンボルが横に付いたプラス記号()に変わります。
- 接続モードになったら、[AStar Navigator]をクリックします。マウスを動かすと、ナビゲータとカーソルの間に黄色の線が表示されます。
- 3Dオブジェクトをクリックしてナビゲータに接続します。接続されると、接続されたオブジェクトの下に紫色のスペースが表示されます。
- ナビゲータをオブジェクトに接続した後も、接続モードは継続します。接続モードを終了する必要がある場合は、Escを押すか、モデル内の空白部分を右クリックします。それ以外の場合は、必要に応じて引き続きネットワークノードを接続できます。
ディバイダーとバリアを追加する
タスク実行者が回避して移動するようになる障害を作成するために、3Dモデルにディバイダーやバリアを追加できます。次の例に示すように、ディバイダーは壁のように機能します。
バリアはグリッド内の全エリアを制限することができます。
ディバイダーを追加する
モデルにディバイダーを追加するには:
- ライブラリの[A*ナビゲーション]グループで、[ディバイダー]オブジェクトをクリックしてディバイダー作成モードに入ります。ディバイダー作成モードでは、マウスポインターが[ディバイダー]アイコン に変わります。
- シミュレーションモデル内で、ディバイダーを配置する位置を見つけます。モデル内のその位置をクリックし、マウスポインターを別の方向に動かすと、ディバイダーの作成が始まります。ディバイダーの端が、開始位置を基準にして希望するおおよその長さ、角度、半径になるまで、マウスポインターの位置を調整します。マウスをもう一度クリックすると、ディバイダーの作成が終了します。
- 必要に応じて、終点と接続点を動かしてディバイダーの長さ、角度、または半径を変更できます。
- Escを押すか、モデル内の空白部分を右クリックして、ディバイダー作成モードを終了します。
バリアを追加する
モデルにバリアを追加するには:
- ライブラリの[A*ナビゲーション]グループで、[バリア]オブジェクトをクリックしてバリア作成モードに入ります。バリア作成モードでは、マウスポインターが[バリア]アイコン に変わります。
- シミュレーションモデル内で、バリアを配置する位置を見つけます。モデル内のその位置をクリックすると、赤いひし形が表示されます。マウスポインターを別の方向に動かすと、バリアの作成が始まります。バリアが希望するおおよその長さと幅になるまで、マウスポイントを移動します。マウスをもう一度クリックすると、ディバイダーの作成が終了します。
- 必要に応じて、バリアの赤いサイズ変更矢印をクリックして、バリアの長さまたは幅を変更できます。
- Escを押すか、モデル内の空白部分を右クリックして、バリア作成モードを終了します。
バリア移動パターンを定義する
デフォルトのバリアは、誰も進入できない堅固なバリアです。ただし、1つ以上の移動パターンのエリアとしてバリアを定義することもできます。たとえば、バリアの内側にいる間は移動者が一方向にしか移動できないようにバリアを定義できます。もう1つの例として、バリアの右側にいるときは移動者が一方向に、バリアの左側にいるときは反対方向に移動するようにバリアを設定できます。
バリア移動パターンを定義するには:
- 上記のようにバリアを作成します。
- バリアをクリックします。いくつかの操作ハンドルが表示されます。
- 特定のパターンを定義するには、バリアの中央にある4つの矢印のうち1つ以上をクリックします。これで矢印の色が緑色に変わり、その方向への移動が許可されていることを示します。
- バリア内に複数の別々のパターンエリアを定義するには、バリアの端にあるはさみアイコンをクリックします。これにより、エリアが2つの別々のエリアに分割され、それぞれ中央に独自の4つのパターン矢印が表示されます。次に矢印をクリックして、各エリアの移動パターンを定義します。
- パターンエリアのサイズを変更するには、分割線をクリックして移動するか、バリアの端の分割線の上に表示されている赤いサイズ調整矢印を使用します。
- 作成されたエリアを削除するには、バリアの端にある統合ボタンをクリックして、隣接する2つのエリアを統合します。
一方向のディバイダーを追加する
ディバイダーは一方向のディバイダーにできます。つまり、タスク実行者は一方向ではディバイダーを通過できますが、逆の方向には通過できません。一方向のディバイダーの上の緑色の矢印は、タスク実行者が移動できる方向を示しています。
一方向のディバイダーの追加は、通常のディバイダーを追加するのと同じ方法で行います。ディバイダーを作成したらオブジェクトをクリックし、[クイックプロパティ]で[双方向]のチェックを外します。
移動しきい値のトラブルシューティング
このセクションを読む前に、A*移動しきい値に関する主要な概念を読んで、それらがどのように機能するかを理解しておく必要があります。
A*ナビゲーションで発生する可能性がある最も一般的な問題の1つは、タスク実行者がグリッドの予想外の場所に移動したり、固定リソースに向かって不自然なルートをたどったりすることです。通常、これはバリアやディバイダーを超えて広がる移動しきい値の問題が原因となります。
この問題を解決するには:
- 3Dモデルの[AStar Navigator]をダブルクリックして、プロパティウィンドウを開きます。
- [ビジュアル]タブで[移動のしきい値を表示]チェックボックスをオンにします。
- [OK]をクリックして変更を保存し、プロパティウィンドウを閉じます。
- シミュレーションコントロールバーで、[リセット]ボタンを押してビジュアルの変更を適用します。
- バリアやディバイダーの近くにある固定リソースをクリックして選択します。オブジェクトの計算されたパスゾーン(赤い点)がバリアやディバイダーを超えていないことを確認します。次の画像は、赤い点が横のディバイダーを超えているオブジェクトの例を示しています。
- 赤い点がディバイダーまたはバリアの適切な側面に含まれるまで、固定リソースを再配置します。
優先パスを追加する
A*アルゴリズムが、タスク実行者があるポイントから別のポイントに到達するために使用する最も効率的なパスを計算しているとき、優先パスは特定のパスにより大きな重みを与えます。優先パスでは、ディバイダーとバリアを横断するパスも作成されます。
次の画像は、優先パスが適用される前のタスク実行者の移動パスを示しています。
お分かりのように、タスク実行者はキューからプロセッサに到達するために上位のパスをたどります。代わりに、タスク実行者に低位のパスを選択させたい場合があるかもしれません。優先パスを追加して、そのロジックを作成できます。
優先パスは磁石のように少しだけ機能することに注意してください。タスク実行者は、優先パスがタスク実行者の現在の移動の軌跡に影響するほど十分に近い場合にのみ優先パスを使用します。タスク実行者が近づくと、移動計算に優先パスを組み込み始めます。
前の画像でも、タスク実行者は一方向に移動するときに優先パスのみを使用しています。タスク実行者が両方向に進むように使用するには、反対方向に進む2番目の優先パスを追加する必要があります。
優先パスを追加するには:
- ライブラリの[A*ナビゲーション]グループで、[優先パス]オブジェクトをクリックして優先パス作成モードに入ります。優先パス作成モードでは、マウスポインターが[優先パス]アイコン に変わります。
- シミュレーションモデル内で、優先パスを配置する位置を見つけます。モデル内のその位置をクリックし、マウスポインターを別の方向に動かすと、優先パスの作成が始まります。優先パスの端が、開始位置を基準にして希望するおおよその長さ、角度、半径になるまで、マウスポインターの位置を調整します。マウスをもう一度クリックすると、優先パスの作成が終了します。
- Escを押して優先パス作成モードを終了します。
- 必要に応じて、終点と接続点を動かして優先パスの長さ、角度、または半径を変更できます。
ブリッジを追加する
ブリッジは、必要に応じてオペレーターがバリアを通過できるようにするために使用できます。シミュレーションの観点では、これは、タスク実行者が階段やその他の種類のブリッジを使用してバリアを越えて移動することを表すことができます。
次の画像は、パスに過剰なバリアを配置してタスク実行者が目的地に到達できないようにした場合に、A*システムで起きることを示しています。
タスク実行者は、目的地に最も近いと思われるポイントに到達すると、到着したと見なされることに注意してください。プロセッサにあまり近くなくても、プロセッサでアイテムをアンロードします。タスク実行者をプロセッサに近づけたい場合は、ブリッジを追加できます。
ただし、今度はタスク実行者がディバイダーの反対側に閉じ込められていることに注意してください。ブリッジは一方向にしか動かないため、タスク実行者はトラップされます。この問題を解決するには、別の方向に向かう2つ目のブリッジを追加します。
ブリッジを作成するには:
- ライブラリの[Aナビゲーション]グループで、[ブリッジ]オブジェクトをクリックしてブリッジ作成モードに入ります。ブリッジ作成モードでは、マウスポインターが[ブリッジ]アイコン に変わります。
- シミュレーションモデル内で、ブリッジを配置する位置を見つけます。モデル内のその位置をクリックし、マウスポインターを別の方向に動かすと、ブリッジの作成が始まります。ブリッジの端が、開始位置を基準にして希望するおおよその長さ、角度、半径になるまで、マウスポインターの位置を調整します。マウスをもう一度クリックすると、ブリッジの作成が終了します。
- Escを押してブリッジ作成モードを終了します。
- 必要に応じて、終点と接続点を動かしてブリッジの長さ、角度、または半径を変更できます。
強制パスを追加する
強制パスは、移動者がシステム内の指定されたパスに沿ってのみ移動するよう強制するために使用できます。たとえば、人と無人搬送車(AGV)の両方を含む移動エリアがあるとします。人には通常、指定された移動経路がありませんが、AGVにはこれが必要です。ここでの選択肢の1つは、AGVにはAGVモジュールを使用し、人にはA*を使用することです。ただし、このオプションの問題は、AGVトラフィックは人のトラフィックを認識できず、人のトラフィックはAGVトラフィックを認識できないことです。したがって、オブジェクトは互いの上を走ることがあります。あるいは、A*移動エリアで強制パスを定義し、AGVに強制パスのみを移動するように指示することで、AGVの指定パスをシミュレーションすることもできます。AGVと人が同じA*移動グリッドを共有するため、お互いを認識し回避できるようになります。
強制パスを作成するには:
- ライブラリの[A*ナビゲーション]グループで、[強制パス]オブジェクトをクリックして強制パス作成モードに入ります。強制パス作成モードでは、マウスポインターが[強制パス]アイコン に変わります。
- シミュレーションモデル内で、強制パスを配置する位置を見つけます。モデル内のその位置をクリックし、マウスポインターを別の方向に動かすと、強制パスの作成が始まります。パスの終点が開始位置を基準にして希望するおおよその長さと角度になるまでマウスポインターの位置を調整します。マウスをもう一度クリックすると、ブリッジの作成が終了します。
- Escを押して強制パス作成モードを終了します。
- 必要に応じて、終点と接続点を動かしてブリッジの長さ、角度、または半径を変更できます。
- 強制パスを追加したら、どの移動者が強制パスでのみ移動するかを指定する必要があります。これを行うには、A*ネットワークに追加されているタスク実行者をクリックします。右側の[クイックプロパティ]パネルの[A*移動者]の下にある[必須パスの使用]チェックボックスをオンにします。
エレベーターバンクを追加する
エレベーターバンクでは、施設の各階の間で人を動かすエレベーターのバンクをシミュレートできます。A*のコンテキストでのエレベーターバンクは、z軸に沿って垂直方向に積み重ねられた複数のA*グリッド間をつなぐ特別なブリッジを実装したものです。ある階/グリッドから別の階/グリッドに移動しようとする移動者は、エレベーターバンクに移動し、エレベーターバンクに対してリクエストを行います。エレベーターは、移動者のいる階に移動し、移動者をピックアップして、目的階に運びます。
エレベーターバンクを作成するには:
- まず、垂直方向に積み重ねた複数のA*グリッドを作成します。ライブラリの[A*ナビゲーション]グループで、[グリッド]オブジェクトをクリックしてグリッド作成モードに入ります。グリッド作成モードでは、マウスポインターが[グリッド]アイコン に変わります。
- 1階にA*グリッドがすでにある場合(A*のバリアやディバイダーなどが青い長方形の境界で囲まれている場合)は、このステップをスキップしてください。最初のグリッドを作成するために、シミュレーションモデル内で、グリッドの1つのコーナーの配置先を見つけます。モデル内のその位置をクリックし、マウスポインターを別の方向に動かすと、グリッドの作成が始まります。モデル内の必要なエリアをグリッドが囲むまで、マウスポインターを移動します。マウスをもう一度クリックすると、グリッドの作成が終了します。
- ビューのグリッドZをZ方向上部に向かって移動します。まず、モデル内の空白部分をクリックします。次に、[クイックプロパティ]の[ビュー設定]ペインで、[グリッド Z]の値を2階のz位置(たとえば5メートル上)に変更します。これにより、モデルの表示やオブジェクトの作成などに使用する「基準点」が変わります。
- 同様に、2階のグリッドの1つのコーナーを配置する場所をシミュレーションモデルから見つけます。モデル内のその位置をクリックし、マウスポインターを別の方向に動かし始めると、2階で新しいグリッドの作成が始まります。モデル内の必要なエリアをグリッドが囲むまで、マウスポインターを移動します。マウスをもう一度クリックすると、グリッドの作成が終了します。
- ビューのグリッドZの設定を戻すために、モデル内の空白部分をクリックし、[クイックプロパティ]でビューの[グリッド Z]を「0」に変更します。
- ここで、エレベーターバンクを作成します。ライブラリの[人]グループで、新しい[エレベーターバンク]オブジェクトをモデルにドラッグします。このオブジェクトのx軸を延長して、バンクに含まれるエレベーターの数を増やします。
- 標準のA接続モードを使用してエレベーターバンクをモデル内のA*ナビゲータオブジェクトに接続し、そのエレベーターバンクをA*ネットワークに組み込みます。
コントロールエリアを追加する
コントロールエリアを使用して、指定されたエリアで許可された移動者の数を制限することもできます。これまで、コントロールエリアはAGVシステムに使用されてきましたが、A*ネットワークでも使用できるように拡張されました。
A*移動制限のコントロールエリアを追加するには、以下のいずれかの手順を実行してください。
- [コントロールエリア]をライブラリの[A*ナビゲーション]カテゴリからドラッグします。
- モデル内の既存の任意のコントロールエリアの[A* メンバー]プロパティにチェックを入れます。この操作により、A*ネットワークがコントロールエリアを認識するようになり、その結果としてオブジェクトの境界内でのA*移動が制限されます。
モデルにコントロールエリアを追加したら、制限したいエリアを囲むようにその場所、サイズ、回転を調整し、[最大割り当て]プロパティをそのエリアで許可したい移動者の最大数に設定します。この操作により、A*ネットワークでそのエリア内の移動者数が制限されるようになります。
A*表示のオンまたはオフ
A*ナビゲーションシステムを構築し、それが正しく機能することを確認したら、システムの表示をオフにしてモデルのビジュアルを簡潔にすることをお勧めします。A*表示をオフにするには:
- 3Dモデルの[AStar Navigator]をダブルクリックして、プロパティウィンドウを開きます。
- 必要に応じて[ビジュアル]タブで、すべてのチェックボックスをオフにします。
大規模なタスク実行者を操作する
トランスポーターなどの大きなタスク実行者を使用している場合は、タスク実行者が実際にはA*グリッド上の1つの正方形よりも大きい可能性があることに注意が必要です。FlexSimは、中心点に基づいてタスク実行者がどの正方形にいるのか判断します。移動グリッドのサイズによっては、3Dビジュアルに関して不自然な問題が発生することがあります。
これらの問題は、衝突回避を使用するときに特に明らかになるかもしれません。A*ナビゲータは、移動者が移動している個々の正方形のみに基づいて衝突回避を計算します。つまり、移動者のサイズが2つ以上の正方形を占める場合、この余分なサイズは衝突回避メカニズムにより無視され、一部の移動者が重なり合う可能性があることになります。正方形のサイズを小さくして移動を正確にすることと、正方形のサイズを大きくして衝突回避を改善することの間の適切なバランスを決める必要があります。