Vizija#

Įvadas#

„VEX AIR“ drono vaizdo jutiklis aptinka ir seka „AprilTag“ ID. Tai leidžia dronui analizuoti aplinką, sekti objektus ir reaguoti pagal aptiktus vaizdinius duomenis. Žemiau pateikiamas visų galimų metodų ir savybių sąrašas:

Getteriai – aptinka, ar dronas laiko objektą.

  • get_data – Grąžina aptiktų objektų rinkinį, skirtą konkrečiam parašui.

Ypatybės – Objekto duomenys, grąžinti iš get_data.

  • exists – Ar objektas egzistuoja dabartiniame aptikime.

  • width – Aptikto objekto plotis.

  • height – Aptikto objekto aukštis.

  • centerX – objekto centro X padėtis.

  • centerY – objekto centro Y padėtis.

  • bearing – Objekto kampas priekinio vaizdo jutiklio atžvilgiu arba laipsniai, reikalingi, kad dronas būtų atsisukęs į objektą.

  • rotation – Objekto orientacija.

  • originX – objekto viršutinio kairiojo kampo X padėtis.

  • originY – objekto viršutinio kairiojo kampo Y padėtis.

  • id – Objekto žymės ID.

  • type – Grąžina objekto tipą.

Getteriai#

get_data#

get_data filtruoja duomenis iš „Vision Sensor“ kadro į vieną parašą – išsaugotą aprašymą to, ką jutiklis gali atpažinti, pvz., „AprilTag“ ID – ir grąžina rinkinį.

Šiame rinkinyje objektai saugomi surūšiuoti nuo didžiausio iki mažiausio pagal plotį, pradedant nuo indekso 0. Kiekvieno objekto properties galima pasiekti naudojant jo indeksą. Jei nerandama atitinkamų objektų, grąžinama tuščia rinkinio reikšmė.

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

Parametrai

Aprašymas

camera

Kamera, iš kurios reikia gauti duomenis: arba DOWNWARD_CAMERA , arba FORWARD_CAMERA.

signature

Filtruoja duomenų rinkinį, kad būtų įtraukti tik nurodyto parašo duomenys. Galimi parašai:

  • ALL_TAGS – Visi „AprilTag“ ID
  • TAG0 iki TAG37 – Vienas „AprilTag“ ID nuo 0 iki 37

count

Pasirinktinai. Nustato maksimalų grąžinamų objektų skaičių nuo 1 iki 24 (numatytoji reikšmė: 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)

Ypatybės#

Kiekvienam objektui, saugomam tuple, panaudojus get_data, priskiriamos kelios savybės.

Visos savybių reikšmės, išskyrus .id ir .type apibūdina aptikto objekto padėtį, dydį, orientaciją arba kryptį tuo metu, kai buvo naudojama funkcija get_data. Šios reikšmės matuojamos pikseliais arba laipsniais. Kiekvienas regėjimo jutiklis turi skirtingą skiriamąją gebą:

  • Į priekį nukreipta: 640 x 480 pikselių

  • Nukreipta žemyn: 640 x 400 pikselių

.exists#

.exists grąžina loginę reikšmę, nurodančią, ar indeksas egzistuoja rinkinyje. Grąžina klaidą, jei neaptiktų objektų.

  • True – Indeksas yra.

  • False – Indekso nėra.

# 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 grąžina aptikto objekto plotį pikseliais kaip sveikąjį skaičių nuo 1 iki 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 grąžina aptikto objekto aukštį pikseliais kaip sveikąjį skaičių nuo 1 iki 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 grąžina aptikto objekto centro x koordinatę pikseliais kaip sveikąjį skaičių nuo 1 iki 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 grąžina aptikto objekto centro y koordinatę pikseliais kaip sveikąjį skaičių nuo 1 iki 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 grąžina kampą, nurodantį objekto padėtį drono atžvilgiu. Elgsena priklauso nuo to, kuris regėjimo jutiklis naudojamas.

0° reikšmė rodo, kad objekto centras ir jutiklis yra sulygiuoti. Teigiamos reikšmės reiškia, kad objektas yra dešinėje, o neigiamos reikšmės – kad objektas yra kairėje.

Jutiklis

Grąžinimai

Žemyn

Laipsnių, kuriais drono priekis turi pasisukti, kad sulygiuotų su objekto centru, nuo –180º iki 180º.

Pirmyn

Laipsniai, kiek objektas yra paslinktas į kairę arba į dešinę nuo regėjimo jutiklio centro nuo –180º iki 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 grąžina aptikto „AprilTag“ ID orientaciją kaip sveikąjį skaičių laipsniais nuo 1 iki 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 grąžina aptikto objekto ribojančio langelio viršutinio kairiojo kampo x koordinatę pikseliais kaip sveikąjį skaičių nuo 1 iki 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 grąžina aptikto objekto ribojančio langelio viršutinio kairiojo kampo y koordinatę pikseliais kaip sveikąjį skaičių nuo 1 iki 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 grąžina aptikto „AprilTag“ ID identifikacinį numerį kaip sveikąjį skaičių nuo 0 iki 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 grąžina aptikto objekto tipą. Grąžins šiuos duomenis:

Objekto tipas

Skaitinė reikšmė

Įtraukti objektai

drone.vision.TAG_OBJECT

8

AprilTag ID

drone.vision.COLOR_OBJECT

1

Spalvų parašai - Jau greitai!

drone.vision.CODE_OBJECT

2

Spalvų kodai - Jau greitai!

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