Visión#

El sensor de visión para VEX EXP detecta y rastrea firmas y códigos de color. Esto le permite analizar su entorno y reaccionar según los datos visuales detectados. A continuación, se muestra una lista de todos los métodos:

Métodos – Obtener datos del sensor de visión.

  • take_snapshot – Captura datos para una firma de color o un código de color específico.

  • largest_object – Selecciona inmediatamente el objeto más grande de la instantánea.

  • instalado – Si el sensor de visión está conectado al EXP Brain.

Propiedades: Datos del objeto devueltos desde take_snapshot.

  • .exists – Si el objeto existe en la detección actual como un valor booleano.

  • .width – Ancho del objeto detectado en píxeles.

  • .height – Altura del objeto detectado en píxeles.

  • .centerX – Posición X del centro del objeto en píxeles.

  • .centerY – Posición Y del centro del objeto en píxeles.

  • .angle – Orientación del código de color en grados.

  • .originX – Posición X de la esquina superior izquierda del objeto en píxeles.

  • .originY – Posición Y de la esquina superior izquierda del objeto en píxeles.

Constructores: inicializan y configuran manualmente el sensor de visión.

En VEXcode, la inicialización del sensor de visión y sus Firmas de color y Códigos de color configurados se realiza automáticamente. En los ejemplos siguientes, el sensor de visión configurado se llamará vision_1. Para inicializar y construir manualmente un sensor de visión y sus firmas y códigos de color, consulte la sección Constructores en esta página.

Métodos#

take_snapshot#

take_snapshot filtra los datos del marco del sensor de visión para devolver una tupla. El sensor de visión puede detectar las firmas y códigos de color configurados.

Las Firmas de color y los Códigos de color deben configurarse primero en Vision Utility antes de poder 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 mediante su índice. Si no se detectan objetos coincidentes, se devuelve una tupla vacía.

Uso:
vision_1.take_snapshot(FIRMA)

Parámetros

Descripción

FIRMA

¿De qué firma se obtendrán los datos? Este es el nombre del sensor de visión, dos guiones bajos y el nombre de la firma o código de color. Por ejemplo: vision_1__RED_BOX.

# Move forward if a red object is detected
while True:
    red_box = vision_1.take_snapshot(vision_1__RED_BOX)
    if red_box:
        drivetrain.drive_for(FORWARD, 10, MM)
    wait(5, MSEC)

Firmas de color#

Una firma de color es un color único que el sensor de visión puede reconocer. Estas firmas permiten al sensor detectar y rastrear objetos según su color. Una vez configurada 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 take_snapshot para procesar y detectar objetos de color en tiempo real.

Para usar una Firma de Color configurada en un proyecto, su nombre debe ser el nombre del Sensor de Visión, dos guiones bajos y, a continuación, el nombre de la Firma de Color. Por ejemplo: vision_1__RED_BOX.

# Display if any objects match the RED_BOX signature
while True:
    brain.screen.set_cursor(1, 1)
    brain.screen.clear_screen()
    # Change to any configured Color Signature
    red_box = vision_1.take_snapshot(vision_1__RED_BOX)
    if red_box:
        brain.screen.print("Color signature")
        brain.screen.next_row()
        brain.screen.print("detected!")
        wait(100, MSEC)

Códigos de color#

Un código de color es un patrón estructurado compuesto por firmas de color dispuestas en un orden específico. Estos códigos permiten al sensor de visión reconocer patrones de color predefinidos. Los códigos de color son útiles para identificar objetos complejos o crear marcadores únicos para la navegación autónoma.

Para usar un código de color configurado en un proyecto, su nombre debe ser el nombre del sensor de visión, dos guiones bajos y, a continuación, el nombre del código de color. Por ejemplo: vision_1__BOX_CODE.

# Display if any objects match the BOX_CODE code
while True:
    brain.screen.set_cursor(1, 1)
    brain.screen.clear_screen()
    # Change to any configured Color Code
    box_code = vision_1.take_snapshot(vision_1__BOX_CODE)
    if box_code:
        brain.screen.print("Color code")
        brain.screen.next_row()
        brain.screen.print("detected!")
        wait(100, MSEC)

largest_object#

largest_object recupera el objeto más grande detectado para obtener datos en la tupla devuelta desde el último uso de take_snapshot.

Este método se puede utilizar para obtener siempre el objeto más grande de una tupla sin especificar un índice.

Uso:
vision_1.largest_object

# Turn slowly until the largest object is centered in
# front of the Vision Sensor
drivetrain.set_turn_velocity(10, PERCENT)
drivetrain.turn(RIGHT)

while True:
    red_box = vision_1.take_snapshot(vision_1__RED_BOX)

    if red_box:
        if 140 < vision_1.largest_object().centerX < 180: 
            drivetrain.stop()

    wait(10,MSEC)

installed#

installed devuelve un valor booleano que indica si el sensor de visión está conectado actualmente al cerebro EXP.

  • Verdadero – El sensor de visión está conectado al cerebro EXP.

  • Falso: El sensor de visión no está conectado al cerebro EXP.

Parámetros

Descripción

Este método no tiene parámetros.

# Display a message if the Vision Sensor is connected
if vision_1.installed():
    brain.screen.print("Vision Sensor")
    brain.screen.next_row()
    brain.screen.print("Installed!")

Propiedades#

Hay ocho propiedades que se incluyen con cada objeto almacenado en una tupla después de utilizar take_snapshot.

Algunos valores de propiedad se basan en la posición del objeto detectado en la vista del sensor de visión en el momento en que se usó take_snapshot. El sensor de visión tiene una resolución de 316 x 212 píxeles.

.exists#

.exists devuelve un valor booleano que indica si el índice existe en la tupla o no.

  • Verdadero: el índice existe.

  • Falso: El índice no existe.

# Check if at least at least one red objects is detected
# You will receive an error if no objects are detected

while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1, 1)
    red_objects = vision_1.take_snapshot(vision_1__RED_BOX)

    if red_objects:
        if red_objects[0].exists:
            brain.screen.print("At least 1")
            
    else:
        brain.screen.print("No red objects")

    wait(0.5, SECONDS)

.width#

.width devuelve el ancho del objeto detectado en píxeles, que es un número entero entre 1 y 316.

# Move towards a blue object until its width is
# larger than 100 pixels
while True:
    blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)

    if blue_box:
        if blue_box[0].width < 100:
            drivetrain.drive_for(FORWARD, 10, MM)
    else:
        drivetrain.stop()

    wait(50, MSEC)

.height#

.height devuelve la altura del objeto detectado en píxeles, que es un número entero entre 1 y 212.

# Move towards a blue object until its height is
# larger than 100 pixels
while True:
    blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)

    if blue_box:
        if blue_box[0].height < 100:
            drivetrain.drive_for(FORWARD, 10, MM)
    else:
        drivetrain.stop()

    wait(50, MSEC)

.centerX#

.centerX devuelve la coordenada x del centro del objeto detectado en píxeles, que es un número entero entre 0 y 316.

# Turn slowly until the largest blue object is centered
# in front of the Vision Sensor.
drivetrain.set_turn_velocity(10, PERCENT)
drivetrain.turn(RIGHT)

while True:
    blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)

    if blue_box:
        if 140 < vision_1.largest_object().centerX < 180: 
            drivetrain.stop()

    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 212.

# Move towards a blue object until its
# center y-coordinate is more than 140 pixels
while True:
    blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)

    if blue_box:
        if blue_box[0].centerY < 140:
            drivetrain.drive(FORWARD)
    else:
        drivetrain.stop()

    wait(50, MSEC)

.angle#

.angle devuelve la orientación del objeto detectado en grados, que es un número entero entre 0 y 316.

# Turn left or right depending on how a
# configured box code is rotated
while True: 
    box_code = vision_1.take_snapshot(vision_1__BOX_CODE)

    if box_code: 
        if 70 < box_code[0].angle < 110:
            drivetrain.turn_for(RIGHT, 45, DEGREES)
            
        elif 250 < box_code[0].angle < 290:
            drivetrain.turn_for(LEFT, 45, DEGREES)
        
        else:
            drivetrain.stop()

    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 316.

# Display if a red object is to the
# left or the right
while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1,1)
    
    red_box = vision_1.take_snapshot(vision_1__RED_BOX)
    
    if red_box:
        if red_box[0].originX < 160:
            brain.screen.print("To the left!")
        else: 
            brain.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 212.

# Display if a red object is close or far
# from the robot
while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1,1)
    
    red_box = vision_1.take_snapshot(vision_1__RED_BOX)

    if red_box:
        if red_box[0].originY < 80:
            brain.screen.print("Far")
        else: 
            brain.screen.print("Close")

    wait(50, MSEC)

Constructores#

Los constructores se utilizan para crear manualmente objetos «Visión», «Firma» y «Código», que son necesarios para configurar el sensor de visión fuera de VEXcode.

Para los ejemplos a continuación, el sensor de visión configurado se llamará “vision_1”, y los objetos de firma de color configurados, como “RED_BOX”, se utilizarán en todos los ejemplos posteriores en esta documentación de API cuando se haga referencia a los métodos de la clase “Vision”.

Vision Sensor#

Visión crea un sensor de visión.

Uso

Visión(puerto, brillo, señales)

Parámetros

Descripción

puerto

Un Puerto inteligente válido al que está conectado el sensor de visión.

brillo

Opcional. El valor de brillo del sensor de visión, de 1 a 100.

sigs

Opcional. El nombre de uno o más objetos Firma de color o Código de color.

# Create a new Signature "RED_BOX" with the Colordesc class
RED_BOX = Signature(1, -3911, -3435, -3673,10879, 11421, 11150,2.5, 0)
# Create a new Vision Sensor "vision_1" with the Vision
# class, with the "RED_BOX" Signature.
vision_1 = Vision(Ports.PORT1, 100, RED_BOX)

# Move forward if a red object is detected
while True:
    red_object = vision_1.take_snapshot(RED_BOX)
    if red_object:
        drivetrain.drive_for(FORWARD, 10, MM)
    wait(5, MSEC)

Color Signature#

La función “Firma” crea una firma de color. Se pueden almacenar hasta siete firmas de color diferentes en un sensor de visión simultáneamente.

Uso:

Firma(índice, uMín, uMáx, uMedia, vMín, vMáx, vMedia, rgb, tipo)

Parámetro

Descripción

índice

El índice del objeto Signature, de 1 a 7. Nota: La creación de dos objetos Signature con el mismo número de índice hará que el segundo objeto creado anule al primero.

uMin

El valor de uMin en la Utilidad de Visión.

uMax

El valor de uMax en la Utilidad de Visión.

uMean

El valor de uMean en la Utilidad de Visión.

vMin

El valor de vMin en la Utilidad de Visión.

vMáx

El valor de vMax en la Utilidad de Visión.

vMean

El valor de vMean en la Utilidad de Visión.

rgb

El valor de rgb en la Utilidad de Visión.

tipo

El valor de type en la Utilidad de Visión.

Para obtener los valores necesarios para crear una Firma de Color, acceda a la Utilidad de Visión. Una vez configurada la Firma de Color, copie los valores de los parámetros desde la ventana de Configuración.

# Create a new Signature RED_BOX with the Colordesc class
RED_BOX = Signature(1, 10121, 10757, 10439,-1657, -1223, -1440,2.5, 1)
# Create a new Vision Sensor "vision_1" with the Vision
# class, with the RED_BOX Signature.
vision_1 = Vision(Ports.PORT1, 100, RED_BOX)

# Move forward if a red object is detected
while True:
    red_object = vision_1.take_snapshot(RED_BOX)
    if red_object:
        drivetrain.drive_for(FORWARD, 10, MM)
    wait(5, MSEC)

Color Code#

«Código» crea un código de color. Requiere al menos dos firmas de color predefinidas para su uso. Se pueden almacenar hasta ocho códigos de color diferentes en un sensor de visión simultáneamente.

Uso:

Código(sig1, sig2, sig3, sig4, sig5)

Parámetro

Descripción

sig1

Una Firma de color creada previamente.

sig2

Una Firma de color creada previamente.

sig3

Opcional. Una Firma de color creada previamente.

sig4

Opcional. Una Firma de color creada previamente.

sig5

Opcional. Una Firma de color creada previamente.

# Create two new Signatures for a red and blue box
RED_BOX = Signature(1, 10121, 10757, 10439,-1657, -1223, -1440, 2.5, 1)
BLUE_BOX = Signature(2, -4443, -3373, -3908,6253, 7741, 6997, 2.5, 1)
# Create a Color Code for a red box to the left of a blue box
RED_BLUE = Code(RED_BOX, BLUE_BOX)
# Create a new Vision Sensor "vision_1" with the Vision
# class, with the red_box and blue_box Signatures.
vision_1 = Vision(Ports.PORT1, 100, RED_BOX, BLUE_BOX)

# Display a message if Color Code is detected
while True:
    brain.screen.set_cursor(1, 1)
    brain.screen.clear_screen()
    # Change to any configured Color Code
    box_code = vision_1.take_snapshot(RED_BLUE)
    if box_code:
        brain.screen.print("Color code")
        brain.screen.next_row()
        brain.screen.print("detected!")
        wait(100, MSEC)