Visión#
Introducción#
El sensor de visión del dron VEX AIR detecta y rastrea las identificaciones de AprilTag. Esto permite que el dron analice su entorno, siga objetos y reaccione en función de los datos visuales detectados. A continuación se muestra una lista de todos los métodos y propiedades disponibles:
Getters – Detecta si el dron está sosteniendo un objeto.
get_data– Devuelve una tupla de objetos detectados para una firma específica.
Propiedades: datos de objetos devueltos desde get_data.
exists– Si el objeto existe en la detección actual.width– Ancho del objeto detectado.height– Altura del objeto detectado.centerX– Posición X del centro del objeto.centerY– Posición Y del centro del objeto.bearing– Ángulo del objeto en relación con el sensor de visión frontal o los grados necesarios para que el dron mire hacia el objeto.rotation– Orientación del objeto.originX– Posición X de la esquina superior izquierda del objeto.originY– Posición Y de la esquina superior izquierda del objeto.id– ID de etiqueta del objeto.type– Devuelve el tipo del objeto.
Getters#
get_data#
get_data filtra los datos del marco del sensor de visión en una sola firma, una descripción guardada de algo que el sensor puede reconocer, como un ID de AprilTag, y devuelve una tupla.
La tupla almacena objetos ordenados de mayor a menor por ancho, comenzando en el índice 0. Se puede acceder a las propiedades de cada objeto utilizando su índice. Se devuelve una tupla vacía si no se detectan objetos coincidentes.
Usage:
drone.vision.get_data(camera, signature, count)
Parámetros |
Descripción |
|---|---|
|
La cámara para recuperar datos de: la |
|
Filtra el conjunto de datos para incluir solo los datos de la firma dada. Las firmas disponibles son:
|
|
Opcional. Establece el número máximo de objetos que se pueden devolver de 1 a 24 (predeterminado: 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)
Propiedades#
Hay varias propiedades que se incluyen con cada objeto almacenado en una tupla después de usar get_data.
Todos los valores de propiedad, excepto .id y .type describen la posición, el tamaño, la orientación o el rumbo del objeto detectado en el momento en que se utilizó get_data. Estos valores se miden en píxeles o grados. Cada sensor de visión tiene una resolución diferente:
Orientado hacia adelante: 640 x 480 píxeles
Orientado hacia abajo: 640 x 400 píxeles
.exists#
.exists devuelve un valor booleano que indica si el índice existe en la tupla. Devuelve un error si no hay objetos detectados.
True: el índice existe.False– El índice no existe.
# 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 devuelve el ancho del objeto detectado en píxeles como un número entero de 1 a 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 devuelve la altura del objeto detectado en píxeles como un número entero de 1 a 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 devuelve la coordenada x del centro del objeto detectado en píxeles como un número entero de 1 a 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 devuelve la coordenada y del centro del objeto detectado en píxeles como un número entero de 1 a 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 devuelve un ángulo que indica la posición de un objeto con respecto al dron. El comportamiento depende del sensor de visión que se utilice.
Un valor de 0° indica que el centro del objeto y el sensor están alineados. Los valores positivos significan que el objeto está a la derecha, mientras que los valores negativos significan que el objeto está a la izquierda.
Sensor |
Devoluciones |
|---|---|
Hacia abajo |
Grados la parte frontal del dron debe girar para alinearse con el centro del objeto, de –180º a 180º. |
Reenviar |
Grados en que el objeto está desplazado a la izquierda o derecha del centro del sensor de visión de –180º a 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 devuelve la orientación del ID de AprilTag detectado como un número entero en grados de 1 a 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 devuelve la coordenada x de la esquina superior izquierda del cuadro delimitador del objeto detectado en píxeles como un número entero de 1 a 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 devuelve la coordenada y de la esquina superior izquierda del cuadro delimitador del objeto detectado en píxeles como un número entero de 1 a 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 devuelve el número de identificación del ID de AprilTag detectado como un número entero de 0 a 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 devuelve qué tipo de objeto se detecta. Devolverá lo siguiente:
Tipo de objeto |
Valor numérico |
Objetos incluidos |
|---|---|---|
|
8 |
AprilTag IDs |
|
1 |
Firmas en color - * ¡Próximamente!* |
|
2 |
Códigos de color - * ¡Próximamente!* |
# 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)