Main Content

占有グリッド

概要

占有グリッドは、ロボット ワークスペースを離散グリッドとして表すために使用します。環境に関する情報は、センサーからリアルタイムで収集するか、事前情報から読み込むことができます。ロボットの環境における障害物を見つけるためには、一般的にレーザー距離計、衝突センサー、カメラ、深度センサーなどが使用されます。

占有グリッドは、パス計画などのロボティクス アルゴリズムで使用されます (mobileRobotPRM または plannerRRT (Navigation Toolbox) を参照)。また、離散マップ内へのセンサー情報の組み込み、衝突のないパスを探索するためのパス計画、および既知の環境でのロボットの位置推定を目的とした地図作成アプリケーションで使用されます (monteCarloLocalization (Navigation Toolbox) または matchScans (Navigation Toolbox) を参照)。特定のアプリケーションに合わせて、さまざまなサイズと分解能のマップを作成できます。

3 次元占有マップについては、occupancyMap3D (Navigation Toolbox) を参照してください。

2 次元占有グリッドには 2 つの表現があります。

バイナリ占有グリッドは true 値を使用して占有ワークスペース (障害物) を表し、false 値を使用してフリー ワークスペースを表します。このグリッドは、障害物の位置と、ロボットがその空間を通れるかどうかを示します。アプリケーションでメモリ サイズが重要な場合、バイナリ占有グリッドを使用してください。

確率占有グリッドは確率値を使用して、より詳細な地図表現を作成します。この表現が、推奨される占有グリッド使用方法です。このグリッドは、一般的には単に占有グリッドと呼ばれています。占有グリッドの各セルは、セルの占有確率を表す値をもちます。1 に近い値は、セルに障害物が含まれる確かさが高いことを表します。0 に近い値は、セルが占有されておらず障害物がない確かさを表します。確率値によってオブジェクトの忠実度が改善され、特定のアルゴリズム アプリケーションのパフォーマンスが向上します。

バイナリ占有グリッドと確率占有グリッドは、いくつかのプロパティとアルゴリズムの詳細を共有しています。グリッド座標とワールド座標は、両方のタイプの占有グリッドに適用されます。また、インフレーション関数も両方のグリッドに適用されますが、グリッドごとに実装が異なります。対数オッズ表現と確率飽和の効果は、確率占有グリッドにのみ適用されます。

ワールド座標、グリッド座標およびローカル座標

MATLAB® で占有グリッドを扱うときには、ワールド座標、ローカル座標またはグリッド座標のいずれかを使用できます。

ロボットが動作する絶対基準座標系は、占有グリッドで "ワールド座標系" と呼ばれます。大部分の操作はワールド座標系で実行されます。また、ワールド座標系は、このツールボックスで MATLAB 関数を使用するときの既定の選択です。ワールド座標は固定の原点をもつ絶対座標系として使用され、任意の分解能で点を指定できます。しかし、マップ自体のデータ ストレージと分解能に制限があるため、すべての位置はグリッド位置に変換されます。

"ローカル座標系" は、マップを走行しているビークル用のエゴセントリック座標系を指します。GridOriginInLocal プロパティと LocalOriginInWorld プロパティは、ローカル座標系のグリッドの原点と、ワールド座標でのローカル座標系の相対位置を定義します。このローカル座標系は、関数 move を使用して調整できます。ローカル座標系をエゴセントリック マップとして使用して、ビークルの移動とローカル障害物の送信をエミュレートする例については、Create Egocentric Occupancy Maps Using Range Sensors (Navigation Toolbox)を参照してください。

グリッド座標は占有グリッドの実際の分解能と、障害物の有限の位置を定義します。グリッド座標の原点はグリッドの左上隅で、最初の位置のインデックスが (1,1) になります。しかし、MATLAB の占有グリッドの GridLocationInWorld プロパティは、ワールド座標のグリッドの左下隅を定義します。占有グリッド オブジェクトを作成する際、XWorldLimitsYWorldLimits などのプロパティは入力 widthheight、および resolution によって定義されます。次の図に、これらのプロパティと、ワールド座標とグリッド座標の間の関係を示します。

座標のインフレーション

バイナリ占有グリッドと通常の占有グリッドのどちらにも、障害物をインフレートするためのオプションがあります。このインフレーションは、障害物に安全係数を追加し、環境内でロボットと障害物の間にバッファー ゾーンを作成するために使用します。占有グリッド オブジェクトの関数 inflate は、指定された radius を、resolution*radius の値を切り上げたセル数に変換します。各アルゴリズムはこのセル値を別々に使用して、障害物の周りの値を変更します。

バイナリ占有グリッド

関数 inflate は、各占有セルを取り、それぞれの点の周りに占有スペースを追加して直接インフレートします。この基本的なインフレーションの例では、半径値がどのように使用されるかを示します。

バイナリ占有グリッドでの障害物のインフレート

この例では、マップを作成し、障害物の位置を設定して、半径 1 m でインフレートする方法を示します。図における追加のプロットは、グリッド位置の変換に起因するインフレーションとシフトを示すのに役立ちます。

バイナリ占有グリッドを作成します。位置 [5,5] の占有を設定します。

map = binaryOccupancyMap(10,10,5);
setOccupancy(map,[5 5], 1);

マップ上の占有スペースを 1 m インフレートします。

inflate(map,1);
show(map)

Figure contains an axes object. The axes object with title Binary Occupancy Grid, xlabel X [meters], ylabel Y [meters] contains an object of type image.

元の位置と変換されたグリッド位置をプロットし、元の円を描画します。このプロットから、グリッド中心が [5 5] の位置からシフトされ、[4.9 4.9] になったことがわかります。この点から 1 m の円が描画されます。この円に触れるセルがすべて占有状態としてマークされていることに注目してください。図は関連する領域にズーム インされています。

hold on
theta = linspace(0,2*pi);
x = 4.9+cos(theta); % x circle coordinates
y = 4.9+sin(theta); % y circle coordinates
plot(5,5,'*b','MarkerSize',10) % Original location
plot(4.9,4.9,'xr','MarkerSize',10) % Grid location center
plot(x,y,'-r','LineWidth',2); % Circle of radius 1m.
axis([3.6 6 3.6 6])
ax = gca;
ax.XTick = [3.6:0.2:6];
ax.YTick = [3.6:0.2:6];
grid on
legend('Original Location','Grid Center','Inflation')

Figure contains an axes object. The axes object with title Binary Occupancy Grid, xlabel X [meters], ylabel Y [meters] contains 4 objects of type image, line. One or more of the lines displays its values using only markers These objects represent Original Location, Grid Center, Inflation.

上の図からわかるとおり、インフレーション半径とわずかしかオーバーラップしないセルにも占有状態のラベルが付けられます。

参考

| (Navigation Toolbox) | (Navigation Toolbox)

関連するトピック