Python เฉพาะสำหรับหุ่นยนต์#

การแนะนำ#

หุ่นยนต์ฮีโร่ Flop ประกอบด้วยมอเตอร์ดูดอากาศ มอเตอร์แขน และเซ็นเซอร์ตรวจจับภาพ IQ AI

คำสั่ง Python VEXcode VR มาตรฐานทั้งหมดสามารถใช้งานได้ใน Playground IQ 26-27 Level Up

ด้านล่างนี้คือรายการคำสั่ง Python เฉพาะสำหรับ Robot ที่มีให้ใช้งานทั้งหมด:

การเคลื่อนไหว – ควบคุมและติดตามมอเตอร์ของหุ่นยนต์

  • การกระทำ

    • spin – หมุนมอเตอร์ไปในทิศทางเดียวตลอดไป

    • spin_for – หมุนมอเตอร์เป็นจำนวนองศาหรือรอบที่กำหนด

    • spin_to_position – หมุนมอเตอร์ไปยังตำแหน่งที่กำหนด

    • stop – หยุดมอเตอร์ไม่ให้หมุน

  • การตั้งค่า

    • set_velocity – ตั้งค่าความเร็วในการหมุนของมอเตอร์

    • set_timeout – ตั้งค่าระยะเวลาที่มอเตอร์จะพยายามทำการเคลื่อนไหวให้เสร็จสิ้น

    • set_position – เปลี่ยนตำแหน่งปัจจุบันของมอเตอร์เป็นค่าใหม่

  • ค่านิยม

    • is_done – คืนค่าว่ามอเตอร์เคลื่อนที่เสร็จแล้วหรือไม่

    • is_spinning – คืนค่าว่ามอเตอร์กำลังหมุนอยู่หรือไม่

    • position – ส่งคืนตำแหน่งปัจจุบันของมอเตอร์

    • ความเร็ว – ส่งคืนความเร็วในการหมุนของมอเตอร์

AI Vision – จับภาพและวิเคราะห์วัตถุโดยใช้เซ็นเซอร์ IQ AI Vision

  • ผู้รับ

    • take_snapshot – กรองเฟรมปัจจุบันของเซ็นเซอร์ตามลายเซ็นเฉพาะและส่งคืนทูเปิลของวัตถุที่ตรวจพบ

  • คุณสมบัติ

    • .width – ส่งคืนความกว้างของวัตถุที่ตรวจพบในหน่วยพิกเซล

    • .height – ส่งคืนความสูงของวัตถุที่ตรวจพบในหน่วยพิกเซล

    • .centerX – ส่งคืนพิกัด x ของจุดศูนย์กลางของวัตถุที่ตรวจพบ

    • .centerY – ส่งคืนพิกัด y ของจุดศูนย์กลางของวัตถุที่ตรวจพบ

    • .originX – ส่งคืนพิกัด x ของมุมบนซ้ายของกรอบล้อมรอบวัตถุที่ตรวจพบ

    • .originY – ส่งคืนพิกัด y ของมุมบนซ้ายของกรอบล้อมรอบวัตถุที่ตรวจพบ

    • .id – ส่งคืน ID ของการจำแนกประเภท AI ที่ตรวจพบ

ตัวอย่างในหน้านี้ใช้ตำแหน่งเริ่มต้นเริ่มต้นของ Playground ตามค่าเริ่มต้น

การเคลื่อนไหว#

Flop มีมอเตอร์เฉพาะสำหรับหุ่นยนต์ 2 ตัว intake_motor และ arm_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 กำหนดจำนวนวินาทีที่มอเตอร์จะพยายามเคลื่อนที่ให้เสร็จสิ้นก่อนที่จะหยุด

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 จะเปลี่ยนตำแหน่งปัจจุบันของมอเตอร์เป็นค่าใหม่ โดยรีเซ็ตตัวเข้ารหัส (encoder)

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)

AI Vision#

ถ่ายภาพสแนปช็อต#

take_snapshot กรองข้อมูลจากเฟรมของเซ็นเซอร์ IQ AI Vision ให้เหลือเพียงลายเซ็นเดียว ซึ่งเป็นคำอธิบายที่บันทึกไว้ของสิ่งที่เซ็นเซอร์สามารถจดจำได้ เช่น องค์ประกอบของเกมในสนาม และส่งคืนค่าเป็นทูเปิล

The tuple stores objects ordered from largest to smallest by width, starting at index 0. Each object’s properties can be accessed using its index. An empty tuple is returned if no matching objects are detected.

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 x 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 ของวัตถุที่ตรวจพบในหน่วยพิกเซล ซึ่งเป็นจำนวนเต็มระหว่าง 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 ที่ตรวจพบในหน่วยพิกเซล ซึ่งเป็นจำนวนเต็มระหว่าง 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 วัตถุที่ตรวจพบในหน่วยพิกเซล ซึ่งเป็นจำนวนเต็มระหว่าง 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 พบในหน่วยพิกเซล ซึ่งเป็นจำนวนเต็มระหว่าง 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 ส่งคืน ID ของการจำแนกประเภท AI ที่ตรวจพบเป็นจำนวนเต็ม

การจำแนกประเภท AI

รหัส

บลูบีนแบ็ก

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)