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)

Параметры

Описание

direction

Направление вращения: FORWARD или 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 вращает двигатель на определенное расстояние. Проект ожидает завершения вращения двигателя перед выполнением следующей команды, если не передано wait=False.

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

Параметры

Описание

direction

Направление вращения: FORWARD или REVERSE.

amount

Расстояние, на которое нужно вращать барабан. Это может быть целое число или десятичная дробь.

unit

Единица измерения: DEGREES или 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 вращает двигатель до определенного положения. Проект ожидает завершения вращения двигателя перед выполнением следующей команды, если не передано значение wait=False.

Usage:
motor.spin_to_position(position, unit)

Параметры

Описание

position

Позиция, в которую нужно переместить стрелку. Это может быть целое число или десятичная дробь.

unit

Единица измерения: DEGREES или 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)

останавливаться#

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)

Параметры

Описание

velocity

Скорость вращения двигателя в процентах от 0 до 100.

unit

Единица измерения: 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 устанавливает, сколько секунд двигатель будет пытаться завершить движение, прежде чем остановиться.

Usage:
motor.set_timeout(timeout, unit)

Параметры

Описание

timeout

Количество секунд, в течение которых двигатель будет пытаться завершить движение.

unit

Единица измерения: 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 изменяет текущее положение двигателя на новое значение, сбрасывая его энкодер.

Usage:
motor.set_position(position, unit)

Параметры

Описание

position

Новое значение позиции.

unit

Единица измерения: DEGREES или 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 возвращает логическое значение, указывающее, завершил ли двигатель свое движение.

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

Параметры

Описание

unit

Единица измерения: DEGREES или 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)

скорость#

Значение velocity возвращает текущую скорость вращения двигателя в процентах от -100 до 100.

Usage:
motor.velocity(unit)

Параметры

Описание

unit

Единица измерения: 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)

ИИ-зрение#

сделать снимок#

Функция take_snapshot take_snapshot фильтрует данные из кадра датчика IQ AI Vision Sensor, сводя их к единой сигнатуре — сохраненному описанию того, что датчик может распознать, например, игрового элемента на поле, — и возвращает кортеж.

Кортеж хранит объекты, упорядоченные по ширине от наибольшего к наименьшему, начиная с индекса 0. Доступ к свойствам каждого объекта (properties) осуществляется по его индексу. Если соответствующие объекты не обнаружены, возвращается пустой кортеж.

Usage:
ai_vision.take_snapshot(signature)

Параметры

Описание

signature

Фильтрует набор данных, чтобы включить только данные заданной подписи. Доступные подписи:

  • AiVision.ALL_AIOBJS — Обнаруживает все мешочки с фасолью.
  • AiVision.ALL_TAGS — Обнаруживает метки AprilTags, расположенные по бокам ворот.

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)