Python specyficzny dla robotów#

Wstęp#

Bohaterski robot Flop zawiera IntakeMotor, ArmMotor i czujnik wizyjny IQ AI.

Wszystkie standardowe polecenia języka Python VEXcode VR są dostępne do użycia na placu zabaw IQ 26-27 Level Up.

Poniżej znajduje się lista wszystkich dostępnych poleceń języka Python specyficznych dla robotów:

Ruch – poruszaj i śledź silniki robota.

  • Akcje

    • spin – Silnik obraca się w jednym kierunku w nieskończoność.

    • spin_for – Obraca silnik o określoną liczbę stopni lub obrotów.

    • spin_to_position – Obraca silnik do określonej pozycji.

    • stop – Zatrzymuje silnik i uniemożliwia jego obrót.

  • Ustawienia

    • set_velocity – Ustawia prędkość, z jaką będzie kręcił się silnik.

    • set_timeout – Ustawia, jak długo silnik będzie próbował zakończyć ruch.

    • set_position – Zmienia aktualną pozycję silnika na nową wartość.

  • Wartości

    • is_done – Zwraca informację, czy silnik zakończył ruch.

    • is_spinning – Zwraca informację, czy silnik się kręci.

    • pozycja – Zwraca aktualną pozycję silnika.

    • prędkość – Zwraca wartość informującą o tym, jak szybko obraca się silnik.

Wizja AI – przechwytywanie i analiza obiektów za pomocą czujnika IQ AI Vision.

  • Getterzy

    • take_snapshot – Filtruje bieżącą klatkę czujnika według określonego podpisu i zwraca krotkę wykrytych obiektów.

  • Właściwości

    • .width – Zwraca szerokość wykrytego obiektu w pikselach.

    • .height – Zwraca wysokość wykrytego obiektu w pikselach.

    • .centerX – Zwraca współrzędną x środka wykrytego obiektu.

    • .centerY – Zwraca współrzędną y środka wykrytego obiektu.

    • .originX – Zwraca współrzędną x lewego górnego rogu pola ograniczającego wykrytego obiektu.

    • .originY – Zwraca współrzędną y lewego górnego rogu pola ograniczającego wykrytego obiektu.

    • .id – Zwraca identyfikator wykrytej klasyfikacji AI.

Przykłady na tej stronie wykorzystują domyślną pozycję startową placu zabaw.

Ruch#

Flop ma dwa silniki specyficzne dla robotów: intake_motor i arm_motorOba korzystają ze standardowych poleceń silnikowych.

Stałe kierunku:

  • intake_motor: FORWARD = wlot (zbiera); REVERSE = wylot (wyrzuca)

  • arm_motor: FORWARD = w górę (podnosi); REVERSE = w dół (opuszcza)

kręcić się#

spin obraca silnik w zadanym kierunku w nieskończoność. Silnik będzie się obracał, dopóki nie otrzyma kolejnego polecenia.

Usage:
motor.spin(direction)

Parametry

Opis

direction

Kierunek obrotu: FORWARD lub 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#

spin_for obraca silnik na określoną odległość. Projekt czeka, aż silnik się zatrzyma, zanim uruchomi się kolejne polecenie, chyba że zostanie przekazany parametr wait=False.

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

Parametry

Opis

direction

Kierunek obrotu: FORWARD lub REVERSE.

amount

Odległość do obrotu. Może być liczbą całkowitą lub dziesiętną.

unit

Jednostka miary: DEGREES lub 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)

obrót_do_pozycji#

spin_to_position obraca silnik do określonej pozycji. Projekt czeka, aż silnik zakończy pracę, zanim uruchomi się kolejne polecenie, chyba że zostanie przekazany parametr wait=False.

Usage:
motor.spin_to_position(position, unit)

Parametry

Opis

position

Pozycja, do której ma nastąpić obrót. Może to być liczba całkowita lub dziesiętna.

unit

Jednostka miary: DEGREES lub 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)

zatrzymywać się#

stop zatrzymuje silnik i uniemożliwia jego obrót.

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)

ustaw_prędkość#

set_velocity ustawia prędkość, z jaką będzie kręcił się silnik, w procentach od 0 do 100.

Usage:
motor.set_velocity(velocity, unit)

Parametry

Opis

velocity

Prędkość silnika wyrażona w procentach od 0 do 100.

unit

Jednostka miary: 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)

ustaw_limit_czasu#

set_timeout ustawia liczbę sekund, przez którą silnik będzie próbował zakończyć ruch przed zatrzymaniem.

Usage:
motor.set_timeout(timeout, unit)

Parametry

Opis

timeout

Liczba sekund, przez które silnik będzie próbował zakończyć ruch.

unit

Jednostka miary: 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)

ustaw_pozycję#

set_position zmienia bieżącą pozycję silnika na nową wartość, resetując jego enkoder.

Usage:
motor.set_position(position, unit)

Parametry

Opis

position

Nowa wartość pozycji.

unit

Jednostka miary: DEGREES lub 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)

jest_zrobione#

is_done zwraca wartość logiczną wskazującą, czy silnik zakończył swój ruch.

  • True – Silnik zakończył ruch.

  • False – Silnik nadal się porusza.

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)

kręci się#

is_spinning zwraca wartość logiczną wskazującą, czy silnik aktualnie się kręci.

  • True – Silnik się kręci.

  • False – Silnik się nie obraca.

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)

pozycja#

Pozycja position zwraca aktualną pozycję silnika.

Usage:
motor.position(unit)

Parametry

Opis

unit

Jednostka miary: DEGREES lub 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)

prędkość#

velocity zwraca aktualną prędkość obrotową silnika w procentach od -100 do 100.

Usage:
motor.velocity(unit)

Parametry

Opis

unit

Jednostka miary: 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)

Wizja AI#

zrób migawkę#

take_snapshot filtruje dane z ramki czujnika IQ AI Vision do pojedynczego podpisu — zapisanego opisu czegoś, co czujnik może rozpoznać, na przykład elementu gry na boisku — i zwraca krotkę.

Krotka przechowuje obiekty uporządkowane od największego do najmniejszego według szerokości, zaczynając od indeksu 0. Dostęp do właściwości każdego obiektu jest możliwy za pomocą jego indeksu. Jeśli nie zostaną wykryte żadne pasujące obiekty, zwracana jest pusta krotka.

Usage:
ai_vision.take_snapshot(signature)

Parametry

Opis

signature

Filtruje zbiór danych, aby zawierał tylko dane o podanym podpisie. Dostępne podpisy to:

  • AiVision.ALL_AIOBJS – Wykrywa wszystkie worki fasoli.
  • AiVision.ALL_TAGS – Wykrywa AprilTags, znajdujące się po bokach celów.

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)

Właściwości#

Każdy obiekt przechowywany w krotce zawiera siedem właściwości po użyciu take_snapshot.

Wszystkie wartości właściwości z wyjątkiem .id opisują położenie i rozmiar wykrytego obiektu w polu widzenia czujnika IQ AI Vision w momencie użycia polecenia take_snapshot Wartości te są mierzone w pikselach, w oparciu o rozdzielczość czujnika wynoszącą 320 na 240 pikseli.

.szerokość#

.width zwraca szerokość wykrytego obiektu w pikselach, która jest liczbą całkowitą z przedziału od 1 do 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)

.wysokość#

.height zwraca wysokość wykrytego obiektu w pikselach, która jest liczbą całkowitą z przedziału od 1 do 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 zwraca współrzędną x środka wykrytego obiektu w pikselach, która jest liczbą całkowitą z przedziału od 0 do 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 zwraca współrzędną y środka wykrytego obiektu w pikselach, która jest liczbą całkowitą z przedziału od 0 do 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 zwraca współrzędną x lewego górnego rogu ograniczającego pole wykrytego obiektu w pikselach. Jest to liczba całkowita z przedziału od 0 do 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 zwraca współrzędną y lewego górnego rogu ograniczającego pola wykrytego obiektu w pikselach. Jest to liczba całkowita z przedziału od 0 do 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 zwraca identyfikator wykrytej klasyfikacji AI jako liczbę całkowitą.

Klasyfikacja AI

id

Niebieska Torba Fasoli

0

Czerwona Torba Fasoli

1

Żółta Worek Fasoli

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)