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 |
|---|---|
|
La dirección a girar: |
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 |
|---|---|
|
La dirección a girar: |
|
La distancia para girar. Esto puede ser un número entero o un decimal. |
|
La unidad de medida: |
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 |
|---|---|
|
La posición a la que girar. Esto puede ser un número entero o un decimal. |
|
La unidad de medida: |
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 |
|---|---|
|
La velocidad del motor como porcentaje de 0 a 100. |
|
La unidad de medida: |
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 |
|---|---|
|
El número de segundos que el motor intentará terminar un movimiento. |
|
La unidad de medida: |
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 |
|---|---|
|
El nuevo valor de posición. |
|
La unidad de medida: |
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 |
|---|---|
|
La unidad de medida: |
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 |
|---|---|
|
La unidad de medida: |
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 |
|---|---|
|
Filtra el conjunto de datos para incluir solo los datos de la firma dada. Las firmas disponibles son:
|
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)