VEXcode EXP 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);

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

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

オブジェクト

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

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

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

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

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

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

id

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

3 つの AprilTag が AI Vision Utility によって追跡されています。 各タグは識別され、位置が特定され、輪郭が描かれ、システムによる追跡が示されます。 この例の AprilTag ID は 0、3、9 です。

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

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

AI ビジョン ユーティリティによって、2 つの BuckyBall と 2 つのリングの 4 つのオブジェクトが追跡されています。 各オブジェクトは識別され、位置が特定され、輪郭が描かれ、システムによる追跡が示されます。 ユーティリティはオブジェクトの ID を記録します。この例では、赤いボール、青いボール、緑のリング、赤いリングがあります。

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

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

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

中心X中心Y

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

AI ビジョン センサーが青いバッキーボールを追跡している様子が示されています。 Buckyball の周囲には追跡用の四角形があり、上のラベルには X 位置が 176、Y 位置が 117 であることが示されています。 追跡四角形の中心が強調表示され、位置が中心から測定されていることを示します。

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

AI ビジョン センサーが 2 つの Blue Cube を追跡している様子が表示されます。 キューブの周囲には追跡用の四角形があり、そのうちの 1 つはカメラにかなり近くなっています。 近い方の Y 位置は 184 で、遠い方の Y 位置は 70 です。

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);
}

originXoriginY

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

AI ビジョン センサーが青いバッキーボールを追跡している様子が示されています。 Buckyball の周囲には追跡用の四角形があり、上のラベルには X 位置が 176、Y 位置が 117 であることが示されています。 追跡四角形の左上隅が強調表示され、原点の位置が左上隅から測定されていることを示します。

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

高さ 、幅 、高さ

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

AI ビジョン センサーが青いバッキーボールを追跡している様子が示されています。 Buckyball の周囲には追跡用の四角形があり、上のラベルには幅が 80 ピクセル、高さが 78 ピクセルであることが示されています。 赤い矢印は追跡四角形を強調表示し、その幅と高さを示しています。

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

AI ビジョン センサーが 2 つの Blue Cube を追跡している様子が表示されます。 キューブの周囲には追跡用の四角形があり、そのうちの 1 つはカメラにかなり近くなっています。 近い方は幅が144、高さが113で、遠い方は幅が73、高さが84です。

幅と高さは、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);
}

角度

角度値の 360 度を示すために、赤い正方形と緑の正方形が一緒に回転するアニメーション。

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

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

AI ビジョン センサーが、緑、次に青のカラー コードを追跡している様子が表示されます。 ビデオフィードには、青いキューブの上に積み重ねられた緑のキューブが示されています。 カラー コードの角度値が強調表示され、87 度と表示されます。これは、カラー コードが垂直方向になっていることを示します。

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

AI ビジョン センサーが、緑、次に青のカラー コードを追跡している様子が表示されます。 ビデオフィードには、緑のキューブが青のキューブの隣に置かれているのが示されていますが、センサーと比較すると角度が不自然です。 カラー コードの角度値が強調表示され、0 度と表示されます。これは、カラー コードの角度を読み取ることができないことを示しています。

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

スコア

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

AI ビジョン ユーティリティによって、2 つの BuckyBall と 2 つのリングの 4 つのオブジェクトが追跡されています。 各オブジェクトは識別され、位置が特定され、輪郭が描かれ、システムによる追跡が示されます。 このユーティリティは、各オブジェクトの AI 分類スコアもリストします。この例では、各スコアは 99% です。

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

存在する

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

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


オブジェクト数

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

AI ビジョン センサーが 2 つの Blue Cube を追跡している様子が表示されます。 キューブの周囲には追跡用の四角形があり、そのうちの 1 つはカメラにかなり近くなっています。

この例では、カラー シグネチャ 「青」で 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, ミリ秒);
}

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

Last Updated: