Visie#

Invoering#

De visuele sensor van de VEX AIR-drone detecteert en volgt AprilTag-ID’s. Hierdoor kan de drone zijn omgeving analyseren, objecten volgen en reageren op basis van de gedetecteerde visuele gegevens. Hieronder vindt u een lijst met alle beschikbare methoden en eigenschappen:

Getters – Detecteren of de drone een object vasthoudt.

  • get_data – Retourneert een tuple van gedetecteerde objecten voor een specifieke signatuur.

Eigenschappen – Objectgegevens geretourneerd door get_data.

  • exists – Of het object bestaat in de huidige detectie.

  • width – Breedte van het gedetecteerde object.

  • height – Hoogte van het gedetecteerde object.

  • centerX – X-positie van het middelpunt van het object.

  • centerY – Y-positie van het middelpunt van het object.

  • bearing – Hoek van het object ten opzichte van de voorste Vision Sensor of het aantal graden dat de drone nodig heeft om het object te volgen.

  • rotation – Oriëntatie van het object.

  • originX – X-positie van de linkerbovenhoek van het object.

  • originY – Y-positie van de linkerbovenhoek van het object.

  • id – Tag-ID van het object.

  • type – Geeft het type van het object terug.

Getters#

get_data#

get_data filtert gegevens uit het frame van de Vision Sensor tot één enkele signatuur — een opgeslagen beschrijving van iets dat de sensor kan herkennen, zoals een AprilTag ID — en retourneert een tuple.

De tuple slaat objecten op, gesorteerd van groot naar klein op basis van breedte, beginnend bij index 0. De eigenschappen van elk object kunnen worden benaderd via de index. Er wordt een lege tuple geretourneerd als er geen overeenkomende objecten worden gevonden.

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

Parameters

Beschrijving

camera

De camera waarvan de gegevens moeten worden opgehaald: ofwel de DOWNWARD_CAMERA ofwel de FORWARD_CAMERA.

signature

Filtert de dataset zodat alleen gegevens met de opgegeven signatuur worden weergegeven. Beschikbare signaturen zijn:

  • ALL_TAGS - Alle AprilTag ID’s
  • TAG0 tot en met TAG37 - Een enkele AprilTag ID van 0 tot en met 37

count

Optioneel. Hiermee stelt u het maximale aantal objecten in dat kan worden geretourneerd, van 1 tot 24 (standaard: 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)

Eigenschappen#

Er zijn meerdere eigenschappen die bij elk object worden meegeleverd dat in een tuple is opgeslagen nadat get_data is gebruikt.

Alle eigenschapswaarden behalve .id en .type beschrijven de positie, grootte, oriëntatie of richting van het gedetecteerde object op het moment dat get_data werd gebruikt. Deze waarden worden gemeten in pixels of graden. Elke Vision Sensor heeft een andere resolutie:

  • Vooraanzicht: 640 x 480 pixels

  • Naar beneden gericht: 640 x 400 pixels

.exists#

.exists retourneert een Booleaanse waarde die aangeeft of de index in de tuple voorkomt. Retourneert een fout als er geen objecten worden gevonden.

  • True – De index bestaat.

  • False – De index bestaat niet.

# 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 retourneert de breedte van het gedetecteerde object in pixels als een geheel getal van 1 tot 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 retourneert de hoogte van het gedetecteerde object in pixels als een geheel getal van 1 tot 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 retourneert de x-coördinaat van het middelpunt van het gedetecteerde object in pixels als een geheel getal van 1 tot 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 retourneert de y-coördinaat van het middelpunt van het gedetecteerde object in pixels als een geheel getal van 1 tot 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 geeft een hoek terug die de positie van een object ten opzichte van de drone aangeeft. Het gedrag is afhankelijk van welke Vision Sensor wordt gebruikt.

Een waarde van 0° geeft aan dat het middelpunt van het object en de sensor op één lijn liggen. Positieve waarden betekenen dat het object zich rechts bevindt, terwijl negatieve waarden betekenen dat het object zich links bevindt.

Sensor

Retourneert

Omlaag

Het aantal graden waarmee de voorkant van de drone moet draaien om zich uit te lijnen met het midden van het object, van –180º tot 180º.

Vooruit

De hoek waarin het object zich links of rechts van het midden van de Vision Sensor bevindt, varieert van –180º tot 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 retourneert de oriëntatie van de gedetecteerde AprilTag ID als een geheel getal in graden van 1 tot 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 retourneert de x-coördinaat van de linkerbovenhoek van het begrenzingskader van het gedetecteerde object in pixels als een geheel getal van 1 tot 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 retourneert de y-coördinaat van de linkerbovenhoek van het begrenzingskader van het gedetecteerde object in pixels als een geheel getal van 1 tot 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 retourneert het identificatienummer van de gedetecteerde AprilTag ID als een geheel getal van 0 tot 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 geeft aan welk type object is gedetecteerd. Het zal het volgende retourneren:

Objecttype

Numerieke waarde

Inbegrepen objecten

drone.vision.TAG_OBJECT

8

AprilTag-ID’s

drone.vision.COLOR_OBJECT

1

Kleurensignaturen - Binnenkort beschikbaar!

drone.vision.CODE_OBJECT

2

Kleurcodes - Binnenkort beschikbaar!

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