Main Content

占有グリッド

概要

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

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

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

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

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

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

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

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

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

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

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

グリッド座標は占有グリッドの実際の分解能と、障害物の有限の位置を定義します。グリッド座標の原点はグリッドの左上隅で、最初の位置のインデックスが (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.

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

占有グリッド

関数 inflate はインフレーション半径を使用して、"確率インフレーション" を実行します。確率インフレーションは局所的最大値の演算子として機能し、近隣セルの最大の確率値を検出します。関数 inflate はこの定義を使用して、大きい確率値をグリッド全体にインフレートします。このインフレーションによってすべての占有位置のサイズが拡大され、ロボットが障害物を避けてナビゲートするためのバッファー ゾーンが作成されます。この例では、インフレーションが特定の確率値の範囲でどのように機能するかを示します。

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

この例では、inflate メソッドで障害物に確率インフレーションを実行してサイズをインフレートし、障害物の確率が高い領域にバッファー ゾーンを作成する方法を示します。

10 m x 10 m の空のマップを作成します。

map = occupancyMap(10,10,10);

ワールド位置の占有状態を、pvalues の特定の値で更新します。

x = [1.2; 2.3; 3.4; 4.5; 5.6];
y = [5.0; 4.0; 3.0; 2.0; 1.0];

pvalues = [0.2 0.4 0.6 0.8 1];

updateOccupancy(map,[x y],pvalues)
figure
show(map)

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

指定した半径で占有領域をインフレートします。より大きな占有値が、より小さな値を上書きします。前のマップをコピーすることで、不要な変更を元に戻すことができます。

savedMap = copy(map);
inflate(map,0.5)
figure
show(map)

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

確率値の対数オッズ表現

占有グリッドを確率値とともに使用する場合、目標は、リアルタイム ロボット アプリケーションで使用するために障害物の位置の確率を推定することです。occupancyMap クラスは、各セルの確率値の "対数オッズ" 表現を使用します。各確率値は、対応する対数オッズ値に変換されて内部的に保存されます。値は、アクセスすると確率に変換し直されます。この表現によって、確率値が最小の演算で効率的に更新されます。したがって、センサー データを迅速にマップに組み込むことができます。

対数オッズ表現では次の方程式を使用します。

メモ

対数オッズ値は int16 値として保存されます。このデータ型では確率値の分解能が ±0.001 に制限されますが、メモリ サイズは大幅に増加し、より大きなマップを作成できます。

確率の飽和

対数オッズ表現を使用して占有グリッドを観測値で更新する場合、値の範囲は –∞ ~ ∞ になります。この範囲が意味するのは、閉じたドアなどの位置をロボットが複数回観測すると、その位置の対数オッズ値が不必要に大きくなる (値の確率が飽和する) 場合があるということです。その後にドアが開いた場合、ドアが開いているのをロボットが何度も観測しなければ、確率が占有状態からフリーに変化しません。動的な環境では、マップが変化に反応し、動的なオブジェクトをより正確に追跡するようにする必要があります。

この飽和を防ぐには、ProbabilitySaturation プロパティを更新します。このプロパティは、複数の観測値を組み込むときに、許容される最小確率値と最大確率値を制限します。このプロパティは対数オッズ値の上限値と下限値であり、環境の変化に合わせてマップを素早く更新できるようにします。飽和制限の既定の最小値と最大値は [0.001 0.999] です。動的な環境では、推奨値は少なくとも [0.12 0.97] です。複数の観測値に対してマップの更新速度が十分でない場合は、この範囲を変更することを検討してください。

参考

| |

関連するトピック