Vidění#

Zavedení#

Vizuální senzor dronu VEX AIR detekuje a sleduje identifikátory AprilTag. To umožňuje dronu analyzovat okolí, sledovat objekty a reagovat na základě detekovaných vizuálních dat. Níže je uveden seznam všech dostupných metod a vlastností:

Gettery – Detekují, zda dron drží nějaký předmět.

  • get_data – Vrátí n-tici detekovaných objektů pro specifický podpis.

Vlastnosti – Data objektu vrácená z get_data.

  • exists – Zda objekt existuje v aktuální detekci.

  • width – Šířka detekovaného objektu.

  • height – Výška detekovaného objektu.

  • centerX – Pozice středu objektu na souřadnici X.

  • centerY – Pozice středu objektu v ose Y.

  • bearing – Úhel objektu vzhledem k přednímu vizuálnímu senzoru nebo stupně potřebné k tomu, aby se dron natočil k objektu.

  • rotation – Orientace objektu.

  • originX – Pozice X levého horního rohu objektu.

  • originY – Pozice Y levého horního rohu objektu.

  • id – ID tagu objektu.

  • type – Vrátí typ objektu.

Gettery#

get_data#

Funkce get_data filtruje data z rámce Vision Sensor do jediného podpisu – uloženého popisu něčeho, co senzor dokáže rozpoznat, například ID AprilTag – a vrací n-tici.

N-tice ukládá objekty seřazené od největší po nejmenší podle šířky, počínaje indexem 0. K vlastnostem properties každého objektu lze přistupovat pomocí jeho indexu. Pokud nejsou detekovány žádné odpovídající objekty, vrátí se prázdná n-tice.

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

Parametry

Popis

camera

Kamera, ze které se mají načítat data: buď DOWNWARD_CAMERA , nebo FORWARD_CAMERA.

signature

Filtruje datovou sadu tak, aby obsahovala pouze data daného podpisu. Dostupné podpisy jsou:

  • ALL_TAGS - Všechna ID AprilTag
  • TAG0 až TAG37 - Jedno ID AprilTag od 0 do 37

count

Volitelné. Nastavuje maximální počet objektů, které lze vrátit, od 1 do 24 (výchozí: 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)

Nemovitosti#

Každý objekt uložený v n-tici tuple po použití funkce get_data obsahuje několik vlastností.

Všechny hodnoty vlastností kromě .id a .type popisují polohu, velikost, orientaci nebo azimut detekovaného objektu v okamžiku, kdy byla použita funkce get_data. Tyto hodnoty se měří v pixelech nebo stupních. Každý kamerový senzor má jiné rozlišení:

  • Přední displej: 640 x 480 pixelů

  • Směr dolů: 640 x 400 pixelů

.exists#

.exists vrací booleovskou hodnotu, která indikuje, zda index v n-tici existuje. Vrátí chybu, pokud nejsou detekovány žádné objekty.

  • True – Index existuje.

  • False – Index neexistuje.

# 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 vrací šířku detekovaného objektu v pixelech jako celé číslo od 1 do 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 vrací výšku detekovaného objektu v pixelech jako celé číslo od 1 do 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 vrací souřadnici x středu detekovaného objektu v pixelech jako celé číslo od 1 do 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 vrací souřadnici y středu detekovaného objektu v pixelech jako celé číslo od 1 do 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 vrací úhel označující polohu objektu vzhledem k dronu. Chování závisí na použitém vizuálním senzoru.

Hodnota 0° značí, že střed objektu a senzor jsou zarovnány. Kladné hodnoty znamenají, že objekt je vpravo, zatímco záporné hodnoty znamenají, že objekt je vlevo.

Senzor

Vrácení zboží

Dolů

Úhly, o které se musí přední část dronu otočit, aby se zarovnala se středem objektu, od –180º do 180º.

Vpřed

Úhel posunutí objektu doleva nebo doprava od středu obrazového senzoru od –180º do 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#

Funkce .rotation vrací orientaci detekovaného ID AprilTag jako celé číslo ve stupních od 1 do 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 vrací souřadnici x levého horního rohu ohraničovacího rámečku detekovaného objektu v pixelech jako celé číslo od 1 do 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 vrací souřadnici y levého horního rohu ohraničovacího rámečku detekovaného objektu v pixelech jako celé číslo od 1 do 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 vrací identifikační číslo detekovaného ID AprilTag jako celé číslo od 0 do 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 vrací typ detekovaného objektu. Vrátí následující:

Typ objektu

Číselná hodnota

Zahrnuté objekty

drone.vision.TAG_OBJECT

8

ID tagů April

drone.vision.COLOR_OBJECT

1

Barevné podpisy - Již brzy!

drone.vision.CODE_OBJECT

2

Barevné kódy - Již brzy!

# 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)