机器人专用 Python#

介绍#

V5RC 25-26 Push Back 游乐场采用专为此游乐场设计的专属方法,包括两个电机选项、AI 视觉传感器、光学传感器和游戏定位系统 (GPS) 传感器。

所有标准 VEXcode VR 方法均可用于 V5RC 25-26 Push Back 游乐场。

以下是所有可用的 Playground 特定方法的列表:

运动——移动并跟踪机器人的马达。

  • 行动

    • spin – 无限旋转选定的电机或电机组。

    • spin_for – 使电机或电机组旋转特定距离(以度或圈为单位)。

    • spin_to_position – 将电机或电机组旋转到设定位置。

    • stop – 停止特定电机或电机组旋转。

  • 修改器

    • set_position – 设置电机或电机组的编码器值。

    • set_velocity – 以百分比设置电机或电机组的速度。

    • set_timeout – 限制运动受阻时电机阻止在放弃之前等待的时间。

  • 吸气剂

    • is_done – 返回一个布尔值,指示电机是否不再旋转。

    • is_spinning – 返回一个布尔值,指示电机当前是否正在旋转。

    • 位置 – 以度数或圈数返回电机当前的旋转位置。

    • velocity – 以 % 或 rpm 为单位返回电机当前速度。

AI 视觉 - 使用 AI 视觉传感器捕捉和分析物体。

  • 吸气剂

    • take_snapshot – 根据给定的签名返回检测到的对象元组。

  • 特性

    • width – 检测到的物体的宽度(以像素为单位)。

    • 高度 – 检测到的物体的高度(以像素为单位)。

    • centerX – 对象中心的 X 位置(以像素为单位)。

    • centerY – 对象中心的 Y 位置(以像素为单位)。

    • originX – 对象左上角的 X 位置(以像素为单位)。

    • originY – 对象左上角的 Y 位置(以像素为单位)。

    • id – 对象的分类或标签 ID。

感知——利用机器人的各种传感器。

  • 光学的

    • is_near_object – 返回检测到的物体是否靠近光学传感器。

    • color – 返回从光学传感器检测到的颜色。

    • 亮度 – 返回传感器检测到的亮度百分比。

    • 色调 - 返回检测到的颜色的色调值。

    • object_detected – 当光学传感器检测到物体时注册一个回调函数。

    • object_lost – 注册光学传感器丢失物体时的回调函数。

  • 全球定位系统

    • x_position – 返回场地上 GPS 传感器的当前 x 坐标。

    • y_position – 返回场地上 GPS 传感器的当前 y 坐标。

    • heading – 根据 GPS 传感器的读数(0 到 359 度)返回机器人当前面向的航向。

运动#

行动#

旋转#

spin 使电机或电机组无限期地沿指定方向旋转。

用法:
两个可用电机对象之一可与此方法一起使用,如下所示:

发动机

命令

进气电机

intake_motor.spin(direction) — 进气马达

传送带电机

conveyor_motor.spin(direction) — 传送带电机

参数

描述

方向

电机旋转的方向:

  • FORWARD – 传送带向上旋转或进气口朝进气方向
    • REVERSE – 传送带向下旋转或进气口朝出气方向旋转。4
def main():
    # Pick up a second Block
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    intake_motor.spin(FORWARD)
    drivetrain.drive_for(FORWARD, 350, MM)

spin_for#

spin_for 使电机或电机组旋转给定的度数或圈数。

用法:
两个可用电机对象之一可与此方法一起使用,如下所示:

发动机

命令

进气电机

intake_motor.spin_for(direction, distance, units, wait) — 进气马达

传送带电机

conveyor_motor.spin_for(direction, distance, units, wait) — 传送带电机

参数

描述

方向

电机旋转的方向:

  • FORWARD – 传送带向上旋转或进气口朝进气方向
    • REVERSE – 传送带向下旋转或进气口朝出气方向旋转。4

距离

电机旋转的距离,为整数。

单位

表示旋转距离的单位:

  • DEGREES
  • TURNS

等待

可选

  • wait=True(默认)- 机器人等待 spin_for 完成后再执行
  • 行代码。2
  • wait=False - 机器人开始动作并立即移动到下一行代码,而不等待 spin_for 完成

def main():
    # Pick up a second Block
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    intake_motor.spin(FORWARD)
    drivetrain.drive_for(FORWARD, 350, MM)

旋转到位置#

spin_to 将电机或电机组旋转到给定位置。

用法:
两个可用电机对象之一可与此方法一起使用,如下所示:

发动机

命令

进气电机

intake_motor.spin_to_position(angle, units, wait=True) — 进气马达

传送带电机

conveyor_motor.spin_to_position(angle, units, wait=True) — 传送带电机

参数

描述

角度

电机旋转的特定角度或圈数。

单位

表示旋转角度的单位:

  • DEGREES
  • TURNS

等待

可选

  • wait=True(默认)- 机器人等待 spin_to_position 完成后再执行
  • 行代码。2
  • wait=False - 机器人开始动作并立即移动到下一行代码,而不等待 spin_to_position 完成

def main():
    # Pick up a second Block
    conveyor_motor.spin_to_position(150, DEGREES)
    intake_motor.spin(FORWARD)
    drivetrain.drive_for(FORWARD, 350, MM)

停止#

“stop” 停止电机或电机组旋转。

用法:
两个可用电机对象之一可与此方法一起使用,如下所示:

发动机

命令

进气电机

intake_motor.stop() — 进气马达

传送带电机

conveyor_motor.stop() — 传送带电机

参数

描述

该方法没有参数。

def main():
    # Pick up a second Block
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    intake_motor.spin(FORWARD)
    drivetrain.drive_for(FORWARD, 350, MM)
    intake_motor.stop()

修改器#

设置位置#

set_position 将电机或电机组的编码器位置设置为给定的位置值。

用法:
两个可用电机对象之一可与此方法一起使用,如下所示:

发动机

命令

进气电机

intake_motor.set_position(position, units) — 进气马达

传送带电机

conveyor_motor.set_position(position, units) — 传送带电机

参数

描述

位置

要设置的电机编码器的具体整数。

单位

表示旋转角度的单位:

  • DEGREES
  • TURNS
def main():
    # Pick up a second Block
    conveyor_motor.set_position(-150, DEGREES)
    conveyor_motor.spin_to_position(0, DEGREES)
    intake_motor.spin(FORWARD)
    drivetrain.drive_for(FORWARD, 350, MM)

设置速度#

set_velocity 设置电机或电机组的速度。

用法:
两个可用电机对象之一可与此方法一起使用,如下所示:

发动机

命令

进气电机

intake_motor.set_velocity(velocity, units) — 进气马达

传送带电机

conveyor_motor.set_velocity(velocity, units) — 传送带电机

参数

描述

速度

V5 电机旋转的速度,范围从 0 到 100。

单位

表示新速度的单位:

  • PERCENT
def main():
    # Pick up a second Block
    conveyor_motor.set_velocity(90, PERCENT)
    conveyor_motor.spin_for(FORWARD, 200, DEGREES)
    intake_motor.spin(FORWARD)
    drivetrain.drive_for(FORWARD, 400, MM)

设置超时#

set_timeout 为电机或电机组的运动命令设置时间限制。这可以防止未到达预定位置的运动命令阻止后续命令运行。

用法:
两个可用电机对象之一可与此方法一起使用,如下所示:

发动机

命令

进气电机

intake_motor.set_timeout(value, units) — 进气马达

传送带电机

conveyor_motor.set_timeout(value, units) — 传送带电机

参数

描述

电机停止前等待的时间。

单位

表示超时的单位:

  • SECONDS
  • MSEC – 毫秒
def main():
    # Pick up a second Block
    conveyor_motor.set_timeout(0.5, SECONDS)
    conveyor_motor.spin_to_position(1000, DEGREES)
    intake_motor.spin(FORWARD)
    drivetrain.drive_for(FORWARD, 400, MM)

吸气剂#

完成#

is_done 返回一个布尔值,指示指定的电机或电机组是否没有旋转。

  • True – 指定的电机没有旋转。

  • False – 指定的电机正在旋转。

用法:
两个可用电机对象之一可与此方法一起使用,如下所示:

发动机

命令

进气电机

intake_motor.is_done() — 进气马达

传送带电机

conveyor_motor.is_done() — 传送带电机

参数

描述

该方法没有参数。

def main():
    # Pick up a second Block
    conveyor_motor.spin_to_position(300, DEGREES, wait=False)
    wait(0.1, SECONDS)
    while not conveyor_motor.is_done():
        drivetrain.drive(FORWARD)
        intake_motor.spin(FORWARD)
        wait(5, MSEC)
    drivetrain.stop()
    intake_motor.stop()

正在旋转#

is_spinning 返回一个布尔值,指示指定的电机或电机组是否正在旋转。

  • True – 指定的电机正在旋转。

  • False – 指定的电机没有旋转。

用法:
两个可用电机对象之一可与此方法一起使用,如下所示:

发动机

命令

进气电机

intake_motor.is_spinning() — 进气马达

传送带电机

conveyor_motor.is_spinning() — 传送带电机

参数

描述

该方法没有参数。

def main():
    # Pick up a second Block
    conveyor_motor.spin_to_position(300, DEGREES, wait=False)
    wait(0.1, SECONDS)
    while conveyor_motor.is_spinning():
        drivetrain.drive_for(FORWARD, 200, MM)
        intake_motor.spin(FORWARD)

位置#

position 返回指定电机或电机组旋转的总距离。

用法:
两个可用电机对象之一可与此方法一起使用,如下所示:

发动机

命令

进气电机

intake_motor.position(units) — 进气马达

传送带电机

conveyor_motor.position(units) — 传送带电机

参数

描述

单位

表示电机位置的单位:

  • `度
def main():
    # Pick up a second Block
    while conveyor_motor.position(DEGREES) < 150:
        conveyor_motor.spin(FORWARD)
        wait(2, MSEC)
    conveyor_motor.stop()
    intake_motor.spin(FORWARD)
    drivetrain.drive_for(FORWARD, 400, MM)

速度#

velocity 返回电机或电机组的当前转速。

用法:
两个可用电机对象之一可与此方法一起使用,如下所示:

发动机

命令

进气电机

intake_motor.velocity(units) — 进气马达

传送带电机

conveyor_motor.velocity(units) — 传送带电机

参数

描述

单位

表示电机位置的单位:

  • PERCENT
def main():
    # Pick up a second block
    conveyor_motor.set_velocity(100, PERCENT)
    conveyor_motor.spin_to_position(300, DEGREES, wait=False)
    wait(0.2, SECONDS)
    brain.screen.print(conveyor_motor.velocity(PERCENT))
    intake_motor.spin(FORWARD)
    drivetrain.drive_for(FORWARD, 400, MM)

人工智能视觉#

吸气剂#

拍摄快照#

take_snapshot 过滤来自 AI 视觉传感器框架的数据以返回一个元组。

该元组存储的对象按宽度从大到小排序,从索引 0 开始。每个对象的 属性 可以通过其索引访问。如果未检测到匹配的对象,则返回一个空元组。

用法:
ai_vision.take_snapshot(签名)

参数

描述

签名

获取哪个签名的数据。唯一可用的签名是:

  • AiVision.ALL_AIOBJS - 检测红色和蓝色块

def main():
    # If an object is detected, pick it up
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    while True:
        ai_objects = ai_vision.take_snapshot(AiVision.ALL_AIOBJS)
        if ai_objects:
            intake_motor.spin(FORWARD)
            drivetrain.drive(FORWARD)
            while not bumper.pressing():
                wait(2, MSEC)
            drivetrain.stop()
            break

特性#

使用 take_snapshot 后,存储在元组中的每个对象包含七个属性。

某些属性值基于使用“take_snapshot”时检测到的物体在 AI 视觉传感器视野中的位置。AI 视觉传感器的分辨率为 320 x 240 像素。

。宽度#

.width 返回检测到的对象的宽度(以像素为单位),它是 1 到 320 之间的整数。

def main():
    # If an object is detected, approach and pick it up
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    while True:
        ai_objects = ai_vision.take_snapshot(AiVision.ALL_AIOBJS)
        if ai_objects:
            if ai_objects[0].width > 65:
                drivetrain.stop()
                break
            else:
                intake_motor.spin(FORWARD)
                drivetrain.drive(FORWARD)

。高度#

.height 返回检测到的物体的高度(以像素为单位),它是 1 到 240 之间的整数。

def main():
    # If an object is detected, approach and pick it up
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    while True:
        ai_objects = ai_vision.take_snapshot(AiVision.ALL_AIOBJS)
        if ai_objects:
            if ai_objects[0].height > 55:
                drivetrain.stop()
                break
            else:
                intake_motor.spin(FORWARD)
                drivetrain.drive(FORWARD)

.centerX#

.centerX 返回检测到的物体中心的 x 坐标(以像素为单位),它是 0 到 320 之间的整数。

def main():
    # Pick up a Block from the top left group
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    drivetrain.turn_for(LEFT, 80, DEGREES)
    drivetrain.drive_for(FORWARD, 200, MM)
    drivetrain.set_turn_velocity(20, PERCENT)
    drivetrain.turn(LEFT)
    while True:
        ai_objects = ai_vision.take_snapshot(AiVision.ALL_AIOBJS)
        if ai_objects:
            if 140 < ai_objects[0].centerX < 180:
                intake_motor.spin(FORWARD)
                drivetrain.drive(FORWARD)
                while not bumper.pressing():
                    wait(2, MSEC)
                drivetrain.stop()

.centerY#

.centerY 返回检测到的物体中心的 y 坐标(以像素为单位),它是 0 到 240 之间的整数。

def main():
    # If an object is detected, approach and pick it up
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    while True:
        ai_objects = ai_vision.take_snapshot(AiVision.ALL_AIOBJS)
        if ai_objects:
            if ai_objects[0].centerY > 140:
                drivetrain.stop()
                break
            else:
                intake_motor.spin(FORWARD)
                drivetrain.drive(FORWARD)

.originX#

.originX 返回检测到的对象边界框左上角的 x 坐标(以像素为单位),它是 0 到 320 之间的整数。

def main():
    # Pick up a Block from the top left group
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    drivetrain.turn_for(LEFT, 80, DEGREES)
    drivetrain.drive_for(FORWARD, 300, MM)
    drivetrain.set_turn_velocity(20, PERCENT)
    drivetrain.turn(RIGHT)
    while True:
        ai_objects = ai_vision.take_snapshot(AiVision.ALL_AIOBJS)
        if ai_objects:
            if 100 < ai_objects[0].originX < 140:
                intake_motor.spin(FORWARD)
                drivetrain.drive(FORWARD)
                while not bumper.pressing():
                    wait(2, MSEC)
                drivetrain.stop()

.originY#

.originY 返回检测到的对象边界框左上角的 y 坐标(以像素为单位),它是 0 到 240 之间的整数。

def main():
    # If an object is detected, approach and pick it up
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    while True:
        ai_objects = ai_vision.take_snapshot(AiVision.ALL_AIOBJS)
        if ai_objects:
            if ai_objects[0].originY > 120:
                drivetrain.stop()
                break
            else:
                intake_motor.spin(FORWARD)
                drivetrain.drive(FORWARD)

。ID#

.id 以整数形式返回检测到的 AI 分类的 ID。

人工智能分类

ID

签名

蓝块

1

GameElements.BLUE_BLOCK

红块

2

GameElements.RED_BLOCK

def main():
    # Pick up a Red Block from the top left group
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    drivetrain.turn_for(LEFT, 80, DEGREES)
    drivetrain.drive_for(FORWARD, 300, MM)
    while True:
        ai_objects = ai_vision.take_snapshot(AiVision.ALL_AIOBJS)
        if ai_objects:
            drivetrain.drive(FORWARD)
            if (ai_objects[0].id) == 2:
                intake_motor.spin(FORWARD)
                while not bumper.pressing():
                    wait(2, MSEC)
                drivetrain.stop()
                break

传感#

光学的#

靠近物体#

is_near_object 返回一个布尔值,指示光学传感器是否检测到靠近传感器的物体。

  • “真”——物体靠近光学传感器。

  • “False”——物体离光学传感器太远。

用法:
optical.is_near_object()

参数

描述

该方法没有参数。

def main():
    # Move the preloaded Block to the top of the Conveyor
    conveyor_motor.spin(FORWARD)
    while not optical.is_near_object():
        wait(2, MSEC)
    conveyor_motor.stop()

颜色#

color 返回光学传感器检测到的颜色:

返回的颜色:

<ul><li>`NONE` – 未检测到颜色。2 </li>`RED`</li><li>`GREEN`</li><li>`BLUE`</li><li>`<li></li><li>`ORANGE`</li><li>`PURPLE`</li><li>`CLAYN`</li></ul>

用法:
optical.color()

参数

描述

该方法没有参数。

def main():
    # Pick up and move a Blue Block to the top of the Conveyor
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    intake_motor.spin(FORWARD)
    drivetrain.drive_for(FORWARD, 360, MM)
    conveyor_motor.spin(FORWARD)
    while not optical.color() == BLUE:
        wait(2, MSEC)
    conveyor_motor.stop()

亮度#

brightness 返回光学传感器检测到的亮度值,以 0% 到 100% 的百分比表示。

用法:
optical.brightness()

参数

描述

该方法没有参数。

def main():
    # Move the preloaded Block to the top of the Conveyor
    conveyor_motor.spin(FORWARD)
    while not 0 < optical.brightness():
        wait(2, MSEC)
    conveyor_motor.stop()

色调#

hue 返回光学传感器检测到的色调。

色调值范围从 0 到 359 度,对应于下面显示的色轮上的位置。

圆形色轮,显示全光谱色调,周边标有度数值,从顶部的 0° 到 360°,以 30 度为增量增加。

用法:
optical.hue()

参数

描述

该方法没有参数。

def main():
    # Pick up and move a Blue Block to the top of the Conveyor
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    intake_motor.spin(FORWARD)
    drivetrain.drive_for(FORWARD, 360, MM)
    conveyor_motor.spin(FORWARD)
    while not 220 < optical.hue() < 260:
        wait(2, MSEC)
    conveyor_motor.stop()

检测到物体#

当光学传感器检测到物体时,object_detected 注册一个回调函数。

用法:
optical.object_detected(callback, arg)

参数

描述

回调

当检测到物体时调用的函数。

arg

可选。用于将参数传递给回调函数的元组。

def ready_block():
  # Stop the conveyor when Block is at the Sensor
  conveyor_motor.stop()

def main():
  # Move the preloaded Block near the top of the Conveyor
  conveyor_motor.spin(FORWARD)
  optical.object_detected(ready_block)

object_lost#

object_lost 注册一个回调函数,用于当光学传感器丢失先前检测到的物体时。

用法:
optical.object_lost(回调,arg)

参数

描述

回调

当检测到的对象丢失时将调用的函数。

arg

可选。用于将参数传递给回调函数的元组。

def ready_block():
  # Stop the conveyor when Block is at the top
  conveyor_motor.stop()

def main():
  # Move the preloaded Block to the top of the Conveyor
  conveyor_motor.spin(FORWARD)
  optical.object_lost(ready_block)

全球定位系统#

All GPS (Game Positioning System™) Sensor examples on this page use the default Playground starting position, C.

x_位置#

x_position returns the current x coordinate of a GPS (Game Positioning System™) Sensor on the Field.

用法:
gps.x_position(units)

参数

描述

单位

偏移值的单位,INCHESMM(毫米)。

def main():
    # Pick up a second Block
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    intake_motor.spin(FORWARD)
    drivetrain.drive(FORWARD)
    while not gps.x_position(MM) > -795:
        wait(2, MSEC)
    drivetrain.stop()

y_位置#

y_position returns the current y coordinate of a GPS (Game Positioning System™) Sensor on the Field.

用法:
gps.y_position(单位)

参数

描述

单位

偏移值的单位,INCHESMM(毫米)。

def main():
    # Pick up a second Block
    conveyor_motor.spin_for(FORWARD, 150, DEGREES)
    intake_motor.spin(FORWARD)
    drivetrain.drive(FORWARD)
    while not -450 > gps.y_position(MM):
        wait(2, MSEC)
    drivetrain.stop()

标题#

heading returns the heading that the robot is currently facing based on the GPS (Game Positioning System™) Sensor’s readings from 0 to 359 degrees.

用法:
gps.heading()

参数

描述

该方法没有参数。

def main():
    # Score the preloaded Block into a Center Goal
    drivetrain.set_turn_velocity(30, PERCENT)
    drivetrain.turn(LEFT)
    while not 40 > gps.heading():
        wait(2, MSEC)
    drivetrain.drive_for(FORWARD, 1000, MM)
    drivetrain.turn(RIGHT)
    while not gps.heading() > 310:
        wait(2, MSEC)
    drivetrain.drive_for(REVERSE, 400, MM)
    conveyor_motor.spin(FORWARD)