Vīzija#
Ievads#
VEX AIR drona redzes sensors nosaka un izseko AprilTag ID. Tas ļauj dronam analizēt apkārtni, sekot objektiem un reaģēt, pamatojoties uz noteiktajiem vizuālajiem datiem. Zemāk ir saraksts ar visām pieejamajām metodēm un īpašībām:
Getteri – nosaka, vai drons tur priekšmetu.
get_data– Atgriež noteikta paraksta noteikto objektu sarakstu.
Īpašības – No get_data atgrieztie objekta dati.
exists– Vai objekts pastāv pašreizējā noteikšanā.width– Noteiktā objekta platums.height– Noteiktā objekta augstums.centerX– objekta centra X pozīcija.centerY– objekta centra Y pozīcija.bearing– objekta leņķis attiecībā pret priekšējo redzes sensoru vai grādi, kas nepieciešami, lai drons būtu pavērsts pret objektu.rotation– Objekta orientācija.originX– objekta augšējā kreisā stūra X pozīcija.originY– objekta augšējā kreisā stūra Y pozīcija.id– Objekta birkas ID.type– Atgriež objekta tipu.
Getteri#
get_data#
get_data filtrē datus no Redzes sensora kadra līdz vienam parakstam — saglabātam aprakstam par kaut ko, ko sensors var atpazīt, piemēram, AprilTag ID — un atgriež kortežu.
Kortežs saglabā objektus, kas sakārtoti no lielākā līdz mazākajam pēc platuma, sākot ar indeksu 0. Katra objekta īpašībām var piekļūt, izmantojot tā indeksu. Ja netiek atrasti atbilstoši objekti, tiek atgriezts tukšs kortežs.
Usage:
drone.vision.get_data(camera, signature, count)
Parametri |
Apraksts |
|---|---|
|
Kamera, no kuras jāizgūst dati: vai nu |
|
Filtrē datu kopu, lai iekļautu tikai dotā paraksta datus. Pieejamie paraksti ir:
|
|
Neobligāti. Iestata maksimālo atgriezto objektu skaitu no 1 līdz 24 (pēc noklusējuma: 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)
Īpašumi#
Pēc get_data izmantošanas katrā objektā, kas tiek glabāts tuple, ir iekļautas vairākas īpašības.
All property values except .id and .type describe the detected object’s position, size, orientation, or bearing at the moment get_data was used. These values are measured in pixels or degrees. Each Vision Sensor has a different resolution:
Uz priekšu vērsts: 640 x 480 pikseļi
Uz leju vērsts: 640 x 400 pikseļi
.exists#
.exists atgriež Būla vērtību, kas norāda, vai indekss eksistē kortežā. Atgriež kļūdu, ja nav atrasti objekti.
True– Indekss pastāv.False– Indekss nepastāv.
# 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 atgriež noteiktā objekta platumu pikseļos kā veselu skaitli no 1 līdz 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 atgriež noteiktā objekta augstumu pikseļos kā veselu skaitli no 1 līdz 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 atgriež noteiktā objekta centra x koordinātu pikseļos kā veselu skaitli no 1 līdz 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 atgriež noteiktā objekta centra y koordinātu pikseļos kā veselu skaitli no 1 līdz 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 atgriež leņķi, kas norāda objekta pozīciju attiecībā pret dronu. Darbība ir atkarīga no tā, kurš redzes sensors tiek izmantots.
Vērtība 0° norāda, ka objekta centrs un sensors ir izlīdzināti. Pozitīvas vērtības nozīmē, ka objekts atrodas pa labi, bet negatīvas vērtības nozīmē, ka objekts atrodas pa kreisi.
Sensors |
Atgriešana |
|---|---|
Lejup |
Grādi, par kuriem drona priekšpusei jāpagriežas, lai tā izlīdzinātos ar objekta centru, no –180º līdz 180º. |
Uz priekšu |
Grādi, par kuriem objekts ir nobīdīts pa kreisi vai pa labi no redzes sensora centra no –180º līdz 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 atgriež noteiktā AprilTag ID orientāciju kā veselu skaitli grādos no 1 līdz 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 atgriež noteiktā objekta ierobežojošā lodziņa augšējā kreisā stūra x koordinātu pikseļos kā veselu skaitli no 1 līdz 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 atgriež noteiktā objekta ierobežojošā lodziņa augšējā kreisā stūra y koordinātu pikseļos kā veselu skaitli no 1 līdz 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 atgriež noteiktā AprilTag ID identifikācijas numuru kā veselu skaitli no 0 līdz 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 atgriež atrastā objekta tipu. Tiks atgriezta sekojošā vērtība:
Objekta tips |
Skaitliskā vērtība |
Iekļautie objekti |
|---|---|---|
|
8 |
AprilTag ID |
|
1 |
Krāsu paraksti — Drīzumā! |
|
2 |
Krāsu kodi — Drīzumā! |
# 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)