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

追加理論

ビジョンターゲット

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

ビジョンターゲットの例

これらの再帰反射ビジョンターゲットには非常に有用な特性があります:光が当てられると、光源に直接反射して戻ります。これが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(1, x)

ay = atan2(1, y)