Visión#

Introducción#

El sensor de visión del dron VEX AIR detecta y rastrea los identificadores de AprilTag. Esto permite al dron analizar su entorno, seguir objetos y reaccionar según los datos visuales detectados. A continuación, se muestra una lista de todos los métodos y propiedades disponibles:

Getters – Detecta si el dron sostiene un objeto.

  • get_data – Devuelve una tupla de objetos detectados para una firma específica.

Propiedades: datos del objeto devueltos desde get_data.

  • exists – Indica 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 con respecto al sensor de visión frontal o los grados necesarios para que el dron apunte al 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.

Captadores#

get_data#

get_data filtra los datos del fotograma del sensor de visión a una única 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 mediante su índice. Si no se detectan objetos coincidentes, se devuelve una tupla vacía.

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

Parámetros

Descripción

camera

La cámara de la que se recuperarán los datos: ya sea la DOWNWARD_CAMERA o la FORWARD_CAMERA.

signature

Filtra el conjunto de datos para incluir solo los datos de la firma especificada. Las firmas disponibles son:

  • ALL_TAGS - Todos los ID de AprilTag
  • TAG0 a TAG37 - Un único ID de AprilTag del 0 al 37

count

Opcional. Establece el número máximo de objetos que se pueden devolver, de 1 a 24 (valor 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 múltiples propiedades que se incluyen con cada objeto almacenado en una tupla después de que se utiliza 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

  • Mirando 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 se detectan objetos.

  • 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 utilizado.

Un valor de 0° indica que el centro del objeto y el sensor están alineados. Los valores positivos indican que el objeto está a la derecha, mientras que los negativos indican que está a la izquierda.

Sensor

Devoluciones

Hacia abajo

Grados que debe girar la parte frontal del dron para alinearse con el centro del objeto, de –180º a 180º.

Adelante

Grados en los que el objeto se desplaza hacia la izquierda o la 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 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 AprilTag detectado como un número entero del 0 al 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

drone.vision.TAG_OBJECT

8

Identificadores de AprilTag

drone.vision.COLOR_OBJECT

1

Firmas de color - ¡Próximamente!

drone.vision.CODE_OBJECT

2

Códigos de colores - ¡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)