メインコンテンツまでスキップ

追加理論

ビジョンターゲット

FRCのゲームデザイナーは、フィールドの戦略的な場所に反射性の「ビジョンターゲット」を配置することがよくあります。これらのビジョンターゲットは通常、再帰反射テープで作られています。主要な得点要素には一般的に、自動照準に使用できるビジョンターゲットがあります。以下は、2016年と2017年のFRCゲームのビジョンターゲットの例です。

ビジョンターゲットの例

これらの再帰反射ビジョンターゲットには非常に便利な特性があります:光を当てると、光源に向かって直接反射します。これが、Limelightのカメラレンズの周りに明るい緑色のLEDがある理由です。ターゲットに向けて明るい緑色の光を発しながらカメラの露出を非常に低く設定することで、ほとんど黒で明るい緑色のビジョンターゲットだけが映る画像を取得できます。これにより、ターゲットの取得が比較的簡単になります。

以下は理想的な画像の例です。低露出設定により画像のほとんどの詳細が失われていますが、再帰反射テープは明るく目立っていることに注目してください。

ビジョンターゲットの例2


閾値処理

閾値処理は、ほとんどのFRCビジョントラッキングアルゴリズムの次の重要な要素です。これは、画像を取得し、特定の色範囲にないピクセルをすべて破棄する処理です。閾値処理の結果は一般的に、ピクセルが「オン」か「オフ」のいずれかである1次元画像になります。閾値処理は、上記の戦略(低露出、明るく照らされたビジョンターゲットを持つ非常に暗い画像)を使用してキャプチャされた画像に非常に効果的です。

LimelightはHSV(色相-彩度-明度)色空間で閾値処理を行います。RGB(赤-緑-青)色空間で色を考えることに慣れているかもしれません。HSVは、直交座標や極座標が位置を表すのに使用できるのと同様に、色を表現する別の方法です。HSV色空間を使用する理由は、色相を使用してLimelightのLEDが出力する緑色を非常に厳密に選択できるからです。

HSV画像

閾値設定を調整して、画像からできるだけ多くのものを除去することが重要です。ビジョンパイプラインの各段階を最適化してから次の段階に進むと、最良の結果が得られます。以下の画像は、不適切な閾値処理と適切な閾値処理の違いを示しています:

閾値処理の例

アリーナの天井照明や窓などは、閾値処理を使用して画像から除去するのが難しい場合があります。そこで次の段階が役立ちます。


輪郭フィルタリング

閾値処理の後、Limelightのビジョンパイプラインは画像の輪郭セットを生成します。輪郭とは、連続したピクセルのセットを囲む曲線です。天井照明、アリーナのスコアボード、窓などが閾値処理ステップを通過してしまうことがあります。ここで輪郭フィルタリングが役立ちます。目標は、関心のあるターゲットではないことがわかっている輪郭を除去することです。

最初で最も簡単な輪郭フィルターは、得点距離からビジョンターゲットがどのように見えるかよりも小さい輪郭を無視することです。そのサイズより小さいものは明らかに遠くにあるものであり、無視すべきです。これはエリアフィルタリングと呼ばれます。

FRCのビジョンターゲットには、輪郭のフィルタリングに利用できる幾何学的特性があることがよくあります。例えば、ビジョンターゲットのアスペクト比が広い場合、広くない輪郭をフィルタリングできます:

ターゲット

ただし、カメラが奇妙な角度からターゲットを見ている可能性があることに注意してください。これは輪郭のアスペクト比に大きく影響する可能性があります。フィルタリングが厳しすぎてビジョンターゲットを無視してしまわないように、さまざまな角度から設定をテストしてください!

ターゲット

次の画像ターゲットは非常に興味深いものです。これは(私たちの意見では)FRCで最も優れた設計のビジョンターゲットの1つです。Limelightは輪郭の充填率と呼ばれる値を自動的に計算します。充填率は、輪郭のピクセル面積とその凸包面積の比率です。この特定の形状は非常に低い充填率を持ち、このような低い充填率を持つ天井照明や窓などはほとんど見られません。そのため、ビジョンターゲットがこのような形状であれば、不要な輪郭を非常に効果的にフィルタリングできます。

ターゲット

Limelightには輪郭をフィルタリングするための多くのオプションがあります。これらのオプションと、追跡しようとしている特定のビジョンターゲットの幾何学的特性に関する知識を組み合わせて使用できます。

現在、複数の輪郭がフィルタリングオプションを通過した場合、最大の輪郭が選択されます。さらに、パイプラインはヒステリシスを使用して輪郭に「ロック」することを優先します。これは、類似したターゲット間のちらつきを防ぐのに役立つ機能です。

ピクセルから角度へ

ビジョンパイプラインの最終結果は、画像内の最良の輪郭のピクセル位置です。ほとんどのゲームでは、輪郭の中心を狙うだけで済みます。上部中央や他の点を狙うことが有用な場合もありますが、基本的には狙いたい場所のピクセル座標があります。このターゲットへの角度を計算するには、少しの三角法を使用する必要があります。

まず、完璧な「ピンホール」カメラがあると仮定します。実際にはこれは真実からかけ離れている場合がありますが、Limelightのカメラは非常に近いです。(反例として、魚眼レンズはこの理想からかけ離れています。)

Limelightカメラの水平視野角は54度、垂直視野角は41度です。320x240の解像度で画像をキャプチャします。画像の中心がカメラの光軸であると仮定します(したがって、その位置のxおよびy角度は0,0です)。これらの既知の値を使用して、少しの三角法で画像内の任意のピクセルの角度を計算できます。

以下の図は、角度を計算したいターゲットポイントの例を示しています。ピクセル座標は画像の左上隅から始まり、右と下が正の方向です。

ピクセルから角度へ

最初のステップは、ピクセル座標から正規化2D座標に変換することです。0,0が画像の中心で1.0が最大値です:

(px, py) = ピクセル座標、0,0は左上、右と下が正

(nx, ny) = 正規化ピクセル座標、0,0は中心、右と上が正

nx = (1/160) * (px - 159.5)

ny = (1/120) * (119.5 - py)

次に、仮想のビュープレーンを定義し、そのサイズを計算します。簡単のため、このプレーンをカメラ位置から1.0単位前に配置することを選択できます。以下はカメラを上から見た図です。目標は、後で角度を計算するために使用されるビュープレーンの幅と高さを計算することです:

ピクセルから角度への正規化座標

1.0単位の距離と既知の水平および垂直視野角が与えられると、以下の式でビュープレーン矩形のサイズを計算できます:

vpw = 2.0*tan(horizontal_fov/2)

vph = 2.0*tan(vertical_fov/2)

これら2つの値を使用して、単純な乗算で正規化ピクセル座標とビュープレーン座標の間を変換できます。

x = vpw/2 * nx;

y = vph/2 * ny;

ビュープレーンを距離1.0に配置したことを思い出してください。これで、ターゲットポイントへの角度を計算するために必要なものがすべて揃いました。

ピクセルから角度への計算

tan(ax) = x / 1

tan(ay) = y / 1

ax = atan2(x, 1)

ay = atan2(y, 1)