VEXcode EXP PythonでAIビジョンセンサーを使ったコーディング

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

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

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


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

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

スナップショット

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

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

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

この例では、変数 vision_objects には、 ai_vision_1という名前の AI ビジョン センサーから検出された「紫」のカラー シグネチャ を含むタプルが格納されます。検出されたオブジェクトの数を表示し、0.5 秒ごとに新しいスナップショットをキャプチャします。

while True: 
    # すべての紫色のカラーシグネチャのスナップショットを取得し、vision_objects に保存します。
    vision_objects = ai_vision_1.take_snapshot(ai_vision_1__Purple)
    
    # データを取得する前に、スナップショットでオブジェクトが検出されたことを確認します。
    if vision_objects[0].exists == True
    
        brain.screen.clear_screen()
        brain.screen.set_cursor(1, 1)
    
        brain.screen.print("オブジェクト数:", len(vision_objects))
    wait(0.5, SECONDS)

オブジェクトのプロパティ

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

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

オブジェクトのプロパティにアクセスするには、タプルを格納する変数名と、それに続くオブジェクト インデックスを使用します。

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

たとえば、 vision_objects 変数内で最大のオブジェクトの幅を呼び出す場合は、 vision_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:
    # すべての青色のシグネチャのスナップショットを取得し、vision_objects に保存します。
    vision_objects = ai_vision_1.take_snapshot(ai_vision_1__Blue)

    # データを取得する前に、スナップショットでオブジェクトが検出されたことを確認します。
    if vision_objects[0].exists == True

        # オブジェクトが AI ビジョン センサーの視野の中心にないかどうかを確認します。
        vision_objects[0].centerX が > 150 かつ 170 > の場合、vision_objects[0].centerX:

            # オブジェクトがビューの中心になるまで右に回転し続けます。
            drivetrain.turn(RIGHT)
        else:
            drivetrain.stop()
    wait(5, MSEC)

originX と originY

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:
    # すべての青色のシグネチャのスナップショットを取得し、vision_objects に保存します。
    vision_objects = ai_vision_1.take_snapshot(ai_vision_1__Blue)

    # データを取得する前に、スナップショットでオブジェクトが検出されたことを確認します。
    if vision_objects[0].exists == True

        # 最大のオブジェクトが幅を測定して AI ビジョン センサーに近いかどうかを確認します。
        if vision_objects[0].width < 250:

            # オブジェクトの幅が 250 ピクセルより広くなるまで、オブジェクトに近づきます。
            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 を返します。

 

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

Last Updated: