Visión de IA#

Introducción#

El sensor de visión con IA del robot de codificación VEX AIM detecta y rastrea objetos, colores e identificadores 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 con IA tiene una resolución de 320 × 240 píxeles. El origen (0, 0) se encuentra en la esquina superior izquierda, lo que sitúa el centro del sensor en (160, 120), como se muestra en el diagrama a continuación:

Diagrama que muestra la resolución del sensor de visión AIM AI, con la coordenada 0, 0 en la esquina superior izquierda del diagrama, 320, 0 en la esquina superior derecha y 0, 240 en la esquina inferior izquierda, con 160, 120 en el centro exacto.

A continuación se muestra una lista de todos los métodos y propiedades:

Acciones: Mostrar u ocultar la transmisión de la cámara AI Vision.

Obtenedores: Detectan si el robot está sujetando un objeto.

  • get_data — Returns a tuple of detected objects for a specific signature.

  • has_sports_ball — Returns whether the robot has a sports ball.

  • has_any_barrel — Returns whether the robot has any type of barrel.

  • has_blue_barrel — Returns whether the robot has a blue barrel.

  • has_orange_barrel — Returns whether the robot has an orange barrel.

Properties — Object data returned from get_data.

  • exists — Whether the object exists in the current detection as a Boolean.

  • width — Width of the detected object.

  • height — Height of the detected object.

  • centerX — X position of the object’s center.

  • centerY — Y position of the object’s center.

  • bearing — Horizontal angle relative to the front of the robot.

  • rotation — Orientation of the object.

  • originX — X position of the object’s top-left corner.

  • originY — Y position of the object’s top-left corner.

  • id — Classification or tag ID of the object.

  • score — Confidence score for AI Classifications.

  • type — Returns the object’s type (AI, Tag, Color, or Code).

Constructores: definan las firmas y códigos de color.

Comportamiento#

show_aivision#

show_aivision displays the AI Vision Sensor’s live data feed on the robot’s screen. The live data feed will cover any other images or text on the screen.

Note: The screen will not display any other images or text unless hide_aivision is used to hide the 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 removes the AI Vision Sensor’s live data feed from the robot’s screen.

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 enables or disables the AprilTag ID detection, where the state is a Boolean value.

El sensor puede detectar los ID de AprilTag 0 a 36 de la familia Circle21h7.

Usage:
robot.vision.tag_detection(state)

Parámetros

Descripción

state

Values are: True, which enables AprilTag ID detection, or False, which disables AprilTag ID detection.

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)

Captadores#

get_data#

get_data filters data from the AI Vision Sensor frame to a single signature — a saved description of something the sensor can recognize, such as a pre-trained object, an AprilTag ID, or a configured Color Signature or Color Code — and returns a tuple.

Las Firmas de color y los Códigos de color deben configurarse primero en la Utilidad AI Vision antes de que puedan usarse con este método.

La tupla almacena objetos ordenados de mayor a menor ancho, comenzando en el índice 0. Se puede acceder a las propiedades de cada objeto usando 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

signature

Filters the dataset to only include data of the given signature. Available signatures are:

  • ALL_VISION - Sports balls, barrels, VEX AIM Coding Robots, AprilTag IDs, colors, and color codes
  • ALL_CARGO - Sports balls and barrels
  • ALL_TAGS - All AprilTag IDs
  • ALL_COLORS - All configured color signatures and color codes
  • SPORTS_BALL - Only sports balls
  • BLUE_BARREL - Only blue barrels
  • ORANGE_BARREL - Only orange barrels
  • AIM_ROBOT - All VEX AIM Coding Robots
  • TAG0 through TAG37 - A single AprilTag ID from 0 to 37
  • NAME - Color signature or color code where NAME is the name configured in the AI Vision Utility.

count

Opcional. Establece el número máximo de objetos que se pueden devolver, de 1 a 24 (valor 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)

Visualización de datos#

Printing the tuple returned by get_data displays a list of all properties of all detected objects:

# 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)

Captura de pantalla de la ventana de la consola que muestra la salida de depuración para los ID de AprilTag detectados. El texto enumera 'Objeto n.° 0' con campos como exists: True, type: AprilTag ID, id: 2, centerX: 223, centerY: 54, originX: 210, originY: 42, width: 27, height: 23, bearing: 14.1 y rotation: 0.0, seguido de una línea separadora y el comienzo de 'Objeto n.° 1' con exists: True, type: AprilTag ID, id: 4 y centerX: 122.

Clasificaciones de IA#

El sensor de visión AIM AI puede detectar estas clasificaciones de IA:

Número de identificación

Clasificación de IA

Firma

0

Pelota

SPORTS_BALL

1

Barril azul

BLUE_BARREL

2

Barril de naranja

ORANGE_BARREL

3

Robot AIM

AIM_ROBOT

Firmas de color#

A color signature is a unique color that the AI Vision Sensor can recognize. These signatures allow the sensor to detect and track objects based on their color. Once a Color Signature is configured, the sensor can identify objects with that specific color in its field of view. Color signatures are used with get_data to process and detect colored objects in real-time.

AI Vision Utility muestra un sensor de visión conectado que detecta dos objetos de colores. El lado izquierdo muestra una transmisión de cámara en vivo con un cuadro azul a la izquierda y un cuadro rojo a la derecha, cada uno delineado con cuadros delimitadores blancos. Las etiquetas negras muestran sus respectivos nombres, coordenadas y dimensiones. El lado derecho contiene la configuración de la firma de color, con controles deslizantes para el tono y el rango de saturación para los cuadros rojo y azul. Los botones para añadir colores, congelar vídeo, copiar y guardar la imagen se encuentran en la parte inferior, junto con un botón de cierre en la esquina inferior derecha.

# 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 compuesto por de 2 a 4 firmas de color dispuestas en un orden específico. Estos códigos permiten al sensor de visión de IA reconocer patrones de colores predefinidos. Los códigos de color son útiles para identificar objetos complejos o crear marcadores únicos para la navegación autónoma.

La interfaz de AI Vision Utility muestra un sensor de visión conectado que detecta dos objetos adyacentes, un cuadro azul a la izquierda y un cuadro rojo a la derecha, agrupados en un solo cuadro delimitador blanco etiquetado como BlueRed. La información de detección incluye el ángulo (A:11°), las coordenadas (X:143, Y:103), el ancho (W:233) y la altura (H:108). En el panel derecho, se muestran tres firmas de color: Red_Box, Blue_Box y BlueRed, con rangos de tonalidad y saturación ajustables. La firma BlueRed combina Blue_Box y Red_Box. Debajo de la fuente de vídeo hay botones etiquetados como Congelar vídeo, Copiar imagen, Guardar imagen y Cerrar.

# 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 returns a Boolean indicating whether the robot currently has a sports ball.

  • True — The robot has a sports ball.

  • False — The robot does not have a sports ball.

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 returns a Boolean indicating whether the robot currently has any type of barrel.

  • True — The robot has a barrel.

  • False — The robot does not have a barrel.

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 returns a Boolean indicating whether the robot currently has a blue barrel.

  • True — The robot has a blue barrel.

  • False — The robot does not have a blue barrel.

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 returns a Boolean indicating whether the robot currently has an orange barrel.

  • True — The robot has an orange barrel.

  • False — The robot does not have an orange barrel.

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#

There are twelve properties that are included with each object stored in a tuple after the robot.vision.get_data method is used.

All property values except .id, .score, and .type describe the detected object’s position, size, orientation, or bearing at the moment robot.vision.get_data was used. These values are measured in pixels or degrees, based on the sensor’s 320 by 240 pixel resolution.

Un barril azul con una franja naranja está centrado en el marco, rodeado por un recuadro negro. Los ejes x e y están etiquetados de 0 a 320 de izquierda a derecha en la parte superior y de 0 a 240 de arriba a abajo en el lado izquierdo, respectivamente.

.exists#

.exists returns a Boolean indicating if the index exists in the tuple or not.

  • True — The index exists.

  • False — The index does not exist.

# 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 returns the width of the detected object in pixels, which is an integer between 1 and 320.

Nota: Los valores de los píxeles son relativos al sistema de coordenadas del sensor. Consulte el diagrama en la Introducción como referencia.

Un barril azul con una raya naranja está centrado en el marco, rodeado por un recuadro negro. Dos líneas verticales rojas discontinuas se extienden desde la parte superior del cuadro hasta los bordes izquierdo y derecho del cuadro delimitador. Una flecha negra de dos puntas entre estas líneas indica la medida del ancho.

# 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 returns the height of the detected object in pixels, which is an integer between 1 and 240.

Nota: Los valores de los píxeles son relativos al sistema de coordenadas del sensor. Consulte el diagrama en la Introducción como referencia.

Un barril azul con una raya naranja está centrado en el marco, rodeado por un recuadro negro. Dos líneas discontinuas rojas horizontales se extienden desde el lado izquierdo del marco hasta los bordes superior e inferior del cuadro delimitador. Una flecha negra de dos puntas entre estas líneas indica la medición de la altura.

# 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 returns the x-coordinate of the detected object’s center in pixels, which is an integer between 0 and 320.

Nota: Los valores de los píxeles son relativos al sistema de coordenadas del sensor. Consulte el diagrama en la Introducción como referencia.

Un barril azul con una franja naranja está centrado en el marco, rodeado por un recuadro negro. Una línea discontinua roja vertical se extiende desde la parte superior del marco hasta el centro del cuadro delimitador, indicando la coordenada X del centro.

# 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 returns the y-coordinate of the detected object’s center in pixels, which is an integer between 0 and 240.

Nota: Los valores de los píxeles son relativos al sistema de coordenadas del sensor. Consulte el diagrama en la Introducción como referencia.

Un barril azul con una franja naranja está centrado en el marco, rodeado por un recuadro negro. Una línea discontinua roja horizontal se extiende desde el lado izquierdo del marco hasta el centro del cuadro delimitador, indicando la coordenada Y del centro.

# 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 returns a decimal (float) representing how far an object is to the left or right of the center of the AI Vision Sensor’s view as a degree. A value of 0 means it’s centered, positive values mean the object is to the right, and negative values mean the object is to the left.

Diagrama cenital que muestra un robot de codificación VEX AIM centrado en una base circular con una línea de referencia vertical y una línea roja inclinada hacia una pelota deportiva a la izquierda, etiquetada como -30 grados. Diagrama cenital que muestra un robot de codificación VEX AIM centrado en una base circular con una línea de referencia vertical y una línea roja inclinada hacia una pelota deportiva a la derecha, etiquetada como 30 grados.
# 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 returns the object’s orientation on the AI Vision Sensor’s viewing plane, measured in degrees from 0 to 359. A Color Code is 0° when its colors are arranged in a horizontal line (e.g., Red–Blue). If the colors are rotated, the angle changes (e.g., arranging Blue-Red returns 180°).

Para el ejemplo siguiente, el código de color se ha configurado con rojo a la izquierda y azul a la derecha.

En esta imagen, colocar azul encima del rojo equivale a rotar el código de color original 270 grados hacia la derecha.

Una interfaz de cámara muestra un objeto apilado verticalmente con una mitad superior azul y una mitad inferior roja, centradas en el marco. Una etiqueta debajo del objeto dice Red_Blue A:270° CX:185 CY:81 W: 93 H:150, indicando el nombre del objeto, el ángulo de rotación, las coordenadas X e Y del centro, el ancho y la altura. Las líneas de cuadrícula y los ejes numéricos marcan las dimensiones de la imagen, con X que van de 0 a 320 e Y de 0 a 240.

# 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 returns the x-coordinate of the top-left corner of the detected object’s bounding box in pixels, which is an integer between 0 and 320.

Nota: Los valores de los píxeles son relativos al sistema de coordenadas del sensor. Consulte el diagrama en la Introducción como referencia.

Un barril azul con una raya naranja está centrado en el marco, rodeado por un recuadro negro. Una línea discontinua roja vertical se extiende desde la parte superior del marco hasta el borde izquierdo del cuadro delimitador, indicando la coordenada X del origen del cuadro delimitador.

# 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 returns the y-coordinate of the top-left corner of the detected object’s bounding box in pixels, which is an integer between 0 and 240.

Nota: Los valores de los píxeles son relativos al sistema de coordenadas del sensor. Consulte el diagrama en la Introducción como referencia.

Un barril azul con una raya naranja está centrado en el marco, rodeado por un recuadro negro. Una línea discontinua roja horizontal se extiende desde el lado izquierdo del marco hasta el borde superior del cuadro delimitador, indicando la coordenada Y del origen del cuadro delimitador.

# 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 returns the ID of the detected AI Classification or AprilTag ID as an integer.

For an AprilTag ID, the .id property represents the detected AprilTag ID number in the range of 0 to 37. For an AI Classification, the .id property corresponds to the predefined ID in the AI Classifications section.

# 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 returns the confidence score of the detected AI Classification as an integer between 1 and 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 returns an integer that indicates the type of object detected. You can compare this value using either the type number or the corresponding named constant:

Tipo de objeto

Objetos incluidos

AiVision.AI_OBJECT

— Balones deportivos
— Barriles azules
— Barriles naranjas

AiVision.TAG_OBJECT

— Identificadores de etiquetas de abril

AiVision.COLOR_OBJECT

— Firmas de color

AiVision.CODE_OBJECT

— 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#

A new Color Signature is created using the Colordesc constructor and then registered with the AI Vision Sensor using the color_description method. A Colordesc object defines 1 of up to 7 detectable color signatures for the sensor, but it must be explicitly set using color_description to take effect.

Colordesc Usage:
Colordesc(index, red, green, blue, hangle, hdsat)

Parámetro

Descripción

index

Un número entero del 1 al 7 que representa el índice de la Firma de Color. Si dos Firmas de Color usan el mismo índice, la segunda prevalecerá sobre la primera.

red

Un número entero de 0 a 255 para el componente rojo del color.

green

Un número entero de 0 a 255 para el componente verde del color.

blue

Un número entero de 0 a 255 para el componente azul del color.

hangle

Un flotante de 1 a 40 que representa el rango de tonos en grados.

hdsat

Un flotante de 0,10 a 1,00 que representa el rango de saturación.

color_description Usage:
robot.vision.color_description(object)

Parámetro

Descripción

object

The Colordesc object to set as a detectable Color Signature.

# 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#

A new Color Code is created using the Codedesc constructor and then activated using the code_description method. A Color Code groups 2 to 4 existing Colordesc objects into a single identifier that the AI Vision Sensor can detect as a sequence, but it must be explicitly set using code_description to take effect.

Codedesc Usage:
Codedesc(index, c1, c2, c3, c4, c5)

Parámetro

Descripción

index

The index of the Color Code, from 1 to 8. Note: If you create two Codedesc objects with the same index, the second will override the first.

c1

The first Colordesc object in the code.

c2

The second Colordesc object in the code.

c3

Optional. A third Colordesc object.

c4

Optional. A fourth Colordesc object.

code_description Usage:
robot.vision.code_description(object)

Parámetro

Descripción

object

A Codedesc object to register as a detectable Color Code.

# 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)