目次
このパッケージは、ナビゲーション用の高速で補間されたグローバルプランナーの実装を提供します。nav_core :: BaseGlobalPlannerインタフェースに付随するクラスは、 nav_core パッケージに準拠しています。 これは、 NF1 に基づいた navfn パッケージの、より柔軟な代替パッケージとして構築されました。
global_plannerは navfn を元に構成されているため、基本的な処理の流れは同じです。
global_plannerは、グローバルコストマップおよびグローバルコストマップ上の開始位置、目標位置を入力値として、経路を出力します。経路を出力するまでの過程は、以下のようになっています。
ポテンシャル計算を行うセルの探索を行います。探索方式は、 use_dijkstraパラメータ で、 ダイクストラ か A* のどちらかを選択できます。
探索されたセルに対して、ポテンシャル計算を行います。ポテンシャル計算法は、 use_quadraticパラメータ で、 2次方程式 か 単純加算 のどちらかを選択できます。
ポテンシャル計算時に、 ニュートラルコスト値 で底上げし、ポテンシャルマップを作成します。ニュートラルコスト値の扱いは、ダイクストラとA*で異なります。それぞれの計算方法は下記の通りです。
ダイクストラ
下記の条件のいずれかの時に、コスト値の底上げを行う。
- コスト値が 致命的コスト値 - 1 より小さい
- allow_unknownパラメータ がtrue、且つ、コスト値が255
底上げされたコスト値 = コスト値 × cost_factorパラメータ + ニュートラルコスト値
底上げされたコスト値が、 致命的コスト値 以上となった場合は、 致命的コスト値 - 1 を底上げされたコスト値とします。
A*
底上げされたコスト値 = コスト値 + ニュートラルコスト値
目標位置が到達可能である場合は、ポテンシャルマップ上の開始位置から目標位置まで、経路を生成します。経路生成は、use_grid_pathパラメータで、 グリッド経路 か 傾斜経路 を選択できます。
ポテンシャルマップから生成された経路の最後に、入力値をもとに目標位置を補正します。
後処理として orientation_modeパラメータ で、 オリエンテーション を追加することができます。
パラメータの設定値の違いによる、ポテンシャル計算及び経路の違いを以下に示します。 後出の図は、ポテンシャルマップであり、緑点が目標位置、赤点が開始位置で、それを結ぶ緑線は探索結果の経路です。 青色セルから赤色セルへのグラデーションは、経路探索のためにポテンシャル計算を行ったセルで、青色から赤色になるほどポテンシャル値が高くなります。灰色セルは、障害物又は経路探索の対象とならなかったセルです。経路は、ポテンシャル値の高いところ(開始位置)から低いところ(目標位置)に流れるようなイメージで、ポテンシャルマップ上に生成されます。
すべてのパラメータがデフォルトです。
use_grid_path=False
use_quadratic=True
use_dijkstra=True
old_navfn_behavior=False
出典:http://wiki.ros.org/global_planner
use_grid_path=True
グリッド経路は、現在位置の周囲のセル単位でポテンシャル値を評価し、その中でポテンシャル値が最小のものを経路として選択する動作を、目標位置が出現するまで繰り返します。セル単位での評価であるため、計算量は少なくなりますが、経路の軌跡の滑らかさに欠ける場合があります。
出典:http://wiki.ros.org/global_planner
経路はグリッド境界(セルの中心)をたどります。
use_quadratic=False
単純加算は、上下左右のセルのうちポテンシャル値が低いものを選択し、コスト値を加算します。2次方程式より計算量は少なくなりますが、斜め方向の評価が行われません。
出典:http://wiki.ros.org/global_planner
navfnの元のポテンシャル計算は2次方程式であることに注意してください。 2次方程式の計算については、 navfn を参照してください。
use_dijkstra=False
出典:http://wiki.ros.org/global_planner
ポテンシャル計算されたセルがはるかに少ないことに注目してください(色付きの領域で示されています)。これは、ダイクストラを使用するよりも確かに高速ですが、必ずしも同じ経路を生成するわけではありません。もう1つ注意すべき点は、A*の実装は、経路探索時は上下左右に隣接する4つのグリッドに対して計算し展開していきますが、目標位置発見時の開始位置までのトレース時には、上下左右と斜めを含む隣接する8つのグリッドを評価し、経路を生成します。 したがって、A*で探索された経路は、必ずしも最短距離とならない場合があります。 (A*の一般的な実装は、経路探索時にポテンシャル計算を行わなかったグリッドは不要なグリッドと判断し、目標位置発見時のトレースの対象になりません。) ダイクストラの動作とA*の動作の違いを確認するには、後述の例を参考にしてください。
目標位置のセルから上下左右のセルに対してポテンシャル計算を行い対象となるセルを広げていき、各セルで同様にポテンシャル計算を順次行います。開始位置のセルが出現したら、探索を終了します。
出典:http://wiki.ros.org/global_planner
開始位置のセルから上下左右のセルに対してヒューリスティック関数による推定値を加味したポテンシャル計算を行い探索対象となるセルを展開し、その中でコスト値の小さいものからポテンシャル計算を行います。目標位置が出現したら、探索を終了します。グローバルプランナーに実装されているヒューリスティック関数は、下記のとおりです。
ヒューリスティック関数 h(n) = 現在位置X座標と目標位置X座標の距離 + 現在位置Y座標と目標位置Y座標の距離
出典:http://wiki.ros.org/global_planner
後処理ステップとして、方向を経路上の通過点に追加できます。 ~orientation_modeパラメータ(動的再構成)を使用すると、次の方向モードを設定できます。
経路に沿った、進行方向を前向きは正のx軸方向、進行方向に向かって左向きは正のy軸方向とし、それぞれ後ろ向きは負のx軸方向、右向きは負のy軸方向とします。
経路のi番目の通過点の方向は、`i - orientation_window_size`番目の通過点の座標と `i + orientation_window_size` 番目の通過点の座標を使用して計算されます。 ウィンドウのサイズは方向の計算で、なめらかになるように変更できます。
Global planner ROS - Orientation filter
トピック名 | 型 | 内容 |
---|---|---|
~<name>/plan | nav_msgs/Path | 最後に計算された計画。プランナーが経路を計算するたびにパブリッシュされ、主に視覚化の目的で使用されます。 |
パラメータ名 | 内容 | 型 | 単位 | デフォルト |
---|---|---|---|---|
~<name>/allow_unknown | プランナーが未知スペースを横断する計画を作成できるようにするかどうかを指定します。注: ボクセルまたは障害物レイヤー でレイヤー化されたcostmap_2dコストマップを使用している場合、そのレイヤーのtrack_unknown_spaceパラメータもtrueに設定する必要があります。そうしないと、未知スペースがすべて空きに変換されます)。 | bool | - | true |
~<name>/default_tolerance | プランナーの目標位置の許容値。プランナーは、指定された目標にできるだけ近いがdefault_toleranceを超えない計画を作成しようとします。 | double | - | 0.0 |
~<name>/visualize_potential | PointCloud2を介して計算されたポテンシャルエリアを視覚化するかどうかを指定します。 | bool | - | false |
~<name>/use_dijkstra | trueの場合、ダイクストラのアルゴリズムを使用します。それ以外の場合、A*を使用します。 | bool | - | true |
~<name>/use_quadratic | trueの場合、ポテンシャルの2次方程式を使用します。それ以外の場合は、単純加算を使用します。 | bool | - | true |
~<name>/use_grid_path | trueの場合、グリッドの境界をたどる経路を作成します。それ以外の場合は、勾配降下法を使用します。 | bool | - | false |
~<name>/old_navfn_behavior | 何らかの理由でglobal_plannerに navfn の動作を正確に反映させたい場合は、これをtrueに設定します(他のbool型パラメータはデフォルト値を設定します) | bool | - | false |
~<name>/lethal_cost | 致命的コスト値(動的再構成) | int | - | 253 |
~<name>/neutral_cost | ニュートラルコスト値(動的再構成) | int | - | 50 |
~<name>/cost_factor | コストマップの各コストに掛ける係数(動的再構成) | double | - | |
~<name>/publish_potential | trueの場合、ポテンシャル計算後のポテンシャルマップをパブリッシュします。(動的再構成) | bool | - | true |
~<name>/orientation_mode | 各ポイントの方向を設定する方法(None=0、Forward=1、Interpolate=2、ForwardThenInterpolate=3、Backward=4、Leftward=5、Rightward=6)(動的再構成) | int | - | 0 |
~<name>/orientation_window_size | orientation_modeに基づいて方向を決定するためのオリエンテーション計算時に使用するウィンドウ範囲(動的再構成) | int | - | 1 |
~<name>/planner_window_x | (ROSWiki未掲載)未使用 | double | - | 0.0 |
~<name>/planner_window_y | (ROSWiki未掲載)未使用 | double | - | 0.0 |
~<name>/publish_scale | (ROSWiki未掲載)パブリッシュのスケール | int | - | 100 |