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 |
|---|---|
|
Kamera, josta tiedot noudetaan: joko |
|
Suodattaa tietojoukon sisältämään vain annetun allekirjoituksen tiedot. Käytettävissä olevat allekirjoitukset ovat:
|
|
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 |
|---|---|---|
|
8 |
AprilTag-tunnukset |
|
1 |
Väriallekirjoitukset - Tulossa pian! |
|
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)