Látomás#

Bevezetés#

A VEX AIR drón vizuális érzékelője érzékeli és nyomon követi az AprilTag azonosítókat. Ez lehetővé teszi a drón számára, hogy elemezze a környezetét, kövesse a tárgyakat, és a detektált vizuális adatok alapján reagáljon. Az alábbiakban felsoroljuk az összes elérhető módszert és tulajdonságot:

Getterek – Észlelik, ha a drón tart egy tárgyat.

  • get_data – Egy adott aláíráshoz tartozó észlelt objektumok egy tuple-jét adja vissza.

Tulajdonságok – A get_data függvényből visszaadott objektumadatok.

  • exists – Létezik-e az objektum az aktuális észlelésben.

  • width – Az érzékelt objektum szélessége.

  • height – Az érzékelt tárgy magassága.

  • centerX – Az objektum középpontjának X pozíciója.

  • centerY – Az objektum középpontjának Y pozíciója.

  • bearing – A tárgy szöge az elülső vizuális érzékelőhöz képest, vagy az a fok, amely ahhoz szükséges, hogy a drón a tárgy felé forduljon.

  • rotation – Az objektum orientációja.

  • originX – Az objektum bal felső sarkának X pozíciója.

  • originY – Az objektum bal felső sarkának Y pozíciója.

  • id – Az objektum címkeazonosítója.

  • type – Visszaadja az objektum típusát.

Getterek#

get_data#

get_data A Vision Sensor keretéből származó adatokat egyetlen aláírásra szűri – egy mentett leírásra, amit az érzékelő felismer, például egy AprilTag azonosítóra –, és egy tuple-t ad vissza.

A tuple a 0 indexszel kezdődően, szélesség szerint a legnagyobbtól a legkisebbig rendezve tárolja az objektumokat. Minden objektum properties tulajdonsága a hozzá tartozó index segítségével érhető el. Ha nem található egyező objektum, akkor egy üres tuple kerül visszaadásra.

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

Paraméterek

Leírás

camera

A kamera, amelyről az adatokat lekérni kell: vagy a DOWNWARD_CAMERA , vagy a FORWARD_CAMERA.

signature

Úgy szűri az adathalmazt, hogy csak az adott aláírás adatait tartalmazza. Az elérhető aláírások:

  • ALL_TAGS – Minden AprilTag azonosító
  • TAG0 TAG37 – Egyetlen AprilTag azonosító 0 és 37 között

count

Opcionális. Beállítja a visszaadható objektumok maximális számát 1 és 24 között (alapértelmezett: 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)

Tulajdonságok#

Több tulajdonság is tartozik minden egyes objektumhoz, melyeket egy tuple tárolunk a get_data használata után.

.id és .type kivételével az összes tulajdonságérték a detektált objektum pozícióját, méretét, tájolását vagy irányát írja le a get_data használatának pillanatában. Ezeket az értékeket pixelben vagy fokban mérjük. Minden vizuális érzékelőnek más a felbontása:

  • Előre néző: 640 x 480 pixel

  • Lefelé néző: 640 x 400 pixel

.exists#

.exists Egy logikai értéket ad vissza, amely jelzi, hogy az index létezik-e a tuple-ben. Hibát ad vissza, ha nincsenek észlelt objektumok.

  • True – Az index létezik.

  • False – Az index nem létezik.

# 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 Visszaadja a detektált objektum szélességét pixelben, 1 és 640 közötti egész számként.

# 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 A detektált objektum magasságát adja vissza pixelben, 1 és 480 közötti egész számként.

# 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 Visszaadja a detektált objektum középpontjának x koordinátáját pixelben, 1 és 640 közötti egész számként.

# 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 Visszaadja a detektált objektum középpontjának y koordinátáját pixelben, 1 és 480 közötti egész számként.

# 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 egy szöget ad vissza, amely egy objektum drónhoz viszonyított helyzetét jelzi. A viselkedés attól függ, hogy melyik vizuális érzékelőt használják.

A 0° érték azt jelzi, hogy az objektum közepe és az érzékelő egy vonalban vannak. A pozitív értékek azt jelentik, hogy az objektum jobbra, míg a negatív értékek azt jelentik, hogy az objektum balra van.

Érzékelő

Visszaküldések

Lefelé

Hány fokban kell a drón elejének elfordulnia, hogy a tárgy közepéhez igazodjon, -180º és 180º között.

Előre

Az objektumnak a vizuális érzékelő közepétől balra vagy jobbra eltolt szöge –180º és 180º között.

# 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 A 0 függvény visszaadja az észlelt AprilTag azonosító tájolását egész számként, 1 és 359 közötti fokban.

# 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 Visszaadja az észlelt objektum határolókeretének bal felső sarkának x koordinátáját pixelben, 1 és 640 közötti egész számként.

# 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 Visszaadja az észlelt objektum határolókeretének bal felső sarkának y koordinátáját pixelben, 1 és 480 közötti egész számként.

# 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 A rendszer visszaadja az észlelt AprilTag ID azonosítószámát 0 és 37 közötti egész számként.

# 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 függvény visszaadja az észlelt objektum típusát. A következő értéket adja vissza:

Objektumtípus

Numerikus érték

Belefoglalt objektumok

drone.vision.TAG_OBJECT

8

AprilTag azonosítók

drone.vision.COLOR_OBJECT

1

Színaláírások - Hamarosan!

drone.vision.CODE_OBJECT

2

Színkódok - Hamarosan!

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