VEXcode V5 C++でAIビジョンセンサーを使ったコーディング

ブロックで使用できるように、AI ビジョン センサーで カラー シグネチャ と カラー コード が設定されていることを確認してください。設定方法の詳細については、以下の記事をお読みください。

AI ビジョン センサーは、AI 分類と AprilTags も検出できます。これらの検出モードを有効にする方法については、こちらをご覧ください。

これらの個々のコマンドの詳細と、VEXcode での使用方法については、API サイトをご覧ください。


AIビジョンセンサーで視覚データを取得する

すべての AI ビジョン センサー コマンドは、構成された AI ビジョン センサーの名前で始まります。この記事のすべての例において、使用される AI ビジョン センサーの名前は AIVisionになります。

スナップショット

takeSnapshot メソッドは、AI ビジョン センサーが現在見ているものを写真に撮り、そのスナップショットからプロジェクトで使用できるデータを取得します。スナップショットを撮影するときに、AI ビジョン センサーがどのタイプのオブジェクトのデータを収集するかを指定する必要があります。

  • カラー署名 またはカラーコード
    • これらのビジュアル シグネチャは、AI ビジョン センサーの名前、二重アンダースコア、そしてビジュアル シグネチャの名前で始まります (例: AIVision1__Blue。
  • AI分類 - aivision::ALL_AIOBJS
  • 4月タグ- aivision::ALL_TAGS

スナップショットを撮ると、指定したすべての検出されたオブジェクトの配列が作成されます。たとえば、「青」の カラー シグネチャを検出する場合、AI ビジョン センサーが 3 つの異なる青いオブジェクトを検出すると、3 つすべてのデータが配列に格納されます。

この例では、 AIVision1という名前の AI ビジョン センサーから「青」 カラー シグネチャのスナップショットが取得されます。配列内で検出されたオブジェクトの数を表示し、0.5 秒ごとに新しいスナップショットをキャプチャします。

while (true) {
  // すべての青色オブジェクトのスナップショットを取得します。
  AIVision.takeSnapshot(AIVision1__Blue);

  // データを取得する前に、スナップショットでオブジェクトが検出されたことを確認します。
  if (AIVision.objectCount > 0) {

    Brain.Screen.clearScreen();
    Brain.Screen.setCursor(1, 1);
    Brain.Screen.print(AIVision1.objectCount);
  }
  wait(5, msec);
}

オブジェクト

スナップショットからの各オブジェクトには、そのオブジェクトに関する情報を報告するために使用できるさまざまなプロパティがあります。オブジェクト メソッドを使用すると、これらのプロパティにアクセスできます。

使用可能なプロパティは次のとおりです。

  • id
  • centerXとcenterY
  • originXとoriginY
  • 幅
  • 身長
  • 角度
  • 存在する
  • スコア

オブジェクトのプロパティにアクセスするには、AI ビジョン センサーの名前、オブジェクトのメソッド、オブジェクトのインデックスの順に使用します。

オブジェクト インデックスは、取得する特定のオブジェクトのプロパティを示します。スナップショットを撮影した後、AI ビジョン センサーはオブジェクトをサイズごとに自動的に分類します。最大のオブジェクトにはインデックス 0 が割り当てられ、小さいオブジェクトにはより大きなインデックス番号が割り当てられます。

たとえば、最大のオブジェクトの幅を呼び出す場合は、 AIVision1.objects[0].widthとなります。

id

id プロパティは、 AprilTags および AI 分類でのみ使用できます

ID 0、9、3 のラベルが付いた 3 つの正方形の識別マーカー。それぞれに対応する座標とサイズの測定値が白いテキストで表示されます。 ID 0 は左側、ID 9 は右側、ID 3 は下部中央にあります。各マーカーには、正方形の中に独自の白黒パターンがあります。

AprilTagの場合、 id プロパティは検出されたAprilTag ID番号を表します。

特定の AprilTags を識別すると、選択的なナビゲーションが可能になります。ロボットを特定のタグに向かって移動し、他のタグを無視するようにプログラムして、それらを自動ナビゲーションの道標として効果的に使用できます。

画像には 2 つのボールと 2 つのリングが示されており、それぞれの位置、サイズ、スコアを示すラベルが付いています。赤いボールは左側、青いボールは右側、緑のリングは左下、赤いリングは右下にあります。各オブジェクトは白いボックスで囲まれ、X、Y 座標、幅、高さ、99% のスコアなどの詳細が白いテキストで表示されます。

AI 分類の場合、 id プロパティは検出された AI 分類の特定のタイプを表します

特定の AI 分類を識別することで、ロボットは、青いバッキーボールではなく赤いバッキーボールに向かって移動するなど、特定のオブジェクトにのみ焦点を当てることができます。

AprilTags および AI 分類 の詳細と、AI Vision Utility でそれらの検出を有効にする方法については、これらの記事をご覧ください。

中心X と 中心Y

これは、検出されたオブジェクトの中心座標(ピクセル単位)です。

コンピューター ビジョン システムによって追跡されている青いバッキーボール。オブジェクトは白い四角で囲まれており、その輪郭の内側には、中央の白い十字を囲む小さな赤い四角があります。画像の左上隅のラベルには、オブジェクトが青で、座標が X:176、Y:117、寸法が W:80、H:78 であることがわかります。

CenterX と CenterY 座標は、ナビゲーションと配置に役立ちます。 AI ビジョン センサーの解像度は 320 x 240 ピクセルです。

ビジョン システムによって追跡される 2 つの青い立方体オブジェクト。上のオブジェクトには、座標 X:215、Y:70、寸法 W:73、H:84 のラベルが付けられ、白いアウトラインと中央に白い十字が付いています。下のオブジェクトには、座標 X:188、Y:184、寸法 W:144、H:113 のラベルが付けられており、これも白の輪郭と中央の白い十字で囲まれています。

AI ビジョン センサーに近いオブジェクトは、遠いオブジェクトよりも CenterY 座標が低くなることがわかります。

この例では、AI ビジョン センサーのビューの中心が (160, 120) であるため、検出されたオブジェクトの centerX 座標が 150 ピクセルより大きく 170 ピクセルより小さくなるまでロボットは右に曲がります。

while (true) {
  // すべての Blue Color オブジェクトのスナップショットを取得します。
  AIVision.takeSnapshot(AIVision__Blue);

  // データを取得する前に、スナップショットでオブジェクトが検出されたことを確認します。
  AIVision.objectCount > 0の場合 {

    AIVision.objects[0].centerX > 150.0 && 170.0 > AIVision.objects[0].centerXの場合 {
      Drivetrain.turn(right);
    } else {
      Drivetrain.stop();
    }
  }
  wait(5, msec);
}

originX と originY

OriginX と OriginY は、検出されたオブジェクトの左上隅の座標 (ピクセル単位) です。

視覚システムによって追跡されている青いバッキーボール。オブジェクトは白いアウトラインで囲まれ、アウトラインの中央には白い十字が表示されます。左上のラベルには、オブジェクトの色が青であること、座標が X:176、Y:117、寸法が W:80、H:78 であることが示されています。小さな赤い四角でオブジェクトの左上隅が強調表示されます。

OriginX と OriginY 座標は、ナビゲーションと配置に役立ちます。この座標をオブジェクトの幅と高さと組み合わせることで、オブジェクトの境界ボックスのサイズを決定できます。これは、移動するオブジェクトの追跡やオブジェクト間の移動に役立ちます。

幅高さ 、幅 、高さ

これは、検出されたオブジェクトのピクセル単位の幅または高さです。

画像には、白い四角い輪郭で追跡されている青いバッキーボールが示されています。左上隅には、座標 X:176、Y:117、寸法 W:80、H:78 の青いオブジェクトであることを示すラベルがあります。赤い矢印はオブジェクトの幅と高さを強調表示します。

幅と高さの測定値は、さまざまなオブジェクトを識別するのに役立ちます。たとえば、バッキーボールはリングよりも高さが高くなります。

視覚認識システムによって追跡されている 2 つの青い立方体オブジェクト。上の立方体には白い輪郭があり、その位置は X:215、Y:70、寸法は W:73、H:84 と示すラベルが付いています。下の立方体には同様の白い輪郭があり、ラベルには X:188、Y:184、寸法 W:144、H:113 が表示されています。各立方体の中央には白い十字があり、追跡の焦点を示していると考えられます。ラベルには、各オブジェクトの測定値と追跡データが強調表示されます。

幅と高さは、AI ビジョン センサーからの物体の距離も示します。通常、測定値が小さいほど物体が遠くにあることを意味し、測定値が大きいほど物体が近いことを示唆します。

この例では、オブジェクトの幅がナビゲーションに使用されます。ロボットは、幅が特定のサイズに達するまで物体に近づき、停止します。

while (true) {
  // すべての Blue オブジェクトのスナップショットを取得します。
  AIVision.takeSnapshot(AIVision1__Blue);

  // データを取得する前に、スナップショットでオブジェクトが検出されたことを確認します。
  AIVision.objectCountが > 0の場合{

    AIVision.objects[0].widthが < 250.0の場合{
      Drivetrain.drive(forward);
    } else {
      Drivetrain.stop();
    }
  }
  wait(5, msec);
}

角度

赤と緑のブロックが回転する GIF 画像。ブロックが赤から緑まで完全に水平に配置されている場合、0 度として表示されます。赤いブロックが緑のブロックの上に垂直に重なる場合、角度は 90 度です。ブロックが水平に緑から赤の場合は 180 度です。緑色のブロックが赤色のブロックの上に垂直に重なっている場合、角度は270度になります。

角度 プロパティは、カラーコード およびAprilTagsでのみ使用できます

これは、検出された カラー コードまたは AprilTag の向きが異なっているかどうかを表します。

ビジョン システムによって追跡されている、上部に緑色の立方体、下部に青色の立方体 2 個が積み重ねられています。両方の立方体の周囲に白い輪郭があり、緑の立方体の中央に白い十字があります。画像の下部のラベルには Green_Blue A:87° と表示され、検出された色と角度の測定値が示されます。その下には、座標が X:117、Y:186、寸法が W:137、H:172 として配列されており、フレーム内に積み重ねられた立方体の位置とサイズを表しています。

ロボットがカラー コード またはAprilTag に対して異なる方向を向いているかどうかを確認し、それに応じてナビゲーションの決定を行うことができます。

緑と青の 2 つの立方体が並んで配置され、視覚システムによって追跡されます。両方の立方体の周囲に白い輪郭があり、中央に白い十字があります。左上のラベルは Green_Blue A:0° を示しており、検出された色と角度の測定値を参照しています。その下には、座標が X:150、Y:102、寸法が W:179、H:109 と表示され、フレーム内の立方体の位置とサイズを表しています。

たとえば、カラー コード が適切な角度で検出されない場合、それが表すオブジェクトをロボットが適切に拾うことができない可能性があります。

スコア

スコア プロパティは、AI ビジョン センサーでAI 分類 を検出するときに使用されます。

この画像は、ビジョン システムによって追跡されている 4 つのオブジェクト (ボール 2 個とリング 2 個) を示しています。赤いボールには、座標 X:122、Y:84、W:67、H:66、スコア 99% のラベルが付けられています。青いボールのX:228、Y:86、W:70、H:68、スコアは99%です。緑のリングの座標は X:109、Y:186、W:98、H:92、スコアは 99% です。赤いリングには、X:259、Y:187、W:89、H:91 のラベルが付けられ、スコアは 99% です。各オブジェクトは白で囲まれ、追跡の精度を示します。

信頼スコアは、AI ビジョン センサーの検出の確実性を示します。この画像では、これら 4 つのオブジェクトの AI 分類を 99% の信頼度で識別しています。このスコアを使用すると、ロボットが信頼性の高い検出のみに集中できるようになります。

存在する

存在 プロパティは、最後に撮影されたスナップショットで指定された ビジュアル シグネチャ が検出されたかどうかを検出するために使用されます。

これにより、検出されたオブジェクトが前のスナップショットで検出されたかどうかを確認できます。このプロパティは、オブジェクトが存在する場合は True を返し、オブジェクトが存在しない場合には False を返します。


オブジェクト数

objectCount メソッドは、最後のスナップショットで検出されたオブジェクトの数を返します。

AI Vision Utility インターフェース。左側に 2 つの青い立方体が検出され、それぞれに X 座標と Y 座標、寸法がマークされています。システムは接続されており、AprilTags はオンになっていますが、AI 分類はオフになっています。右側には、青色の設定が表示されており、色相と彩度の範囲はそれぞれ 22 と 0.34 に設定されています。色を追加または設定したり、ビデオをフリーズしたりするオプションがあります。ファームウェアは最新で、バージョン 1.0.0.b16 が実行されており、下部に閉じるボタンがあります。

この例では、カラー シグネチャ 「青」で 2 つのオブジェクトが検出されました。 takeSnapshot メソッドを使用すると、両方とも配列に配置されます。

このコード スニペットは、検出されたオブジェクトの数を EXP Brain に継続的に更新します。提供された例に基づくと、2 つのオブジェクトが検出されたことを示す値 2 が繰り返し送信されます。

while (true) {
  // すべての Blue オブジェクトのスナップショットを取得します。
  AIVision.takeSnapshot(AIVision__Blue);

  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);

  // データを取得する前に、スナップショットでオブジェクトが検出されたことを確認します。
  if (AIVision.objectCount > 0) {
    Brain.Screen.print(AIVision1.objectCount);
  }
  wait(5 msec);
}

For more information, help, and tips, check out the many resources at VEX Professional Development Plus

Last Updated: