Python, разработанный специально для роботов#
Введение#
Робот-герой Flop включает в себя двигатель всасывания, двигатель манипулятора и датчик зрения IQ AI.
Все стандартные команды VEXcode VR Python доступны для использования в IQ 26-27 Level Up Playground.
Ниже приведён список всех доступных команд Python, специфичных для роботов:
Движение – Перемещение и отслеживание двигателей робота.
Действия
spin – Вращает двигатель в одном направлении бесконечно.
spin_for – Раскручивает двигатель на определенное количество градусов или оборотов.
spin_to_position – Раскручивает двигатель до определенного положения.
стоп – Останавливает вращение двигателя.
Настройки
set_velocity – Задает скорость вращения двигателя.
set_timeout – Устанавливает, как долго двигатель будет пытаться завершить движение.
set_position – Изменяет текущее положение двигателя на новое значение.
Ценности
is_done – Возвращает значение, указывающее, завершилось ли движение двигателя.
is_spinning – Возвращает значение, указывающее, вращается ли двигатель.
позиция – Возвращает текущее положение двигателя.
скорость – Возвращает скорость вращения двигателя.
AI Vision – Захват и анализ объектов с помощью датчика IQ AI Vision.
Геттеры
take_snapshot – Фильтрует текущий кадр датчика по определенной сигнатуре и возвращает кортеж обнаруженных объектов.
Характеристики
.width – Возвращает ширину обнаруженного объекта в пикселях.
.height – Возвращает высоту обнаруженного объекта в пикселях.
.centerX – Возвращает x-координату центра обнаруженного объекта.
.centerY – Возвращает y-координату центра обнаруженного объекта.
.originX – Возвращает x-координату верхнего левого угла ограничивающего прямоугольника обнаруженного объекта.
.originY – Возвращает y-координату верхнего левого угла ограничивающего прямоугольника обнаруженного объекта.
.id – Возвращает идентификатор обнаруженной классификации ИИ.
В примерах на этой странице используется начальная позиция по умолчанию в игровой зоне.
Движение#
Flop имеет два двигателя, предназначенных специально для роботов: intake_motor и arm_motorОба используют стандартные команды управления двигателем.
Константы направления:
intake_motor:FORWARD= впуск (собирает);REVERSE= выпуск (выбрасывает)arm_motor:FORWARD= вверх (поднимает);REVERSE= вниз (опускает)
вращаться#
Команда spin запускает двигатель в заданном направлении бесконечно. Двигатель будет продолжать вращаться до тех пор, пока ему не будет дана другая команда.
Usage:
motor.spin(direction)
Параметры |
Описание |
|---|---|
|
Направление вращения: |
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 вращает двигатель на определенное расстояние. Проект ожидает завершения вращения двигателя перед выполнением следующей команды, если не передано wait=False.
Usage:
motor.spin_for(direction, amount, unit)
Параметры |
Описание |
|---|---|
|
Направление вращения: |
|
Расстояние, на которое нужно вращать барабан. Это может быть целое число или десятичная дробь. |
|
Единица измерения: |
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 вращает двигатель до определенного положения. Проект ожидает завершения вращения двигателя перед выполнением следующей команды, если не передано значение wait=False.
Usage:
motor.spin_to_position(position, unit)
Параметры |
Описание |
|---|---|
|
Позиция, в которую нужно переместить стрелку. Это может быть целое число или десятичная дробь. |
|
Единица измерения: |
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)
останавливаться#
stop останавливает вращение двигателя.
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 задает скорость вращения двигателя в процентах от 0 до 100.
Usage:
motor.set_velocity(velocity, unit)
Параметры |
Описание |
|---|---|
|
Скорость вращения двигателя в процентах от 0 до 100. |
|
Единица измерения: |
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 устанавливает, сколько секунд двигатель будет пытаться завершить движение, прежде чем остановиться.
Usage:
motor.set_timeout(timeout, unit)
Параметры |
Описание |
|---|---|
|
Количество секунд, в течение которых двигатель будет пытаться завершить движение. |
|
Единица измерения: |
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 изменяет текущее положение двигателя на новое значение, сбрасывая его энкодер.
Usage:
motor.set_position(position, unit)
Параметры |
Описание |
|---|---|
|
Новое значение позиции. |
|
Единица измерения: |
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 возвращает логическое значение, указывающее, завершил ли двигатель свое движение.
True– Двигатель завершил движение.False– Двигатель все еще вращается.
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 возвращает логическое значение, указывающее, вращается ли двигатель в данный момент.
True– Двигатель вращается.False– Двигатель не вращается.
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)
позиция#
position возвращает текущее положение двигателя.
Usage:
motor.position(unit)
Параметры |
Описание |
|---|---|
|
Единица измерения: |
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)
скорость#
Значение velocity возвращает текущую скорость вращения двигателя в процентах от -100 до 100.
Usage:
motor.velocity(unit)
Параметры |
Описание |
|---|---|
|
Единица измерения: |
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)
ИИ-зрение#
сделать снимок#
Функция take_snapshot take_snapshot фильтрует данные из кадра датчика IQ AI Vision Sensor, сводя их к единой сигнатуре — сохраненному описанию того, что датчик может распознать, например, игрового элемента на поле, — и возвращает кортеж.
Кортеж хранит объекты, упорядоченные по ширине от наибольшего к наименьшему, начиная с индекса 0. Доступ к свойствам каждого объекта (properties) осуществляется по его индексу. Если соответствующие объекты не обнаружены, возвращается пустой кортеж.
Usage:
ai_vision.take_snapshot(signature)
Параметры |
Описание |
|---|---|
|
Фильтрует набор данных, чтобы включить только данные заданной подписи. Доступные подписи:
|
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)
Характеристики#
После использования take_snapshot каждый объект, хранящийся в кортеже, включает в себя семь свойств.
Все значения свойств, кроме .id описывают положение и размер обнаруженного объекта в поле зрения датчика IQ AI Vision в момент использования take_snapshot Эти значения измеряются в пикселях, исходя из разрешения датчика 320 на 240 пикселей.
.ширина#
.width возвращает ширину обнаруженного объекта в пикселях, которая является целым числом от 1 до 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 возвращает высоту обнаруженного объекта в пикселях, которая является целым числом от 1 до 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 возвращает x-координату центра обнаруженного объекта в пикселях, которая является целым числом от 0 до 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 возвращает y-координату центра обнаруженного объекта в пикселях, которая является целым числом от 0 до 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 возвращает x-координату верхнего левого угла ограничивающего прямоугольника обнаруженного объекта в пикселях, которая является целым числом от 0 до 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 возвращает y-координату верхнего левого угла ограничивающего прямоугольника обнаруженного объекта в пикселях, которая является целым числом от 0 до 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 возвращает идентификатор обнаруженной классификации ИИ в виде целого числа.
Классификация ИИ |
идентификатор |
|---|---|
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)