Python específico para robôs#
Introdução#
O robô herói, Flop, inclui um motor de admissão, um motor de braço e um sensor de visão de IA IQ.
Todos os comandos padrão do VEXcode VR Python estão disponíveis para utilização no IQ 26-27 Level Up Playground.
Abaixo está uma lista de todos os comandos Python específicos para robôs disponíveis:
Movimento – Movimente e acompanhe os motores do robô.
Ações
spin – Roda um motor numa direção para sempre.
spin_for – Roda um motor durante um número específico de graus ou voltas.
spin_to_position – Roda um motor para uma posição específica.
stop – Impede que um motor gire.
Configurações
set_velocity – Define a velocidade de rotação do motor.
set_timeout – Define durante quanto tempo um motor tentará terminar um movimento.
set_position – Altera a posição atual do motor para um novo valor.
Valores
is_done – Retorna se o motor já terminou de se mover.
is_spinning – Retorna se o motor está a rodar.
posição – Retorna a posição atual do motor.
velocidade – Devolve a velocidade de rotação do motor.
Visão com IA – Capte e analise objetos utilizando o sensor de visão com IA IQ.
Obteve
take_snapshot – Filtra o quadro atual do sensor para uma assinatura específica e devolve uma tupla de objetos detetados.
Propriedades
.width – Retorna a largura do objeto detetado em pixéis.
. height – Retorna a altura do objeto detetado em pixéis.
.centerX – Retorna a coordenada x do centro do objeto detetado.
.centerY – Retorna a coordenada y do centro do objeto detetado.
.originX – Retorna a coordenada x do canto superior esquerdo da caixa delimitadora do objeto detetado.
.originY – Retorna a coordenada y do canto superior esquerdo da caixa delimitadora do objeto detetado.
.id – Retorna o ID da classificação de IA detetada.
Os exemplos nesta página utilizam a posição inicial padrão do Playground.
Movimento#
O Flop possui dois motores específicos para robôs: intake_motor e arm_motorAmbos utilizam comandos de motor standard.
Constantes de direção:
intake_motor:FORWARD= entrada (recolha);REVERSE= saída (ejecta)arm_motor:FORWARD= para cima (levanta-se);REVERSE= para baixo (baixa)
rodar#
O comando spin faz com que o motor gire no sentido especificado indefinidamente. O motor continuará a rodar até receber outro comando.
Usage:
motor.spin(direction)
Parâmetros |
Descrição |
|---|---|
|
Sentido de rotação: |
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)
rodar_para#
spin_for faz rodar um motor por uma distância específica. O projeto espera até que o motor termine antes de executar o próximo comando, a menos que seja passado wait=False.
Usage:
motor.spin_for(direction, amount, unit)
Parâmetros |
Descrição |
|---|---|
|
Sentido de rotação: |
|
A distância a percorrer. Pode ser um número inteiro ou decimal. |
|
A unidade 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)
rodar para a posição#
spin_to_position roda um motor para uma posição específica. O projeto espera até que o motor termine antes de executar o próximo comando, a menos que seja passado wait=False.
Usage:
motor.spin_to_position(position, unit)
Parâmetros |
Descrição |
|---|---|
|
A posição para a qual deve rodar. Pode ser um número inteiro ou decimal. |
|
A unidade 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)
parar#
stop impede que um motor gire.
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)
definir_velocidade#
set_velocity define a velocidade de rotação do motor em percentagem, de 0 a 100.
Usage:
motor.set_velocity(velocity, unit)
Parâmetros |
Descrição |
|---|---|
|
A velocidade do motor em percentagem, de 0 a 100. |
|
A unidade 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)
definir_tempo limite#
O parâmetro set_timeout define quantos segundos um motor tentará completar um movimento antes de parar.
Usage:
motor.set_timeout(timeout, unit)
Parâmetros |
Descrição |
|---|---|
|
O número de segundos que o motor tentará completar um movimento. |
|
A unidade 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)
definir_posição#
O comando set_position altera a posição actual do motor para um novo valor, reiniciando o seu encoder.
Usage:
motor.set_position(position, unit)
Parâmetros |
Descrição |
|---|---|
|
O novo valor da posição. |
|
A unidade 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)
está_concluído#
is_done devolve um valor booleano indicando se o motor terminou o seu movimento.
True– O motor terminou de se mover.False– O motor ainda está em movimento.
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)
está a girar#
is_spinning devolve um valor booleano indicando se o motor está a rodar no momento.
True– O motor está a rodar.False– O motor não está a rodar.
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)
posição#
position returns the motor’s current position.
Usage:
motor.position(unit)
Parâmetros |
Descrição |
|---|---|
|
A unidade 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)
velocidade#
A velocidade velocity de -100 a 100.
Usage:
motor.velocity(unit)
Parâmetros |
Descrição |
|---|---|
|
A unidade 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)
Visão de IA#
tirar_foto#
take_snapshot filtra os dados do quadro do sensor de visão IQ AI para uma única assinatura — uma descrição guardada de algo que o sensor pode reconhecer, como um elemento do jogo no campo — e devolve uma tupla.
A tupla armazena os objetos ordenados do maior para o menor por largura, começando no índice 0. As propriedades de cada objeto podem ser acedidas utilizando o seu índice. Uma tupla vazia é devolvida se nenhum objeto correspondente for detetado.
Usage:
ai_vision.take_snapshot(signature)
Parâmetros |
Descrição |
|---|---|
|
Filtra o conjunto de dados para incluir apenas os dados da assinatura fornecida. As subscrições disponíveis são:
|
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)
Propriedades#
Existem sete propriedades que são incluídas em cada objeto armazenado numa tupla após take_snapshot ser utilizado.
Todos os valores de propriedade, exceto .id descreve a posição e o tamanho do objeto detetado no campo de visão do sensor IQ AI Vision no momento em take_snapshot foi utilizado. Estes valores são medidos em pixéis, com base na resolução de 320 por 240 pixéis do sensor.
.largura#
.width devolve a largura do objeto detetado em pixéis, que é um número inteiro entre 1 e 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)
.altura#
.height devolve a altura do objeto detetado em pixéis, que é um número inteiro entre 1 e 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 devolve a coordenada x do centro do objecto detectado em pixéis, que é um número inteiro entre 0 e 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 devolve a coordenada y do centro do objecto detectado em pixéis, que é um número inteiro entre 0 e 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)
. origemX#
.originX devolve a coordenada x do canto superior esquerdo da caixa delimitadora do objeto detetado em pixéis, que é um número inteiro entre 0 e 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)
. origemY#
.originY devolve a coordenada y do canto superior esquerdo da caixa delimitadora do objeto detetado em pixéis, que é um número inteiro entre 0 e 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)
. ia#
.id devolve o ID da classificação de IA detectada como um número inteiro.
Classificação por IA |
eu ia |
|---|---|
BlueBeanBag |
0 |
RedBeanBag |
1 |
Puff amarelo |
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)