Visio#

Johdanto#

VEX AIR -dronen näkösensori tunnistaa ja seuraa AprilTag-tunnuksia. Tämän avulla drone voi analysoida ympäristöään, seurata kohteita ja reagoida havaittujen visuaalisten tietojen perusteella. Alla on luettelo kaikista käytettävissä olevista menetelmistä ja ominaisuuksista:

Getterit – Havaitsevat, piteleekö drone esinettä.

  • get_data – Palauttaa tietyn allekirjoituksen havaittujen objektien tuplen.

Ominaisuudet – get_data-funktiosta palautetut objektitiedot

  • exists – Onko kohde olemassa nykyisessä havainnossa.

  • width – Havaitun kohteen leveys.

  • height – Havaitun kohteen korkeus.

  • centerX – Objektin keskipisteen X-sijainti.

  • centerY – Objektin keskipisteen Y-sijainti.

  • bearing – Kohteen kulma suhteessa etunäköanturiin tai asteet, jotka tarvitaan, jotta drone on kohteen edessä.

  • rotation – Kohteen suunta.

  • originX – Objektin vasemman yläkulman X-sijainti.

  • originY – Objektin vasemman yläkulman Y-sijainti.

  • id – Objektin tunnistetunnus.

  • type – Palauttaa objektin tyypin.

Getterit#

get_data#

get_data suodattaa Vision Sensor -kehyksen tiedot yhdeksi allekirjoitukseksi – tallennetuksi kuvaukseksi jostakin, jonka anturi tunnistaa, kuten AprilTag-tunnukseksi – ja palauttaa tuplen.

Tuple tallentaa objektit leveyden mukaan suurimmasta pienimpään järjestettyinä alkaen indeksistä 0. Kunkin objektin properties-ominaisuuksiin pääsee käsiksi sen indeksin avulla. Jos vastaavia objekteja ei löydy, palautetaan tyhjä tuple.

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

Parametrit

Kuvaus

camera

Kamera, josta tiedot noudetaan: joko DOWNWARD_CAMERA tai FORWARD_CAMERA.

signature

Suodattaa tietojoukon sisältämään vain annetun allekirjoituksen tiedot. Käytettävissä olevat allekirjoitukset ovat:

  • ALL_TAGS - Kaikki AprilTag-tunnukset
  • TAG0 TAG37 - Yksi AprilTag-tunnus väliltä 0–37

count

Valinnainen. Asettaa palautettavien objektien enimmäismäärän väliltä 1–24 (oletus: 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)

Ominaisuudet#

get_data -funktion käytön jälkeen jokaiseen tuple-tupleen tallennettuun objektiin sisältyy useita ominaisuuksia.

Kaikki ominaisuusarvot paitsi .id ja .type kuvaavat havaitun kohteen sijainnin, koon, suunnan tai suuntauksen sillä hetkellä, kun get_data käytettiin. Nämä arvot mitataan pikseleinä tai asteina. Jokaisella konenäköanturilla on eri resoluutio:

  • Eteenpäin: 640 x 480 pikseliä

  • Alaspäin: 640 x 400 pikseliä

.exists#

.exists palauttaa totuusarvon, joka ilmaisee, onko indeksi olemassa tuplessa. Palauttaa virheen, jos objekteja ei ole havaittu.

  • True – Indeksi on olemassa.

  • False – Indeksiä ei ole olemassa.

# 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 palauttaa havaitun objektin leveyden pikseleinä kokonaislukuna 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 palauttaa havaitun objektin korkeuden pikseleinä kokonaislukuna 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 palauttaa havaitun objektin keskipisteen x-koordinaatin pikseleinä kokonaislukuna 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 palauttaa havaitun objektin keskipisteen y-koordinaatin pikseleinä kokonaislukuna 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 palauttaa kulman, joka ilmaisee kohteen sijainnin drooniin nähden. Toiminta riippuu käytetystä näköanturista.

Arvo 0° osoittaa, että kohteen keskikohta ja anturi ovat linjassa. Positiiviset arvot tarkoittavat, että kohde on oikealla, kun taas negatiiviset arvot tarkoittavat, että kohde on vasemmalla.

Anturi

Palautukset

Alaspäin

Asteita, jotka dronin etuosan on käännyttävä linjatakseen kohteen keskipisteen kanssa, –180º - 180º.

Eteenpäin

Astetta, jolla kohde on siirtynyt näköanturin keskikohdasta vasemmalle tai oikealle välillä –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 palauttaa havaitun AprilTag-tunnuksen suunnan kokonaislukuna asteina 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 palauttaa havaitun objektin rajaavan laatikon vasemman yläkulman x-koordinaatin pikseleinä kokonaislukuna 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 palauttaa havaitun objektin rajaavan laatikon vasemman yläkulman y-koordinaatin pikseleinä kokonaislukuna 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 palauttaa havaitun AprilTag-tunnuksen tunnistenumeron kokonaislukuna väliltä 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 palauttaa havaitun objektin tyypin. Se palauttaa seuraavat arvot:

Objektityyppi

Numeerinen arvo

Sisältyvät objektit

drone.vision.TAG_OBJECT

8

AprilTag-tunnukset

drone.vision.COLOR_OBJECT

1

Väriallekirjoitukset - Tulossa pian!

drone.vision.CODE_OBJECT

2

Värikoodit - Tulossa pian!

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