Python específico para robots#

Introducción#

El Hero Bot, Flop, incluye un IntakeMotor, un ArmMotor y un sensor de visión IQ AI.

Todos los comandos estándar de VEXcode VR Python están disponibles para su uso en el IQ 26-27 Level Up Playground.

A continuación se muestra una lista de todos los comandos de Python específicos del robot disponibles:

Movimiento: mueva y siga los motores del robot.

  • Acciones

    • girar – Hace girar un motor en una dirección para siempre.

    • Spin_for – Hace girar un motor durante un número específico de grados o giros.

    • Spin_to_position – Hace girar un motor a una posición específica.

    • Stop – Detiene el giro de un motor.

  • Ajustes

    • set_velocity – Establece qué tan rápido girará un motor.

    • set_timeout – Establece cuánto tiempo intentará un motor terminar un movimiento.

    • set_position – Cambia la posición actual del motor a un nuevo valor.

  • Valores

    • is_done – Devuelve si el motor ha terminado de moverse.

    • is_spinning – Devuelve si el motor está girando.

    • position – Devuelve la posición actual del motor.

    • Velocidad: devuelve la velocidad a la que gira el motor.

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

  • Getters

    • take_snapshot: filtra el fotograma actual del sensor a una firma específica y devuelve una tupla de objetos detectados.

  • Propiedades

    • .width – Devuelve el ancho del objeto detectado en píxeles.

    • .height – Devuelve la altura del objeto detectado en píxeles.

    • .centerX – Devuelve la coordenada x del centro del objeto detectado.

    • .centerY – Devuelve la coordenada y del centro del objeto detectado.

    • .originX – Devuelve la coordenada x de la esquina superior izquierda del cuadro delimitador del objeto detectado.

    • .originY – Devuelve la coordenada y de la esquina superior izquierda del cuadro delimitador del objeto detectado.

    • .id – Devuelve el ID de la clasificación de IA detectada.

Los ejemplos de esta página utilizan la posición de inicio predeterminada de Playground.

Movimiento#

Flop tiene dos motores específicos del robot: intake_motor y arm_motor. Ambos utilizan comandos de motor estándar.

Constantes de dirección:

  • intake_motor: FORWARD = toma (recoge); REVERSE = toma (expulsa)

  • arm_motor: FORWARD = arriba (sube); REVERSE = abajo (baja)

girar#

spin hace girar un motor en la dirección dada para siempre. El motor continuará girando hasta que se le dé otra orden.

Usage:
motor.spin(direction)

Parámetros

Descripción

direction

La dirección a girar: FORWARD O HACIA REVERSE.

def main():
    # Score a Bean Bag in a Blue Goal
    drivetrain.turn_for(LEFT, 90, DEGREES)
    drivetrain.drive_for(FORWARD, 35, INCHES)
    drivetrain.turn_for(RIGHT, 90, DEGREES)
    arm_motor.spin_for(FORWARD, 1, TURNS)
    drivetrain.drive_for(FORWARD, 40, INCHES)
    intake_motor.spin(REVERSE)

# VR threads — Do not delete
vr_thread(main)

spin_for#

spin_for hace girar un motor para una distancia específica. El proyecto espera hasta que el motor esté listo antes de que se ejecute el siguiente comando a menos que se pase wait=False.

Usage:
motor.spin_for(direction, amount, unit)

Parámetros

Descripción

direction

La dirección a girar: FORWARD O HACIA REVERSE.

amount

La distancia para girar. Esto puede ser un número entero o un decimal.

unit

La unidad de medida: DEGREES o TURNS.

def main():
    # Score a Bean Bag in a Blue Goal
    drivetrain.turn_for(LEFT, 90, DEGREES)
    drivetrain.drive_for(FORWARD, 35, INCHES)
    drivetrain.turn_for(RIGHT, 90, DEGREES)
    arm_motor.spin_for(FORWARD, 1, TURNS)
    drivetrain.drive_for(FORWARD, 40, INCHES)
    intake_motor.spin(REVERSE)

# VR threads — Do not delete
vr_thread(main)

spin_to_position#

spin_to_position hace girar un motor a una posición específica. El proyecto espera hasta que el motor esté listo antes de que se ejecute el siguiente comando a menos que se pase wait=False.

Usage:
motor.spin_to_position(position, unit)

Parámetros

Descripción

position

La posición a la que girar. Esto puede ser un número entero o un decimal.

unit

La unidad de medida: DEGREES o TURNS.

def main():
    # Score a Bean Bag in a Blue Goal
    drivetrain.turn_for(LEFT, 90, DEGREES)
    drivetrain.drive_for(FORWARD, 35, INCHES)
    drivetrain.turn_for(RIGHT, 90, DEGREES)
    arm_motor.spin_to_position(1, TURNS)
    drivetrain.drive_for(FORWARD, 40, INCHES)
    intake_motor.spin(REVERSE)

# VR threads — Do not delete
vr_thread(main)

parada#

stop detiene el giro de un motor.

Usage:
motor.stop()

def main():
    # Score a Bean Bag in a Blue Goal
    drivetrain.turn_for(LEFT, 90, DEGREES)
    drivetrain.drive_for(FORWARD, 35, INCHES)
    drivetrain.turn_for(RIGHT, 90, DEGREES)
    arm_motor.spin_for(FORWARD, 1, TURNS)
    drivetrain.drive_for(FORWARD, 40, INCHES)
    intake_motor.spin(REVERSE)
    wait(1, SECONDS)
    intake_motor.stop()

# VR threads — Do not delete
vr_thread(main)

set_velocity#

set_velocity establece qué tan rápido girará un motor como porcentaje de 0 a 100.

Usage:
motor.set_velocity(velocity, unit)

Parámetros

Descripción

velocity

La velocidad del motor como porcentaje de 0 a 100.

unit

La unidad de medida: PERCENT.

def main():
    # Score a Bean Bag in a Blue Goal
    drivetrain.turn_for(LEFT, 90, DEGREES)
    drivetrain.drive_for(FORWARD, 35, INCHES)
    drivetrain.turn_for(RIGHT, 90, DEGREES)
    arm_motor.spin_for(FORWARD, 1, TURNS)
    drivetrain.drive_for(FORWARD, 40, INCHES)
    intake_motor.set_velocity(100, PERCENT)
    intake_motor.spin(REVERSE)

# VR threads — Do not delete
vr_thread(main)

set_timeout#

set_timeout establece cuántos segundos intentará un motor terminar un movimiento antes de detenerse.

Usage:
motor.set_timeout(timeout, unit)

Parámetros

Descripción

timeout

El número de segundos que el motor intentará terminar un movimiento.

unit

La unidad de medida: SECONDS.

def main():
    # Score a Bean Bag in a Blue Goal
    drivetrain.turn_for(LEFT, 90, DEGREES)
    drivetrain.drive_for(FORWARD, 35, INCHES)
    drivetrain.turn_for(RIGHT, 90, DEGREES)
    arm_motor.set_timeout(2, SECONDS)
    arm_motor.spin_for(FORWARD, 1, TURNS)
    drivetrain.drive_for(FORWARD, 40, INCHES)
    intake_motor.spin(REVERSE)

# VR threads — Do not delete
vr_thread(main)

set_position#

set_position cambia la posición actual del motor a un nuevo valor, restableciendo su codificador.

Usage:
motor.set_position(position, unit)

Parámetros

Descripción

position

El nuevo valor de posición.

unit

La unidad de medida: DEGREES o TURNS.

def main():
    # Score a Bean Bag in a Blue Goal
    drivetrain.turn_for(LEFT, 90, DEGREES)
    drivetrain.drive_for(FORWARD, 35, INCHES)
    drivetrain.turn_for(RIGHT, 90, DEGREES)
    arm_motor.set_position(0, DEGREES)
    arm_motor.spin_for(FORWARD, 1, TURNS)
    drivetrain.drive_for(FORWARD, 40, INCHES)
    intake_motor.spin(REVERSE)

# VR threads — Do not delete
vr_thread(main)

is_done#

is_done devuelve un booleano que indica si el motor ha terminado su movimiento.

  • True : el motor ha terminado de moverse.

  • False : el motor todavía está en movimiento.

Usage:
motor.is_done()

def main():
    # Score a Bean Bag in a Blue Goal
    drivetrain.turn_for(LEFT, 90, DEGREES)
    drivetrain.drive_for(FORWARD, 35, INCHES)
    drivetrain.turn_for(RIGHT, 90, DEGREES)
    arm_motor.spin_for(FORWARD, 1, TURNS, wait=False)
    while not arm_motor.is_done():
        wait(5, MSEC)
    drivetrain.drive_for(FORWARD, 40, INCHES)
    intake_motor.spin(REVERSE)

# VR threads — Do not delete
vr_thread(main)

is_spinning#

is_spinning devuelve un booleano que indica si el motor está girando actualmente.

  • True : el motor está girando.

  • False – El motor no está girando.

Usage:
motor.is_spinning()

def main():
    # Score a Bean Bag in a Blue Goal
    drivetrain.turn_for(LEFT, 90, DEGREES)
    drivetrain.drive_for(FORWARD, 35, INCHES)
    drivetrain.turn_for(RIGHT, 90, DEGREES)
    arm_motor.spin_for(FORWARD, 1, TURNS)
    drivetrain.drive_for(FORWARD, 40, INCHES)
    intake_motor.spin(REVERSE)
    while intake_motor.is_spinning():
        wait(5, MSEC)
    intake_motor.stop()

# VR threads — Do not delete
vr_thread(main)

cargo#

position devuelve la posición actual del motor.

Usage:
motor.position(unit)

Parámetros

Descripción

unit

La unidad de medida: DEGREES o TURNS.

def main():
    # Score a Bean Bag in a Blue Goal
    drivetrain.turn_for(LEFT, 90, DEGREES)
    drivetrain.drive_for(FORWARD, 35, INCHES)
    drivetrain.turn_for(RIGHT, 90, DEGREES)
    while arm_motor.position(DEGREES) < 360:
        arm_motor.spin(FORWARD)
        wait(2, MSEC)
    arm_motor.stop()
    drivetrain.drive_for(FORWARD, 40, INCHES)
    intake_motor.spin(REVERSE)

# VR threads — Do not delete
vr_thread(main)

velocidad#

velocity devuelve la velocidad a la que el motor está girando actualmente como un porcentaje de -100 a 100.

Usage:
motor.velocity(unit)

Parámetros

Descripción

unit

La unidad de medida: PERCENT.

def main():
    # Score a Bean Bag in a Blue Goal
    drivetrain.turn_for(LEFT, 90, DEGREES)
    drivetrain.drive_for(FORWARD, 35, INCHES)
    drivetrain.turn_for(RIGHT, 90, DEGREES)
    arm_motor.spin_for(FORWARD, 1, TURNS)
    drivetrain.drive_for(FORWARD, 40, INCHES)
    intake_motor.spin(REVERSE)
    wait(0.2, SECONDS)
    brain.screen.print(intake_motor.velocity(PERCENT))

# VR threads — Do not delete
vr_thread(main)

Visión de IA#

take_snapshot#

take_snapshot filtra los datos del marco del sensor de visión IQ AI en una sola firma, una descripción guardada de algo que el sensor puede reconocer, como un elemento de juego en el campo, 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 utilizando su índice. Se devuelve una tupla vacía si no se detectan objetos coincidentes.

Usage:
ai_vision.take_snapshot(signature)

Parámetros

Descripción

signature

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

  • AiVision.ALL_AIOBJS - Detecta todas las bolsas de frijoles.
  • AiVision.ALL_TAGS - Detecta AprilTags, que se encuentran en los laterales de los Objetivos.

def main():
    # Drop the preloaded Bean Bag
    intake_motor.spin_for(REVERSE, 180, DEGREES)
    drivetrain.turn_for(LEFT, 90, DEGREES)

    # Turn to face a red Bean Bag
    drivetrain.set_turn_velocity(30, PERCENT)
    while True:
        ai_objects = ai_vision.take_snapshot(AiVision.ALL_AIOBJS)
        for ai_object in ai_objects:
            if ai_object.id == GameElements.RED_BEANBAG:
                if ai_object.centerX < 140:
                    drivetrain.turn(LEFT)
                elif ai_object.centerX > 180:
                    drivetrain.turn(RIGHT)
                else:
                    drivetrain.stop()
                    return
                break

# VR threads — Do not delete
vr_thread(main)

Propiedades#

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

Todos los valores de propiedad, excepto .id, describen la posición y el tamaño del objeto detectado en la vista del sensor de visión IQ AI en el momento en que se utilizó take_snapshot. Estos valores se miden en píxeles, en función de la resolución de 320 por 240 píxeles del sensor.

.width#

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

def main():
    # Drop the preloaded Bean Bag
    intake_motor.spin_for(REVERSE, 180, DEGREES)
    drivetrain.turn_for(LEFT, 90, DEGREES)

    # Approach the Bean Bag, then pick it up
    drivetrain.set_drive_velocity(30, PERCENT)
    while True:
        ai_objects = ai_vision.take_snapshot(AiVision.ALL_AIOBJS)
        for ai_object in ai_objects:
            if ai_object.id == GameElements.RED_BEANBAG:
                if ai_object.width > 200:
                    drivetrain.stop()
                    intake_motor.spin(FORWARD)
                    return
                else:
                    drivetrain.drive(FORWARD)
                break

# VR threads — Do not delete
vr_thread(main)

.height#

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

def main():
    # Drop the preloaded Bean Bag
    intake_motor.spin_for(REVERSE, 180, DEGREES)
    drivetrain.turn_for(LEFT, 90, DEGREES)

    # Approach the Bean Bag, then pick it up
    drivetrain.set_drive_velocity(30, PERCENT)
    while True:
        ai_objects = ai_vision.take_snapshot(AiVision.ALL_AIOBJS)
        for ai_object in ai_objects:
            if ai_object.id == GameElements.RED_BEANBAG:
                if ai_object.height > 110:
                    drivetrain.stop()
                    intake_motor.spin(FORWARD)
                    return
                else:
                    drivetrain.drive(FORWARD)
                break

# VR threads — Do not delete
vr_thread(main)

.centerX#

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

def main():
    # Drop the preloaded Bean Bag
    intake_motor.spin_for(REVERSE, 180, DEGREES)
    drivetrain.turn_for(LEFT, 90, DEGREES)

    # Steer to keep the Bean Bag centered
    drivetrain.set_turn_velocity(30, PERCENT)
    drivetrain.set_drive_velocity(30, PERCENT)
    while True:
        ai_objects = ai_vision.take_snapshot(AiVision.ALL_AIOBJS)
        for ai_object in ai_objects:
            if ai_object.id == GameElements.RED_BEANBAG:
                if ai_object.centerX < 140:
                    drivetrain.turn_for(LEFT, 5, DEGREES)
                else:
                    drivetrain.drive_for(FORWARD, 150, MM)
                    intake_motor.spin(FORWARD)
                    return
                break

# VR threads — Do not delete
vr_thread(main)

.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():
    # Drop the preloaded Bean Bag
    intake_motor.spin_for(REVERSE, 180, DEGREES)
    drivetrain.turn_for(LEFT, 90, DEGREES)

    # Print the y-position of the Bean Bag
    ai_objects = ai_vision.take_snapshot(AiVision.ALL_AIOBJS)
    for ai_object in ai_objects:
        if ai_object.id == GameElements.RED_BEANBAG:
            brain.screen.print(ai_object.centerY)
            break

# VR threads — Do not delete
vr_thread(main)

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

def main():
    # Drop the preloaded Bean Bag
    intake_motor.spin_for(REVERSE, 180, DEGREES)
    drivetrain.turn_for(LEFT, 90, DEGREES)

    # Steer to keep the left edge centered
    drivetrain.set_turn_velocity(30, PERCENT)
    drivetrain.set_drive_velocity(30, PERCENT)
    while True:
        ai_objects = ai_vision.take_snapshot(AiVision.ALL_AIOBJS)
        for ai_object in ai_objects:
            if ai_object.id == GameElements.RED_BEANBAG:
                if ai_object.originX < 100:
                    drivetrain.turn_for(LEFT, 5, DEGREES)
                else:
                    drivetrain.drive_for(FORWARD, 150, MM)
                    intake_motor.spin(FORWARD)
                    return
                break

# VR threads — Do not delete
vr_thread(main)

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

def main():
    # Drop the preloaded Bean Bag
    intake_motor.spin_for(REVERSE, 180, DEGREES)
    drivetrain.turn_for(LEFT, 90, DEGREES)

    # Print the y-position of the Bean Bag's top edge
    ai_objects = ai_vision.take_snapshot(AiVision.ALL_AIOBJS)
    for ai_object in ai_objects:
        if ai_object.id == GameElements.RED_BEANBAG:
            brain.screen.print(ai_object.originY)
            break

# VR threads — Do not delete
vr_thread(main)

.id#

.id devuelve el ID de la Clasificación de IA detectada como un número entero.

Clasificación de IA

id

BlueBeanBag

0

RedBeanBag

1

YellowBeanBag

2

def main():
    # Drop the preloaded Bean Bag
    intake_motor.spin_for(REVERSE, 180, DEGREES)
    drivetrain.turn_for(LEFT, 90, DEGREES)

    # Pick up the Bean Bag if it's red
    drivetrain.set_drive_velocity(30, PERCENT)
    ai_objects = ai_vision.take_snapshot(AiVision.ALL_AIOBJS)
    for ai_object in ai_objects:
        if ai_object.id == GameElements.RED_BEANBAG:
            intake_motor.spin(FORWARD)
            drivetrain.drive_for(FORWARD, 150, MM)
            break

# VR threads — Do not delete
vr_thread(main)


def main():
    # Stop when you see the Red Goal
    drivetrain.set_turn_velocity(30, PERCENT)
    drivetrain.turn(RIGHT)
    while True:
        ai_objects = ai_vision.take_snapshot(AiVision.ALL_TAGS)
        for ai_object in ai_objects:
            if ai_object.id == 1:
                drivetrain.stop()
                brain.screen.print("Found the Red Goal!")
                return

# VR threads — Do not delete
vr_thread(main)