ビジョン#

導入#

VEX AIRドローンのビジョンセンサーは、AprilTag IDを検出して追跡します。これにより、ドローンは周囲の状況を分析し、物体を追跡し、検出された視覚データに基づいて反応することができます。以下に、使用可能なすべてのメソッドとプロパティの一覧を示します。

ゲッター – ドローンが物体を掴んでいるかどうかを検出します。

  • get_data – 特定のシグネチャに対して検出されたオブジェクトのタプルを返します。

プロパティ – get_data から返されるオブジェクトデータ。

  • exists – 現在の検出でオブジェクトが存在するかどうか。

  • width – 検出されたオブジェクトの幅。

  • height – 検出されたオブジェクトの高さ。

  • centerX – オブジェクトの中心の X 座標。

  • centerY – オブジェクトの中心の Y 座標。

  • bearing – 前方ビジョンセンサーに対する物体の角度、またはドローンが物体に向き合うために必要な角度。

  • rotation – オブジェクトの向き。

  • originX – オブジェクトの左上隅のX座標。

  • originY – オブジェクトの左上隅の Y 座標。

  • id – オブジェクトのタグ ID。

  • type – オブジェクトの型を返します。

ゲッター#

get_data#

get_data は、ビジョンセンサーフレームからデータをフィルタリングして、単一のシグネチャ(センサーが認識できるものの保存された説明、たとえば AprilTag ID など)を取得し、タプルを返します。

The tuple stores objects ordered from largest to smallest by width, starting at index 0. Each object’s properties can be accessed using its index. An empty tuple is returned if no matching objects are detected.

Usage:
drone.vision.get_data(camera, signature, count)

パラメータ

説明

camera

データ取得対象のカメラ: DOWNWARD_CAMERA または FORWARD_CAMERAのいずれか。

signature

指定された署名のデータのみを含むようにデータセットをフィルタリングします。使用可能な署名は次のとおりです

  • ALL_TAGS - すべての AprilTag ID
  • TAG0 ~ TAG37 - 0 ~ 37 の単一の AprilTag ID

count

オプション。返されるオブジェクトの最大数を1~24の間で設定します(デフォルト:8)。

# Climb upward when an AprilTag ID is detected
drone.take_off(climb_to=500)
while True:
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    if vision_data[0].exists:
        drone.climb_for(direction=UP, distance=200)

不動産#

get_data を使用した後に タプル に格納される各オブジェクトには、複数のプロパティが含まれています。

.id および .type を除くすべてのプロパティ値は、get_data が使用された時点での検出されたオブジェクトの位置、サイズ、向き、または方位を表します。これらの値はピクセルまたは度で測定されます。各ビジョンセンサーは異なる解像度を持っています。

  • 正面:640 x 480ピクセル

  • 下向き:640 x 400ピクセル

.exists#

.exists 、インデックスがタプル内に存在するかどうかを示すブール値を返します。検出されたオブジェクトがない場合はエラーを返します。

  • True – インデックスが存在します。

  • False – インデックスが存在しません。

# Climb upward when an AprilTag ID is detected
drone.take_off(climb_to=500)
while True:
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    if vision_data[0].exists:
        drone.climb_for(direction=UP, distance=200)

.width#

.width 、検出されたオブジェクトの幅をピクセル単位で、1 から 640 までの整数として返します。

# Show if the AprilTag ID appears large or small
while True:
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    clear_console()
    if vision_data[0].exists:
        if vision_data[0].width > 100:
            print("Large")
        else:
            print("Small")
    wait(0.2, SECONDS)

.height#

.height 、検出されたオブジェクトの高さをピクセル単位で、1 から 480 までの整数として返します。

# Show if the AprilTag ID appears large or small
while True:
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    clear_console()
    if vision_data[0].exists:
        if vision_data[0].height > 100:
            print("Large")
        else:
            print("Small")
    wait(0.2, SECONDS)

.centerX#

.centerX 、検出されたオブジェクトの中心の x 座標をピクセル単位で 1 から 640 までの整数として返します。

# Show if an AprilTag ID is to the left or the right of the camera
while True:
    clear_console()
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    if vision_data[0].exists:
        if vision_data[0].centerX < 320:
            print("To the left!")
        else:
            print("To the right!")
    wait(0.2, SECONDS)

.centerY#

.centerY 、検出されたオブジェクトの中心の y 座標をピクセル単位で、1 から 480 までの整数として返します。

# Take off and align drone with AprilTag ID on wall
# Change drone.take_off parameter to see different results
drone.take_off(climb_to=800)
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
    if vision_data[0].centerY < 240:
        print("Below the target!")
    else:
        print("Above the target!")
else:
    print("No target found!")

.bearing#

.bearing 、ドローンに対する物体の位置を示す角度を返します。動作は、使用するビジョンセンサーによって異なります。

0°の値は、物体の中心とセンサーの中心が一致していることを示します。正の値は物体が右側にあることを意味し、負の値は物体が左側にあることを意味します。

センサー

返品

下向き

ドローンの機首を対象物の中心に合わせるために回転させる角度(-180度から180度まで)。

フォワード

対象物がビジョンセンサーの中心から左右にずれている角度(-180°~180°)。

# Align the front of the drone to an AprilTag ID
drone.set_turn_velocity(15)
drone.take_off(climb_to=500)
while True:
    vision_data = drone.vision.get_data(DOWNWARD_CAMERA, ALL_TAGS)
    if vision_data[0].exists:
        if -20 < vision_data[0].bearing < 20:
            # Hover once sensor is centered on AprilTag ID
            drone.hover()
            controller.sound.play(SUCCESS)
            while controller.sound.is_active():
                wait(50, MSEC)
        elif vision_data[0].bearing < -21:
            drone.turn(LEFT)
        else:
            drone.turn(RIGHT)
    wait(5, MSEC)

.rotation#

.rotation 、検出された AprilTag ID の向きを 1 から 359 までの整数値で返します。

# Turn left or right based on the rotation of an AprilTag ID
drone.take_off(climb_to=1000)
while True:
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    if vision_data[0].exists:
        if 240 < vision_data[0].rotation < 300:
            drone.turn_for(LEFT, 90)
        elif 60 < vision_data[0].rotation < 120:
            drone.turn_for(RIGHT, 90)
        else:
            drone.hover()
    wait(0.2, SECONDS)

.originX#

.originX 、検出されたオブジェクトのバウンディングボックスの左上隅の x 座標をピクセル単位で、1 から 640 までの整数として返します。

# Draw lines to the AprilTag ID origin from all corners
while True:
    controller.screen.clear_screen()
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    if vision_data[0].exists:
        controller.screen.draw_line(0, 0, vision_data[0].originX, vision_data[0].originY)
        controller.screen.draw_line(0, 480, vision_data[0].originX, vision_data[0].originY)
        controller.screen.draw_line(640, 0, vision_data[0].originX, vision_data[0].originY)
        controller.screen.draw_line(640, 480, vision_data[0].originX, vision_data[0].originY)
    wait(0.2, SECONDS)

.originY#

.originY 、検出されたオブジェクトのバウンディングボックスの左上隅の y 座標をピクセル単位で、1 から 480 までの整数として返します。

# Draw lines to the AprilTag ID origin from all corners
while True:
    controller.screen.clear_screen()
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    if vision_data[0].exists:
        controller.screen.draw_line(0, 0, vision_data[0].originX, vision_data[0].originY)
        controller.screen.draw_line(0, 480, vision_data[0].originX, vision_data[0].originY)
        controller.screen.draw_line(640, 0, vision_data[0].originX, vision_data[0].originY)
        controller.screen.draw_line(640, 480, vision_data[0].originX, vision_data[0].originY)
    wait(0.2, SECONDS)

.id#

.id 、検出された AprilTag ID の識別番号を 0 から 37 までの整数として返します。

# Display the detected AprilTag ID
while True:
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    clear_console()
    if vision_data[0].exists:
        print(vision_data[0].id)
    wait(0.2, SECONDS)

.type#

.type は、検出されたオブジェクトのタイプを返します。以下の内容が返されます。

オブジェクトタイプ

数値

含まれるオブジェクト

drone.vision.TAG_OBJECT

8

AprilTag IDs

drone.vision.COLOR_OBJECT

1

カラーシグネチャー - 近日公開予定!

drone.vision.CODE_OBJECT

2

カラーコード - 近日公開予定!

# Display what AprilTag ID is detected
while True:
    controller.screen.clear_screen()
    controller.screen.set_cursor(1, 1)
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    if vision_data[0].exists:
        if vision_data[0].type == drone.vision.TAG_OBJECT:
            controller.screen.print("AprilTag ID: ")
            controller.screen.print(vision_data[0].id)

    wait(0.1, SECONDS)