Robotspecifieke Python#

Invoering#

De Hero Bot, Flop, bevat een IntakeMotor, een ArmMotor en een IQ AI Vision Sensor.

Alle standaard VEXcode VR Python-commando’s zijn beschikbaar voor gebruik in de IQ 26-27 Level Up Playground.

Hieronder vindt u een lijst met alle beschikbare Robot-specifieke Python-opdrachten:

Beweging – Beweeg en volg de motoren van de robot.

  • Acties

    • spin – Laat een motor voor altijd in één richting draaien.

    • spin_for – Laat een motor een specifiek aantal graden of omwentelingen draaien.

    • spin_to_position – Draait een motor naar een specifieke positie.

    • stop – Stopt een motor met draaien.

  • Instellingen

    • set_velocity – Stelt in hoe snel een motor zal draaien.

    • set_timeout – Stelt in hoe lang een motor erover doet om een ​​beweging te voltooien.

    • set_position – Wijzigt de huidige positie van de motor naar een nieuwe waarde.

  • Waarden

    • is_done – Geeft aan of de motor klaar is met bewegen.

    • is_spinning – Geeft aan of de motor draait.

    • positie – Geeft de huidige positie van de motor terug.

    • velocity – Geeft aan hoe snel de motor draait.

AI Vision – Leg objecten vast en analyseer ze met de IQ AI Vision-sensor.

  • Verdieners

    • take_snapshot – Filtert het huidige frame van de sensor op een specifieke signatuur en retourneert een tuple van gedetecteerde objecten.

  • Eigenschappen

    • .width – Geeft de breedte van het gedetecteerde object in pixels terug.

    • .height – Geeft de hoogte van het gedetecteerde object in pixels terug.

    • .centerX – Retourneert de x-coördinaat van het middelpunt van het gedetecteerde object.

    • .centerY – Retourneert de y-coördinaat van het middelpunt van het gedetecteerde object.

    • .originX – Retourneert de x-coördinaat van de linkerbovenhoek van de begrenzingsbox van het gedetecteerde object.

    • .originY – Retourneert de y-coördinaat van de linkerbovenhoek van de begrenzingsbox van het gedetecteerde object.

    • .id – Retourneert de ID van de gedetecteerde AI-classificatie.

De voorbeelden op deze pagina gebruiken de standaard startpositie van de Playground.

Beweging#

Flop heeft twee robotspecifieke motoren: intake_motor en arm_motorBeide gebruiken standaard motorcommando’s.

Richtingsconstanten:

  • intake_motor: FORWARD = inlaat (verzamelt); REVERSE = uitlaat (werpt uit)

  • arm_motor: FORWARD = omhoog (tilt op); REVERSE = omlaag (laat zakken)

draaien#

spin laat een motor oneindig in de aangegeven richting draaien. De motor blijft draaien totdat er een nieuw commando wordt gegeven.

Usage:
motor.spin(direction)

Parameters

Beschrijving

direction

De draairichting: FORWARD of 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 laat een motor een specifieke afstand draaien. Het project wacht tot de motor klaar is voordat de volgende opdracht wordt uitgevoerd, tenzij wait=False wordt doorgegeven.

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

Parameters

Beschrijving

direction

De draairichting: FORWARD of REVERSE.

amount

De afstand die moet worden afgelegd om te draaien. Dit kan een geheel getal of een decimaal getal zijn.

unit

De meeteenheid: DEGREES of 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 laat een motor naar een specifieke positie draaien. Het project wacht tot de motor klaar is voordat de volgende opdracht wordt uitgevoerd, tenzij wait=False wordt doorgegeven.

Usage:
motor.spin_to_position(position, unit)

Parameters

Beschrijving

position

De positie waarnaar de draaiing moet plaatsvinden. Dit kan een geheel getal of een decimaal getal zijn.

unit

De meeteenheid: DEGREES of 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#

stop zorgt ervoor dat een motor stopt met draaien.

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 stelt de draaisnelheid van een motor in als een percentage van 0 tot 100.

Usage:
motor.set_velocity(velocity, unit)

Parameters

Beschrijving

velocity

De snelheid van de motor als percentage van 0 tot 100.

unit

De meeteenheid: 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 bepaalt hoeveel seconden een motor de tijd krijgt om een ​​beweging te voltooien voordat hij stopt.

Usage:
motor.set_timeout(timeout, unit)

Parameters

Beschrijving

timeout

Het aantal seconden dat de motor nodig heeft om een ​​beweging te voltooien.

unit

De meeteenheid: 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 verandert de huidige positie van de motor naar een nieuwe waarde en reset de encoder.

Usage:
motor.set_position(position, unit)

Parameters

Beschrijving

position

De nieuwe positiewaarde.

unit

De meeteenheid: DEGREES of 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_klaar#

is_done retourneert een Booleaanse waarde die aangeeft of de motor zijn beweging heeft voltooid.

  • True – De motor is gestopt met bewegen.

  • False – De motor draait nog steeds.

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)

draait#

is_spinning retourneert een Booleaanse waarde die aangeeft of de motor momenteel draait.

  • True – De motor draait.

  • False – De motor draait niet.

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)

positie#

Positie position geeft de huidige positie van de motor weer.

Usage:
motor.position(unit)

Parameters

Beschrijving

unit

De meeteenheid: DEGREES of 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)

snelheid#

velocity geeft aan hoe snel de motor momenteel draait, uitgedrukt als een percentage tussen -100 en 100.

Usage:
motor.velocity(unit)

Parameters

Beschrijving

unit

De meeteenheid: 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)

AI-visie#

momentopname maken#

take_snapshot filtert gegevens uit het frame van de IQ AI Vision Sensor tot één enkele signatuur — een opgeslagen beschrijving van iets dat de sensor kan herkennen, zoals een spelelement op het veld — en retourneert een tuple.

De tuple slaat objecten op, gesorteerd van groot naar klein op basis van breedte, beginnend bij index 0. De eigenschappen van elk object kunnen worden benaderd via de index. Er wordt een lege tuple geretourneerd als er geen overeenkomende objecten worden gevonden.

Usage:
ai_vision.take_snapshot(signature)

Parameters

Beschrijving

signature

Filtert de dataset zodat alleen gegevens met de opgegeven signatuur worden weergegeven. Beschikbare signaturen zijn:

  • AiVision.ALL_AIOBJS - Detecteert alle Bean Bags.
  • AiVision.ALL_TAGS - Detecteert AprilTags, gevonden aan de zijkanten van de Goals.

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)

Eigenschappen#

Er zijn zeven eigenschappen die worden opgenomen bij elk object dat in een tuple is opgeslagen nadat take_snapshot is gebruikt.

Alle eigenschapswaarden behalve .id beschrijven de positie en grootte van het gedetecteerde object in het gezichtsveld van de IQ AI Vision Sensor op het moment dat take_snapshot werd gebruikt. Deze waarden worden gemeten in pixels, gebaseerd op de resolutie van de sensor van 320 bij 240 pixels.

.breedte#

.width retourneert de breedte van het gedetecteerde object in pixels, wat een geheel getal is tussen 1 en 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)

.hoogte#

.height retourneert de hoogte van het gedetecteerde object in pixels, wat een geheel getal is tussen 1 en 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 retourneert de x-coördinaat van het middelpunt van het gedetecteerde object in pixels, een geheel getal tussen 0 en 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 retourneert de y-coördinaat van het middelpunt van het gedetecteerde object in pixels, een geheel getal tussen 0 en 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 retourneert de x-coördinaat van de linkerbovenhoek van de begrenzingsbox van het gedetecteerde object in pixels, wat een geheel getal tussen 0 en 320 is.

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 retourneert de y-coördinaat van de linkerbovenhoek van het begrenzingskader van het gedetecteerde object in pixels, wat een geheel getal tussen 0 en 240 is.

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 retourneert de ID van de gedetecteerde AI-classificatie als een geheel getal.

AI-classificatie

id

Blauwe zitzak

0

Rode zitzak

1

Gele zitzak

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)