Python específico para robots#

Introducción#

El patio de juegos V5RC 25-26 Push Back presenta métodos exclusivos de la construcción diseñada para este patio de juegos, incluidas dos opciones de motor, sensor de visión de inteligencia artificial, sensor óptico y sensor del sistema de posicionamiento de juego (GPS).

Todos los métodos VR estándar de VEXcode están disponibles para su uso en el patio de juegos V5RC 25-26 Push Back.

A continuación se muestra una lista de todos los métodos específicos de Playground disponibles:

Movimiento: mueve y rastrea los motores del robot.

  • Comportamiento

    • spin – Hace girar el motor o el grupo de motores seleccionado indefinidamente.

    • spin_for – Hace girar un motor o grupo durante una distancia específica en grados o vueltas.

    • spin_to_position – Gira un motor o un grupo de motores a una posición establecida.

    • stop – Detiene el giro de un motor o un grupo de motores específico.

  • Mutadores

    • set_position – Establece el valor del codificador de un motor o grupo de motores.

    • set_velocity – Establece la velocidad de un motor o grupo de motores como un porcentaje.

    • set_timeout – Limita el tiempo que un bloque de motor espera antes de darse por vencido si el movimiento está bloqueado.

  • Conseguidores

    • is_done – Devuelve un valor booleano que indica si el motor ya no está girando.

    • is_spinning – Devuelve un valor booleano que indica si el motor está girando actualmente.

    • posición – Devuelve la posición de rotación actual del motor en grados o vueltas.

    • velocidad – Devuelve la velocidad actual del motor en % o rpm.

AI Vision: captura y analiza objetos utilizando el sensor de visión AI.

  • Conseguidores

    • take_snapshot – Devuelve una tupla de objetos detectados según una firma determinada.

  • Propiedades

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

    • altura – 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.

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

    • id – Clasificación o ID de etiqueta del objeto.

Detección: utilice los distintos sensores del robot.

  • Óptico

    • is_near_object – Devuelve si un objeto detectado está cerca del sensor óptico.

    • color – Devuelve el color detectado por el sensor óptico.

    • brillo – Devuelve el porcentaje de brillo detectado por el sensor.

    • hue – Devuelve el valor de tono del color detectado.

    • object_detected – Registra una función de devolución de llamada para cuando el sensor óptico detecta un objeto.

    • object_lost – Registra una función de devolución de llamada para cuando el sensor óptico pierde un objeto.

  • GPS

    • x_position – Devuelve la coordenada x actual de un sensor GPS en el campo.

    • y_position –Devuelve la coordenada y actual de un sensor GPS en el campo.

    • heading – Devuelve el rumbo al que se enfrenta actualmente el robot según las lecturas del sensor GPS de 0 a 359 grados.

Movimiento#

Comportamiento#

girar#

spin hace girar un motor o un grupo de motores en la dirección especificada indefinidamente.

Uso:
Se puede utilizar uno de los dos objetos de motor disponibles con este método, como se muestra a continuación:

motor

Dominio

motor de admisión

intake_motor.spin(direction) — El motor de admisión

motor transportador

conveyor_motor.spin(direction) — El motor del transportador

Parámetros

Descripción

dirección

La dirección en la que debe girar el motor:

  • ADELANTE – Gira el transportador hacia arriba o la entrada en la dirección de entrada.
  • REVERSA – Gira el transportador hacia abajo o la entrada en la dirección de salida.
def main():
    # Pick up a second Block
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    intake_motor.spin(FORWARD)
    drivetrain.drive_for(FORWARD, 350, MM)

girar_para#

spin_for hace girar un motor o un grupo de motores una cantidad determinada de grados o vueltas.

Uso:
Se puede utilizar uno de los dos objetos de motor disponibles con este método, como se muestra a continuación:

motor

Dominio

motor de admisión

intake_motor.spin_for(dirección, distancia, unidades, espera) — El motor de admisión

motor transportador

conveyor_motor.spin_for(dirección, distancia, unidades, espera) — El motor del transportador

Parámetros

Descripción

dirección

La dirección en la que debe girar el motor:

  • ADELANTE – Gira el transportador hacia arriba o la entrada en la dirección de entrada.
  • REVERSA – Gira el transportador hacia abajo o la entrada en la dirección de salida.

distancia

La distancia que debe girar el motor, expresada en un número entero.

unidades

La unidad que representa la distancia a girar:

  • GRADOS
  • VUELTAS

espera

Opcional.

  • wait=True (predeterminado) - El robot espera hasta que spin_for se complete antes de ejecutar la siguiente línea de código.
  • wait=False - El robot inicia la acción y pasa a la siguiente línea de código de inmediato, sin esperar a que spin_for termine.

def main():
    # Pick up a second Block
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    intake_motor.spin(FORWARD)
    drivetrain.drive_for(FORWARD, 350, MM)

girar a la posición#

spin_to hace girar un motor o un grupo de motores a una posición determinada.

Uso:
Se puede utilizar uno de los dos objetos de motor disponibles con este método, como se muestra a continuación:

motor

Dominio

motor de admisión

intake_motor.spin_to_position(angle, units, wait=True) — El motor de admisión

motor transportador

conveyor_motor.spin_to_position(angle, units, wait=True) — El motor del transportador

Parámetros

Descripción

ángulo

El ángulo específico o número de vueltas que dará el motor.

unidades

La unidad que representa el ángulo a rotar:

  • GRADOS
  • GIROS

espera

Opcional.

  • wait=True (predeterminado) - El robot espera hasta que spin_to_position se complete antes de ejecutar la siguiente línea de código.
  • wait=False - El robot inicia la acción y pasa a la siguiente línea de código de inmediato, sin esperar a que spin_to_position termine.

def main():
    # Pick up a second Block
    conveyor_motor.spin_to_position(150, DEGREES)
    intake_motor.spin(FORWARD)
    drivetrain.drive_for(FORWARD, 350, MM)

detener#

stop detiene el giro de un motor o un grupo de motores.

Uso:
Se puede utilizar uno de los dos objetos de motor disponibles con este método, como se muestra a continuación:

motor

Dominio

motor de admisión

intake_motor.stop() — El motor de admisión

motor transportador

conveyor_motor.stop() — El motor del transportador

Parámetros

Descripción

Este método no tiene parámetros.

def main():
    # Pick up a second Block
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    intake_motor.spin(FORWARD)
    drivetrain.drive_for(FORWARD, 350, MM)
    intake_motor.stop()

Mutadores#

posición_establecida#

set_position establece la posición del codificador de un motor o grupo de motores en el valor de posición dado.

Uso:
Se puede utilizar uno de los dos objetos de motor disponibles con este método, como se muestra a continuación:

motor

Dominio

motor de admisión

intake_motor.set_position(position, units) — El motor de admisión

motor transportador

conveyor_motor.set_position(position, units) — El motor del transportador

Parámetros

Descripción

posición

El entero específico que se debe configurar para el codificador del motor.

unidades

La unidad que representa el ángulo a rotar:

  • GRADOS
  • GIROS
def main():
    # Pick up a second Block
    conveyor_motor.set_position(-150, DEGREES)
    conveyor_motor.spin_to_position(0, DEGREES)
    intake_motor.spin(FORWARD)
    drivetrain.drive_for(FORWARD, 350, MM)

establecer_velocidad#

set_velocity establece la velocidad de un motor o grupo de motores.

Uso:
Se puede utilizar uno de los dos objetos de motor disponibles con este método, como se muestra a continuación:

motor

Dominio

motor de admisión

intake_motor.set_velocity(velocity, units) — El motor de admisión

motor transportador

conveyor_motor.set_velocity(velocity, units) — El motor del transportador

Parámetros

Descripción

velocidad

La velocidad a la que girará el motor V5, que varía de 0 a 100.

unidades

La unidad que representa la nueva velocidad:

  • PORCENTAJE
def main():
    # Pick up a second Block
    conveyor_motor.set_velocity(90, PERCENT)
    conveyor_motor.spin_for(FORWARD, 200, DEGREES)
    intake_motor.spin(FORWARD)
    drivetrain.drive_for(FORWARD, 400, MM)

establecer_tiempo_de_espera#

set_timeout establece un límite de tiempo para los comandos de movimiento de un motor o grupo de motores. Esto evita que los comandos de movimiento que no alcanzan su posición prevista impidan la ejecución de los comandos posteriores.

Uso:
Se puede utilizar uno de los dos objetos de motor disponibles con este método, como se muestra a continuación:

motor

Dominio

motor de admisión

intake_motor.set_timeout(value, units) — El motor de admisión

motor transportador

conveyor_motor.set_timeout(value, units) — El motor del transportador

Parámetros

Descripción

valor

La cantidad de tiempo que el motor esperará antes de detenerse.

unidades

La unidad para representar el tiempo de espera:

  • SEGUNDOS
  • MSEC – milisegundos
def main():
    # Pick up a second Block
    conveyor_motor.set_timeout(0.5, SECONDS)
    conveyor_motor.spin_to_position(1000, DEGREES)
    intake_motor.spin(FORWARD)
    drivetrain.drive_for(FORWARD, 400, MM)

Captadores#

está_hecho#

is_done devuelve un valor booleano que indica si el motor o el grupo de motores especificado no está girando.

  • Verdadero: el motor especificado no está girando.

  • Falso – El motor especificado está girando.

Uso:
Se puede utilizar uno de los dos objetos de motor disponibles con este método, como se muestra a continuación:

motor

Dominio

motor de admisión

intake_motor.is_done() — El motor de admisión

motor transportador

conveyor_motor.is_done() — El motor del transportador

Parámetros

Descripción

Este método no tiene parámetros.

def main():
    # Pick up a second Block
    conveyor_motor.spin_to_position(300, DEGREES, wait=False)
    wait(0.1, SECONDS)
    while not conveyor_motor.is_done():
        drivetrain.drive(FORWARD)
        intake_motor.spin(FORWARD)
        wait(5, MSEC)
    drivetrain.stop()
    intake_motor.stop()

está girando#

is_spinning devuelve un valor booleano que indica si el motor o el grupo de motores especificado está girando.

  • Verdadero – El motor especificado está girando.

  • Falso: el motor especificado no está girando.

Uso:
Se puede utilizar uno de los dos objetos de motor disponibles con este método, como se muestra a continuación:

motor

Dominio

motor de admisión

intake_motor.is_spinning() — El motor de admisión

motor transportador

conveyor_motor.is_spinning() — El motor del transportador

Parámetros

Descripción

Este método no tiene parámetros.

def main():
    # Pick up a second Block
    conveyor_motor.spin_to_position(300, DEGREES, wait=False)
    wait(0.1, SECONDS)
    while conveyor_motor.is_spinning():
        drivetrain.drive_for(FORWARD, 200, MM)
        intake_motor.spin(FORWARD)

posición#

position devuelve la distancia total que ha girado el motor o grupo de motores especificado.

Uso:
Se puede utilizar uno de los dos objetos de motor disponibles con este método, como se muestra a continuación:

motor

Dominio

motor de admisión

intake_motor.position(units) — El motor de admisión

motor transportador

conveyor_motor.position(units) — El motor del transportador

Parámetros

Descripción

unidades

Las unidades que representan la posición del motor:

  • GRADOS
  • VUELTAS
def main():
    # Pick up a second Block
    while conveyor_motor.position(DEGREES) < 150:
        conveyor_motor.spin(FORWARD)
        wait(2, MSEC)
    conveyor_motor.stop()
    intake_motor.spin(FORWARD)
    drivetrain.drive_for(FORWARD, 400, MM)

velocidad#

velocity devuelve la velocidad de rotación actual del motor o grupo de motores.

Uso:
Se puede utilizar uno de los dos objetos de motor disponibles con este método, como se muestra a continuación:

motor

Dominio

motor de admisión

intake_motor.velocity(units) — El motor de admisión

motor transportador

conveyor_motor.velocity(units) — El motor del transportador

Parámetros

Descripción

unidades

La unidad que representa la posición del motor:

  • PORCENTAJE
def main():
    # Pick up a second block
    conveyor_motor.set_velocity(100, PERCENT)
    conveyor_motor.spin_to_position(300, DEGREES, wait=False)
    wait(0.2, SECONDS)
    brain.screen.print(conveyor_motor.velocity(PERCENT))
    intake_motor.spin(FORWARD)
    drivetrain.drive_for(FORWARD, 400, MM)

Visión de IA#

Captadores#

tomar_instantánea#

take_snapshot filtra los datos del marco del sensor de visión de IA para devolver 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.

Uso:
ai_vision.take_snapshot(signature)

Parámetros

Descripción

firma

¿De qué firma se obtienen los datos? La única firma disponible es:

  • AiVision.ALL_AIOBJS - Detecta bloques rojos y azules.

def main():
    # If an object is detected, pick it up
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    while True:
        ai_objects = ai_vision.take_snapshot(AiVision.ALL_AIOBJS)
        if ai_objects:
            intake_motor.spin(FORWARD)
            drivetrain.drive(FORWARD)
            while not bumper.pressing():
                wait(2, MSEC)
            drivetrain.stop()
            break

Propiedades#

Hay siete 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 de IA en el momento en que se usó take_snapshot. El sensor de visión de IA tiene una resolución de 320 x 240 píxeles.

.ancho#

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

def main():
    # If an object is detected, approach and pick it up
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    while True:
        ai_objects = ai_vision.take_snapshot(AiVision.ALL_AIOBJS)
        if ai_objects:
            if ai_objects[0].width > 65:
                drivetrain.stop()
                break
            else:
                intake_motor.spin(FORWARD)
                drivetrain.drive(FORWARD)

.altura#

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

def main():
    # If an object is detected, approach and pick it up
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    while True:
        ai_objects = ai_vision.take_snapshot(AiVision.ALL_AIOBJS)
        if ai_objects:
            if ai_objects[0].height > 55:
                drivetrain.stop()
                break
            else:
                intake_motor.spin(FORWARD)
                drivetrain.drive(FORWARD)

.centroX#

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

def main():
    # Pick up a Block from the top left group
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    drivetrain.turn_for(LEFT, 80, DEGREES)
    drivetrain.drive_for(FORWARD, 200, MM)
    drivetrain.set_turn_velocity(20, PERCENT)
    drivetrain.turn(LEFT)
    while True:
        ai_objects = ai_vision.take_snapshot(AiVision.ALL_AIOBJS)
        if ai_objects:
            if 140 < ai_objects[0].centerX < 180:
                intake_motor.spin(FORWARD)
                drivetrain.drive(FORWARD)
                while not bumper.pressing():
                    wait(2, MSEC)
                drivetrain.stop()

.centerY#

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

def main():
    # If an object is detected, approach and pick it up
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    while True:
        ai_objects = ai_vision.take_snapshot(AiVision.ALL_AIOBJS)
        if ai_objects:
            if ai_objects[0].centerY > 140:
                drivetrain.stop()
                break
            else:
                intake_motor.spin(FORWARD)
                drivetrain.drive(FORWARD)

.origenX#

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

def main():
    # Pick up a Block from the top left group
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    drivetrain.turn_for(LEFT, 80, DEGREES)
    drivetrain.drive_for(FORWARD, 300, MM)
    drivetrain.set_turn_velocity(20, PERCENT)
    drivetrain.turn(RIGHT)
    while True:
        ai_objects = ai_vision.take_snapshot(AiVision.ALL_AIOBJS)
        if ai_objects:
            if 100 < ai_objects[0].originX < 140:
                intake_motor.spin(FORWARD)
                drivetrain.drive(FORWARD)
                while not bumper.pressing():
                    wait(2, MSEC)
                drivetrain.stop()

.origenY#

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

def main():
    # If an object is detected, approach and pick it up
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    while True:
        ai_objects = ai_vision.take_snapshot(AiVision.ALL_AIOBJS)
        if ai_objects:
            if ai_objects[0].originY > 120:
                drivetrain.stop()
                break
            else:
                intake_motor.spin(FORWARD)
                drivetrain.drive(FORWARD)

.identificación#

.id devuelve el ID de la clasificación de IA detectada como un entero.

Clasificación de IA

identificación

Firma

Bloque azul

1

Elementos del juego.BLUE_BLOCK

Bloque rojo

2

Elementos del juego.BLOQUE_ROJO

def main():
    # Pick up a Red Block from the top left group
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    drivetrain.turn_for(LEFT, 80, DEGREES)
    drivetrain.drive_for(FORWARD, 300, MM)
    while True:
        ai_objects = ai_vision.take_snapshot(AiVision.ALL_AIOBJS)
        if ai_objects:
            drivetrain.drive(FORWARD)
            if (ai_objects[0].id) == 2:
                intake_motor.spin(FORWARD)
                while not bumper.pressing():
                    wait(2, MSEC)
                drivetrain.stop()
                break

Detección#

Óptico#

está_cerca_del_objeto#

is_near_object devuelve un valor booleano que indica si el sensor óptico detecta o no un objeto cercano al sensor.

  • Verdadero – El objeto está cerca del sensor óptico.

  • Falso: el objeto no está cerca del sensor óptico.

Uso:
optical.is_near_object()

Parámetros

Descripción

Este método no tiene parámetros.

def main():
    # Move the preloaded Block to the top of the Conveyor
    conveyor_motor.spin(FORWARD)
    while not optical.is_near_object():
        wait(2, MSEC)
    conveyor_motor.stop()

color#

color devuelve el color detectado por el sensor óptico:

Color devuelto:

<ul><li>`NINGUNO` – No se detecta ningún color. </li><li>`ROJO`</li><li>`VERDE`</li><li>`AZUL`</li><li>`AMARILLO`</li><li>`NARANJA`</li><li>`PÚRPURA`</li><li>`CIAN`</li></ul>

Uso:
optical.color()

Parámetros

Descripción

Este método no tiene parámetros.

def main():
    # Pick up and move a Blue Block to the top of the Conveyor
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    intake_motor.spin(FORWARD)
    drivetrain.drive_for(FORWARD, 360, MM)
    conveyor_motor.spin(FORWARD)
    while not optical.color() == BLUE:
        wait(2, MSEC)
    conveyor_motor.stop()

brillo#

brightness devuelve el valor de brillo detectado por el sensor óptico como un porcentaje de 0% a 100%.

Uso:
optical.brightness()

Parámetros

Descripción

Este método no tiene parámetros.

def main():
    # Move the preloaded Block to the top of the Conveyor
    conveyor_motor.spin(FORWARD)
    while not 0 < optical.brightness():
        wait(2, MSEC)
    conveyor_motor.stop()

matiz#

hue devuelve el tono detectado por el sensor óptico.

Los valores de tono varían de 0 a 359 grados, correspondientes a las posiciones en la rueda de color que se muestran a continuación.

Una rueda de color circular que muestra un espectro completo de tonos etiquetados con valores de grados alrededor del perímetro, que aumentan en incrementos de 30 grados desde 0° en la parte superior hasta 360°.

Uso:
optical.hue()

Parámetros

Descripción

Este método no tiene parámetros.

def main():
    # Pick up and move a Blue Block to the top of the Conveyor
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    intake_motor.spin(FORWARD)
    drivetrain.drive_for(FORWARD, 360, MM)
    conveyor_motor.spin(FORWARD)
    while not 220 < optical.hue() < 260:
        wait(2, MSEC)
    conveyor_motor.stop()

objeto_detectado#

object_detected registra una función de devolución de llamada para cuando el sensor óptico detecta un objeto.

Uso:
optical.object_detected(callback, arg)

Parámetros

Descripción

devolución de llamada

Una función que se llamará cuando se detecte un objeto.

arg

Opcional. Una tupla que se utiliza para pasar argumentos a la función de devolución de llamada.

def ready_block():
  # Stop the conveyor when Block is at the Sensor
  conveyor_motor.stop()

def main():
  # Move the preloaded Block near the top of the Conveyor
  conveyor_motor.spin(FORWARD)
  optical.object_detected(ready_block)

objeto_perdido#

object_lost registra una función de devolución de llamada para cuando el sensor óptico pierde un objeto detectado previamente.

Uso:
optical.object_lost(callback, arg)

Parámetros

Descripción

devolución de llamada

Una función que se llamará cuando se pierda un objeto detectado.

arg

Opcional. Una tupla que se utiliza para pasar argumentos a la función de devolución de llamada.

def ready_block():
  # Stop the conveyor when Block is at the top
  conveyor_motor.stop()

def main():
  # Move the preloaded Block to the top of the Conveyor
  conveyor_motor.spin(FORWARD)
  optical.object_lost(ready_block)

GPS#

All GPS (Game Positioning System™) Sensor examples on this page use the default Playground starting position, C.

posición x#

x_position returns the current x coordinate of a GPS (Game Positioning System™) Sensor on the Field.

Uso:
gps.x_position(unidades)

Parámetros

Descripción

unidades

La unidad del valor de desplazamiento, PULGADAS o MM (milímetros).

def main():
    # Pick up a second Block
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    intake_motor.spin(FORWARD)
    drivetrain.drive(FORWARD)
    while not gps.x_position(MM) > -795:
        wait(2, MSEC)
    drivetrain.stop()

posición y#

y_position returns the current y coordinate of a GPS (Game Positioning System™) Sensor on the Field.

Uso:
gps.y_position(unidades)

Parámetros

Descripción

unidades

La unidad del valor de desplazamiento, PULGADAS o MM (milímetros).

def main():
    # Pick up a second Block
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    intake_motor.spin(FORWARD)
    drivetrain.drive(FORWARD)
    while not -450 > gps.y_position(MM):
        wait(2, MSEC)
    drivetrain.stop()

título#

heading returns the heading that the robot is currently facing based on the GPS (Game Positioning System™) Sensor’s readings from 0 to 359 degrees.

Uso:
gps.heading()

Parámetros

Descripción

Este método no tiene parámetros.

def main():
    # Score the preloaded Block into a Center Goal
    drivetrain.set_turn_velocity(30, PERCENT)
    drivetrain.turn(LEFT)
    while not 40 > gps.heading():
        wait(2, MSEC)
    drivetrain.drive_for(FORWARD, 1000, MM)
    drivetrain.turn(RIGHT)
    while not gps.heading() > 310:
        wait(2, MSEC)
    drivetrain.drive_for(REVERSE, 400, MM)
    conveyor_motor.spin(FORWARD)