Python, специфічний для роботів#

Вступ#

Робот-герой Флоп включає в себе впускний двигун, двигун ArmMotor та датчик зору IQ AI.

Усі стандартні команди VEXcode VR Python доступні для використання на ігровому майданчику Підвищення рівня IQ 26-27.

Нижче наведено список усіх доступних команд Python, специфічних для Robot:

Рух – Переміщення та відстеження двигунів робота.

  • Дії

    • обертання – Обертає двигун в одному напрямку вічно.

    • spin_for – Обертає двигун на певну кількість градусів або обертів.

    • spin_to_position – Обертає двигун у певне положення.

    • стоп – Зупиняє обертання двигуна.

  • Налаштування

    • set_velocity – Встановлює швидкість обертання двигуна.

    • set_timeout – Встановлює час, протягом якого двигун намагатиметься завершити рух.

    • set_position – Змінює поточне положення двигуна на нове значення.

  • Значення

    • is_done – Повертає, чи завершив рух двигуна.

    • is_spinning – Повертає, чи обертається двигун.

    • позиція – Повертає поточне положення двигуна.

    • швидкість – Повертає швидкість обертання двигуна.

Штучний зір – захоплення та аналіз об’єктів за допомогою датчика зору IQ AI.

  • Геттери

    • 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 обертає двигун у певне положення. Проект очікує завершення роботи двигуна перед виконанням наступної команди, якщо не передано 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 встановлює швидкість обертання двигуна у відсотках від 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 повертає логічне значення, яке вказує, чи обертається двигун на даний момент.

  • 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 фільтрує дані з кадру 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.

All property values except .id describe the detected object’s position and size in the IQ AI Vision Sensor’s view at the moment take_snapshot was used. These values are measured in pixels, based on the sensor’s 320 by 240 pixel resolution.

.width#

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

.id повертає ідентифікатор виявленої класифікації ШІ як ціле число.

Класифікація ШІ

ідентифікатор

БлуБінБаг

0

Червоний мішок з квасолею

1

Жовтий мішок з квасолею

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)