追加理論
ビジョンターゲット
FRCのゲームデザイナーは、戦略的な位置にリフレクティブな「ビジョンターゲット」を配置することがよくあります。これらのビジョンターゲットは通常、再帰反射テープで作られています。主要な得点要素には、自動照準に使用できるビジョンターゲットが一般的に備わっています。以下に、2016年と2017年のFRCゲームのビジョンターゲットの例を示します。
これらの再帰反射ビジョンターゲットには非常に有用な特性があります:光が当てられると、その光源に直接反射して戻ります。これがLimelight がカメラレンズの周りに明るい緑色のLEDを備えている理由です。明るい緑色の光をターゲットに向けて発光しながらカメラの露出を非常に低く設定することで、ほとんど黒で、明るい緑色のビジョンターゲットが映る画像を取得できます。これによりターゲットの取得が比較的容易になります。
以下に理想的な画像の例を示します。露出設定が低いため画像のほとんどの詳細が失われていますが、再帰反射テープが明るく際立っていることに注目してください。
しきい値処理
しきい値処理は、ほとんどのFRCビジョントラッキングアルゴリズムの次の重要なコンポーネントです。これは画像を取り、特定の色範囲にないピクセルを破棄する処理です。しきい値処理の結果は一般的に、ピクセルが「オン」か「オフ」のどちらかの1次元画像になります。しきい値処理は、上記の戦略(低露出、非常に暗い画像と明るく照らされたビジョンターゲット)を使用して撮影された画像で非常にうまく機能します。
LimelightはHSV(色相-彩度-明度)色空間でしきい値処理を行います。RGB(赤-緑-青)色空間で色を考えることに慣れているかもしれません。HSVは、直交座標系や極座標系で位置を表現できるのと同様に、色を表現する別の方法です。HSV色空間を使用する理由は、色相を 使用してLimelightのLEDが出力する緑色を非常に厳密に選択できるためです。
画像からできるだけ多くを除去するようにしきい値処理設定を調整することが重要です。次の段階に進む前に、ビジョンパイプラインの各段階を最適化すると最良の結果が得られます。以下の画像は、不適切なしきい値処理と適切なしきい値処理の違いを示しています:
アリーナの天井灯や窓などは、しきい値処理だけでは画像から除去するのが難しい場合があります。これが次の段階が必要な理由です。
輪郭フィルタリング
しきい値処理の後、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)