Vision#
Introduktion#
VEX AIR-drönarens visionssensor detekterar och spårar AprilTag-ID:n. Detta gör att drönaren kan analysera sin omgivning, följa objekt och reagera baserat på detekterad visuell data. Nedan följer en lista över alla tillgängliga metoder och egenskaper:
Getters – Detekterar om drönaren håller ett föremål.
get_data– Returnerar en tupel av detekterade objekt för en specifik signatur.
Egenskaper – Objektdata returnerad från get_data.
exists– Om objektet existerar i den aktuella detekteringen.width– Bredd på det detekterade objektet.height– Det detekterade objektets höjd.centerX– X-positionen för objektets centrum.centerY– Y-positionen för objektets centrum.bearing– Objektets vinkel i förhållande till den främre synsensorn eller de grader som behövs för att drönaren ska vara vänd mot objektet.rotation– Objektets orientering.originX– X-positionen för objektets övre vänstra hörn.originY– Y-positionen för objektets övre vänstra hörn.id– Objektets tagg-ID.type– Returnerar objektets typ.
Getters#
get_data#
get_data filtrerar data från Vision Sensor-ramen till en enda signatur – en sparad beskrivning av något som sensorn kan känna igen, till exempel ett AprilTag-ID – och returnerar en tupel.
Tupeln lagrar objekt sorterade från störst till minst efter bredd, med början vid index 0. Varje objekts egenskaper kan nås med hjälp av dess index. En tom tupel returneras om inga matchande objekt upptäcks.
Usage:
drone.vision.get_data(camera, signature, count)
Parametrar |
Beskrivning |
|---|---|
|
Kameran att hämta data från: antingen |
|
Filtrerar datamängden för att endast inkludera data från den givna signaturen. Tillgängliga signaturer är:
|
|
Valfritt. Anger det maximala antalet objekt som kan returneras från 1 till 24 (standard: 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)
Fastigheter#
Det finns flera egenskaper som ingår i varje objekt som lagras i en tupel efter att get_data har använts.
Alla egenskapsvärden utom .id och .type beskriver det detekterade objektets position, storlek, orientering eller bäring vid det ögonblick då get_data användes. Dessa värden mäts i pixlar eller grader. Varje synsensor har en annan upplösning:
Framåtriktad: 640 x 480 pixlar
Nedåtvänd: 640 x 400 pixlar
.exists#
.exists returnerar ett booleskt värde som anger om indexet finns i tupeln. Returnerar ett fel om inga objekt upptäcks.
True– Indexet finns.False– Indexet finns inte.
# 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 returnerar bredden på det detekterade objektet i pixlar som ett heltal från 1 till 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 returnerar höjden på det detekterade objektet i pixlar som ett heltal från 1 till 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 returnerar x-koordinaten för det detekterade objektets centrum i pixlar som ett heltal från 1 till 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 returnerar y-koordinaten för det detekterade objektets centrum i pixlar som ett heltal från 1 till 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 returnerar en vinkel som anger ett objekts position i förhållande till drönaren. Beteendet beror på vilken visionssensor som används.
Ett värde på 0° indikerar att objektets och sensorns mitt är i linje. Positiva värden betyder att objektet är till höger, medan negativa värden betyder att objektet är till vänster.
Sensor |
Returer |
|---|---|
Nedåt |
Grader som drönarens framsida måste vridas för att passa in i objektets mitt, från –180º till 180º. |
Fram |
Grader som objektet är förskjutet till vänster eller höger om synsensorns centrum från –180º till 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 returnerar orienteringen för det detekterade AprilTag-ID:t som ett heltal i grader från 1 till 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 returnerar x-koordinaten för det övre vänstra hörnet av det detekterade objektets avgränsningsram i pixlar som ett heltal från 1 till 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 returnerar y-koordinaten för det övre vänstra hörnet av det detekterade objektets avgränsningsram i pixlar som ett heltal från 1 till 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 returnerar identifieringsnumret för det detekterade AprilTag-ID:t som ett heltal från 0 till 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 returnerar vilken typ av objekt som upptäcks. Den returnerar följande:
Objekttyp |
Numeriskt värde |
Inkluderade objekt |
|---|---|---|
|
8 |
AprilTag-ID:n |
|
1 |
Färgsignaturer - Kommer snart! |
|
2 |
Färgkoder - Kommer snart! |
# 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)