Visión de IA#
Introducción#
El sensor de visión AI del robot de codificación VEX AI detecta y rastrea objetos, colores e ID de AprilTag. Esto permite al robot analizar su entorno, seguir objetos y reaccionar en función de los datos visuales detectados.
El sensor de visión AI tiene una resolución de 320×240 píxeles. El origen (0, 0) se encuentra en la esquina superior izquierda, colocando el centro del sensor en (160, 120), como se muestra en el siguiente diagrama:

A continuación se muestra una lista de todos los métodos y propiedades:
Acciones: muestra u oculta el feed de la cámara AI Vision.
show_aivision— Muestra el feed de AI Vision en la pantalla del robot.hide_aivision— Oculta el feed de AI Vision de la pantalla.tag_detection— Activa o desactiva la detección de ID de AprilTag.
Getters — Detecta si el robot está sosteniendo un objeto.
get_data— Devuelve una tupla de objetos detectados para una firma específica.has_sports_ball— Devuelve si el robot tiene una pelota deportiva.has_any_barrel— Devuelve si el robot tiene algún tipo de barril.has_blue_barrel— Devuelve si el robot tiene un barril azul.has_orange_barrel— Devuelve si el robot tiene un barril naranja.
Propiedades: datos de objetos devueltos desde get_data.
exists— Si el objeto existe en la detección actual como un booleano.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 horizontal relativo a la parte frontal del robot.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— Clasificación o ID de etiqueta del objeto.score— Puntuación de confianza para las clasificaciones de IA.type— Devuelve el tipo de objeto (AI, Etiqueta, Color o Código).
Constructores: defina las firmas y los códigos de color.
Crear una firma de color — Crea una nueva firma de color basada en RGB y rangos de tono/saturación.
Crear un código de color — Combina varias firmas de color en un solo código de color.
Acciones#
show_aivision#
show_aivision muestra la alimentación de datos en vivo del sensor de visión AI en la pantalla del robot. El feed de datos en vivo cubrirá cualquier otra imagen o texto en la pantalla.
Nota: La pantalla no mostrará ninguna otra imagen o texto a menos que se utilice hide_aivision para ocultar el feed.
Usage:
robot.screen.show_aivision()
Parámetros |
Descripción |
|---|---|
Este método no tiene parámetros. |
# Watch the AI Vision Sensor detect AI Classifications
# and AprilTag IDs as you move the robot
robot.screen.show_aivision()
hide_aivision#
hide_aivision elimina la alimentación de datos en vivo del sensor de visión de IA de la pantalla del robot.
Usage:
robot.screen.hide_aivision()
Parámetros |
Descripción |
|---|---|
Este método no tiene parámetros. |
# View the AI Vision Sensor's feed for five seconds
robot.screen.show_aivision()
wait(5, SECONDS)
robot.screen.hide_aivision()
tag_detection#
tag_detection habilita o deshabilita la detección de ID de AprilTag, donde el estado es un valor booleano.
El sensor puede detectar las ID de AprilTag de 0 a 36 de la familia Circle21h7.
Usage:
robot.vision.tag_detection(state)
Parámetros |
Descripción |
|---|---|
|
Los valores son: |
robot.screen.set_font(PROP30)
# Cut off AprilTag ID detection after 5 seconds
while True:
if timer.time(SECONDS) > 5:
robot.vision.tag_detection(False)
robot.screen.clear_screen()
robot.screen.set_cursor(3, 1)
apriltags = robot.vision.get_data(ALL_TAGS)
if apriltags[0].exists:
robot.screen.print("AprilTag ID detected!")
else:
robot.screen.print("Nothing detected!")
wait(0.1, SECONDS)
Getters#
get_data#
get_data filtra los datos del marco del sensor de visión de IA a una sola firma (una descripción guardada de algo que el sensor puede reconocer, como un objeto preentrenado, un ID de AprilTag o una firma de color o código de color configurado) y devuelve una tupla.
Las firmas de color y los códigos de color deben configurarse primero en AI Vision Utility antes de que puedan usarse con este método.
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:
robot.vision.get_data(signature, count)
Parámetros |
Descripción |
|---|---|
|
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). |
Nota: Los ID de AprilTag del 5 al 37 se pueden obtener utilizando los ID de AprilTag impresos de AIM Printables.
# Move forward if a sports ball is detected
while True:
ball = robot.vision.get_data(SPORTS_BALL)
if ball[0].exists:
robot.move_for(10, 0)
wait(50, MSEC)
Nota: La tupla devuelta se puede ordenar por cualquier propiedad, no solo por el ancho, utilizando la función sorted de Python. Por ejemplo, ordenar por ID de AprilTag:
# Print each detected AprilTag ID in ascending order by ID
while True:
apriltags = sorted(robot.vision.get_data(ALL_TAGS), key=id)
for tag in apriltags:
print(tag.id)
wait(1, SECONDS)
O, en su lugar, ordenar por altura:
# Print each detected AprilTag ID in ascending order by height
while True:
apriltags_by_height = sorted(robot.vision.get_data(ALL_TAGS), key=lambda tag: tag.height)
for tag in apriltags_by_height:
print(tag.height)
wait(1, SECONDS)
Visualización de datos#
La impresión de la tupla devuelta por get_data muestra una lista de todas las propiedades de todos los objetos detectados:
# Display properties of all detected AprilTag IDs
while True:
vision_data = robot.vision.get_data(ALL_TAGS)
if vision_data[0].exists:
break
wait(0.25, SECONDS)
print(vision_data)

Clasificaciones de IA#
El sensor DE visión AI AI puede detectar estas clasificaciones de IA:
Número de identificación |
Clasificación de IA |
Firma |
|---|---|---|
0 |
Bola |
|
1 |
Barril azul |
|
2 |
Barril de naranja |
|
3 |
Robot AIM |
|
Firmas de color#
Una firma de color es un color único que el sensor de visión AI puede reconocer. Estas firmas permiten que el sensor detecte y rastree objetos en función de su color. Una vez que se configura una firma de color, el sensor puede identificar objetos con ese color específico en su campo de visión. Las firmas de color se utilizan con get_data para procesar y detectar objetos de color en tiempo real.

# Display if any objects match the Red_Box signature
while True:
robot.screen.set_cursor(1, 1)
robot.screen.clear_row(1)
# Change to any configured Color Signature
ai_objects = robot.vision.get_data(Red_Box)
if ai_objects[0].exists:
robot.screen.print("Color signature detected!")
Códigos de color#
Un código de color es un patrón estructurado formado por 2 a 4 firmas de color dispuestas en un orden específico. Estos códigos permiten que el sensor de visión AI reconozca patrones predefinidos de colores. Los códigos de color son útiles para identificar objetos complejos o crear marcadores únicos para la navegación autónoma.

# Display if any objects match the BlueRed code
while True:
robot.screen.set_cursor(1, 1)
robot.screen.clear_row(1)
# Change to any configured Color Code
ai_objects = robot.vision.get_data(BlueRed)
if ai_objects[0].exists:
robot.screen.print("Color code detected!")
has_sports_ball#
has_sports_ball devuelve un booleano que indica si el robot tiene actualmente una pelota deportiva.
True: el robot tiene una pelota deportiva.False: el robot no tiene una pelota deportiva.
Usage:
robot.has_sports_ball()
Parámetros |
Descripción |
|---|---|
Este método no tiene parámetros. |
# Kick when the robot has a sports ball
while True:
if robot.has_sports_ball():
robot.kicker.kick(MEDIUM)
wait(50, MSEC)
has_any_barrel#
has_any_barrel devuelve un booleano que indica si el robot tiene actualmente algún tipo de barril.
True: el robot tiene un barril.False— El robot no tiene barril.
Usage:
robot.has_any_barrel()
Parámetros |
Descripción |
|---|---|
Este método no tiene parámetros. |
# Push a barrel away when detected
while True:
if robot.has_any_barrel():
robot.kicker.place()
wait(50, MSEC)
has_blue_barrel#
has_blue_barrel devuelve un booleano que indica si el robot tiene actualmente un barril azul.
True: el robot tiene un barril azul.False— El robot no tiene un barril azul.
Usage:
robot.has_blue_barrel()
Parámetros |
Descripción |
|---|---|
Este método no tiene parámetros. |
# Push a blue barrel away when detected
while True:
if robot.has_blue_barrel():
robot.kicker.place()
wait(50, MSEC)
has_orange_barrel#
has_orange_barrel devuelve un booleano que indica si el robot tiene actualmente un barril naranja.
True: el robot tiene un barril naranja.False— El robot no tiene un barril naranja.
Usage:
robot.has_orange_barrel()
Parámetros |
Descripción |
|---|---|
Este método no tiene parámetros. |
# Push an orange barrel away when detected
while True:
if robot.has_orange_barrel():
robot.kicker.place()
wait(50, MSEC)
Propiedades#
Hay doce propiedades que se incluyen con cada objeto almacenado en una tupla después de que se utiliza el método robot.vision.get_data.
Todos los valores de propiedad, excepto .id, .score 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ó robot.vision.get_data. Estos valores se miden en píxeles o grados, en función de la resolución de 320 por 240 píxeles del sensor.

.exists#
.exists devuelve un booleano que indica si el índice existe en la tupla o no.
True: el índice existe.False— El índice no existe.
# Check if at least two objects are detected
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
ai_objects = robot.vision.get_data(ALL_CARGO)
if ai_objects[0].exists:
if ai_objects[1].exists:
robot.screen.print("At least 2")
else:
robot.screen.print("Less than 2")
wait(0.1, SECONDS)
.width#
.width devuelve el ancho del objeto detectado en píxeles, que es un número entero entre 1 y 320.
Nota: Los valores de píxeles son relativos al sistema de coordenadas del sensor. Consulte el diagrama en la Introducción como referencia.

# Move towards a Blue Barrel until its width is
# larger than 100 pixels
while True:
barrel = robot.vision.get_data(BLUE_BARREL)
if barrel[0].exists:
if barrel[0].width < 100:
robot.move_at(0)
else:
robot.stop_all_movement()
wait(50, MSEC)
.height#
.height devuelve la altura del objeto detectado en píxeles, que es un número entero entre 1 y 240.
Nota: Los valores de píxeles son relativos al sistema de coordenadas del sensor. Consulte el diagrama en la Introducción como referencia.

# Move towards a Blue Barrel until its height is
# larger than 100 pixels
while True:
barrel = robot.vision.get_data(BLUE_BARREL)
if barrel[0].exists:
if barrel[0].height < 100:
robot.move_at(0)
else:
robot.stop_all_movement()
wait(50, MSEC)
.centerX#
.centerX devuelve la coordenada x del centro del objeto detectado en píxeles, que es un entero entre 0 y 320.
Nota: Los valores de píxeles son relativos al sistema de coordenadas del sensor. Consulte el diagrama en la Introducción como referencia.

# Turn slowly until a Blue Barrel is centered in
# front of the robot
robot.set_turn_velocity(30)
robot.turn(RIGHT)
while True:
barrel = robot.vision.get_data(BLUE_BARREL)
if barrel[0].exists:
if 140 < barrel[0].centerX < 180:
robot.stop_all_movement()
wait(10,MSEC)
.centerY#
.centerY devuelve la coordenada y del centro del objeto detectado en píxeles, que es un número entero entre 0 y 240.
Nota: Los valores de píxeles son relativos al sistema de coordenadas del sensor. Consulte el diagrama en la Introducción como referencia.

# Move towards a Blue Barrel until its
# center y-coordinate is more than 140 pixels
while True:
barrel = robot.vision.get_data(BLUE_BARREL)
if barrel[0].exists:
if barrel[0].centerY < 140:
robot.move_at(0)
else:
robot.stop_all_movement()
wait(50, MSEC)
.bearing#
.bearing devuelve un decimal (float) que representa la distancia de un objeto a la izquierda o a la derecha del centro de la vista del sensor de visión de IA en grados. Un valor de 0 significa que está centrado, los valores positivos indican que el objeto está a la derecha y los valores negativos indican que el objeto está a la izquierda.
# Turn to keep the Blue Barrel directly in front
robot.set_turn_velocity(40)
while True:
vision_data = robot.vision.get_data(BLUE_BARREL)
if vision_data[0].exists:
if vision_data[0].bearing > 5:
robot.turn(RIGHT)
elif vision_data[0].bearing < -5:
robot.turn(LEFT)
else:
robot.stop_all_movement()
else:
robot.stop_all_movement()
wait(0.1, SECONDS)
.rotation#
.rotation devuelve la orientación del objeto en el plano de visión del sensor de visión AI, medida en grados de 0 a 359. Un código de color es 0° cuando sus colores están dispuestos en una línea horizontal (por ejemplo, rojo-azul). Si se giran los colores, el ángulo cambia (por ejemplo, la disposición azul-rojo devuelve 180°).
Para el ejemplo a continuación, el Código de color se ha configurado con rojo a la izquierda y azul a la derecha.
En esta imagen, poner azul encima de rojo equivale a girar el código de color original 270 grados a la derecha.

# Slide left or right depending on how a Color Code (BlueRed)
# is rotated on the vertical plane
while True:
# Original Color Code is Red to the left, Blue to the right
code = robot.vision.get_data(BlueRed)
if code[0].exists:
# Check if Color Code is now Red on top of Blue
if 50 < code[0].rotation < 100 :
robot.move_at(90)
# Check if Color Code is now Blue on top of Red
elif 270 < code[0].rotation < 330 :
robot.move_at(270)
else:
robot.stop_all_movement()
else:
robot.stop_all_movement()
wait(50, MSEC)
.originX#
.originX devuelve la coordenada x de la esquina superior izquierda del cuadro delimitador del objeto detectado en píxeles, que es un número entero entre 0 y 320.
Nota: Los valores de píxeles son relativos al sistema de coordenadas del sensor. Consulte el diagrama en la Introducción como referencia.

# Display if an Orange Barrel is to the
# left or the right
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1,1)
orange_barrel = robot.vision.get_data(ORANGE_BARREL)
if orange_barrel[0].exists:
if orange_barrel[0].originX < 160:
robot.screen.print("To the left!")
else:
robot.screen.print("To the right!")
wait(50, MSEC)
.originY#
.originY devuelve la coordenada y de la esquina superior izquierda del cuadro delimitador del objeto detectado en píxeles, que es un número entero entre 0 y 240.
Nota: Los valores de píxeles son relativos al sistema de coordenadas del sensor. Consulte el diagrama en la Introducción como referencia.

# Display if an Orange Barrel is close or far
# from the robot
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
orange_barrel = robot.vision.get_data(ORANGE_BARREL)
if orange_barrel[0].exists:
if orange_barrel[0].originY < 80:
robot.screen.print("Far")
else:
robot.screen.print("Close")
wait(50, MSEC)
.id#
.id devuelve el ID de la Clasificación de IA detectada o el ID de AprilTag como un número entero.
Para un ID de AprilTag, la propiedad .id representa el número de ID de AprilTag detectado en el rango de 0 a 37. Para una Clasificación de IA, la propiedad .id corresponde al ID predefinido en la sección Clasificaciones de IA.
# Move forward when AprilTag ID 1 is detected
while True:
apriltags = robot.vision.get_data(ALL_TAGS)
if apriltags[0].exists:
if apriltags[0].id == 1:
robot.move_at(0)
else:
robot.stop_all_movement()
wait(50, MSEC)
.score#
.score devuelve la puntuación de confianza de la Clasificación de IA detectada como un número entero entre 1 y 100.
Una puntuación más baja significa que el sensor tiene menos confianza en el objeto detectado, mientras que una puntuación más alta significa que el sensor tiene más confianza.
# Look confident if an Orange Barrel is detected
while True:
barrel = robot.vision.get_data(ORANGE_BARREL)
if barrel[0].exists:
if barrel[0].score > 95:
robot.screen.show_emoji(CONFIDENT)
else:
robot.screen.hide_emoji()
wait(50, MSEC)
.type#
.type devuelve un número entero que indica el tipo de objeto detectado. Puede comparar este valor utilizando el número de tipo o la constante con nombre correspondiente:
Tipo de objeto |
Objetos incluidos |
|---|---|
|
— Balones deportivos |
|
— AprilTag IDs |
|
— Firmas de color |
|
— Códigos de color |
# Display if an AprilTag ID or AI Classification
# is detected
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
vision_data = robot.vision.get_data(ALL_VISION)
if vision_data[0].exists:
if vision_data[0].type == AiVision.AI_OBJECT:
robot.screen.print("AI Object!")
elif vision_data[0].type == AiVision.TAG_OBJECT:
robot.screen.print("AprilTag ID!")
wait(0.1, SECONDS)
# Display a list of all detected objects
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
vision_data = robot.vision.get_data(ALL_VISION)
if vision_data[0].exists:
for obj in vision_data:
if obj.type == AiVision.AI_OBJECT:
robot.screen.print("- AI Object")
elif obj.type == AiVision.TAG_OBJECT:
robot.screen.print("- AprilTag ID")
robot.screen.next_row()
wait(0.1, SECONDS)
Constructores#
Creating a Color Signature#
Se crea una nueva firma de color utilizando el constructor Colordesc y luego se registra con el sensor de visión AI utilizando el método color_description. Un objeto Colordesc define 1 de hasta 7 firmas de color detectables para el sensor, pero debe establecerse explícitamente utilizando color_description para que surta efecto.
Uso de Colordesc:
Colordesc(index, red, green, blue, hangle, hdsat)
Parámetro |
Descripción |
|---|---|
|
Un número entero del 1 al 7 que representa el índice de firma de color. Si dos firmas de color usan el mismo índice, la segunda anulará la primera. |
|
Un entero de 0 a 255 para el componente rojo del color. |
|
Un entero de 0 a 255 para el componente verde del color. |
|
Un entero de 0 a 255 para el componente azul del color. |
|
Un flotador de 1 a 40 que representa el rango de tonalidad en grados. |
|
Un flotador de 0.10 a 1.00 que representa el rango de saturación. |
color_description Uso:
robot.vision.color_description(object)
Parámetro |
Descripción |
|---|---|
|
El |
# Detect a red object
red_box = Colordesc(1, 207, 19, 25, 10.00, 0.20)
robot.vision.color_description(red_box)
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
red_boxes = robot.vision.get_data(red_box)
if red_boxes[0].exists:
robot.screen.print("Red detected!")
else:
robot.screen.print("No red detected.")
wait(0.2, SECONDS)
Creating a Color Code#
Se crea un nuevo código de color utilizando el constructor Codedesc y luego se activa utilizando el método code_description Un código de color agrupa de 2 a 4 objetos Colordesc existentes en un único identificador que el sensor de visión de IA puede detectar como una secuencia, pero debe configurarse explícitamente utilizando code_description para que surta efecto.
Uso de Codedesc:
Codedesc(index, c1, c2, c3, c4, c5)
Parámetro |
Descripción |
|---|---|
|
El índice del Código de Colores, del 1 al 8. Nota: Si crea dos objetos de |
|
El primer |
|
El segundo |
|
Opcional. Un tercer |
|
Opcional. Un cuarto |
CODE_Description Uso:
robot.vision.code_description(object)
Parámetro |
Descripción |
|---|---|
|
Un |
# Create Color Signatures
red_box = Colordesc(1, 207, 19, 25, 10.00, 0.20)
purple_box = Colordesc(2, 98, 18, 227, 10.00, 0.20)
robot.vision.color_description(red_box)
robot.vision.color_description(purple_box)
# Detect a red_purple Color Code
red_purple = Codedesc(1, red_box, purple_box)
robot.vision.code_description(red_purple)
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
code_objects = robot.vision.get_data(red_purple)
if code_objects[0].exists:
robot.screen.print("Code detected!")
else:
robot.screen.print("No code detected.")
wait(0.2, SECONDS)