人工智能视觉#

介绍#

VEX AIM 编程机器人的 AI 视觉传感器可检测并追踪物体、颜色和 AprilTag。这使得机器人能够分析周围环境、跟踪物体并根据检测到的视觉数据做出反应。以下是所有可用方法和属性的列表:

操作——显示或隐藏 AI Vision 摄像头馈送。

Getters——检测机器人是否拿着物体。

  • get_data – Returns a tuple of detected objects based on a given signature.

  • has_sports_ball – Returns whether the robot has a sports ball.

  • has_any_barrel – Returns whether the robot has any type of barrel.

  • has_blue_barrel – Returns whether the robot has a blue barrel.

  • has_orange_barrel – Returns whether the robot has an orange barrel.

Properties – Object data returned from get_data.

  • exists – Whether the object exists in the current detection as a Boolean.

  • width – Width of the detected object in pixels.

  • height – Height of the detected object in pixels.

  • centerX – X position of the object’s center in pixels.

  • centerY – Y position of the object’s center in pixels.

  • bearing – Horizontal angle relative to the front of the robot in degrees.

  • rotation – Orientation of the object in degrees.

  • originX – X position of the object’s top-left corner in pixels.

  • originY – Y position of the object’s top-left corner in pixels.

  • id – Classification or tag ID of the object.

  • score – Confidence score for AI Classifications (1–100).

  • type – Returns the object’s type (AI, Tag, Color, or Code).

构造函数——定义颜色签名和代码。

行动#

show_aivision#

show_aivision 在机器人屏幕上显示 AI 视觉传感器的实时数据。实时数据将覆盖屏幕上的任何其他图像或文本。

Note: The screen will not display any other images or text unless hide_aivision is used to hide the feed.

用法:
robot.screen.show_aivision()

参数

描述

该方法没有参数。

# Watch the AI Vision Sensor detect AI Classifications
# and AprilTags as you move the robot
robot.screen.show_aivision()

hide_aivision#

hide_aivision 从机器人的屏幕上删除 AI 视觉传感器的实时数据馈送。

用法:
robot.screen.hide_aivision()

参数

描述

该方法没有参数。

# View the AI Vision Sensor's feed for five seconds
robot.screen.show_aivision()
wait(5, SECONDS)
robot.screen.hide_aivision()

tag_detection#

tag_detection 启用或禁用 AprilTag 检测,其中状态是一个布尔值。

该传感器可以检测 Circle21h7 系列的 AprilTag ID 0 至 36。

用法:
robot.vision.tag_detection(state)

参数

描述

state

  • True Enables AprilTag detection.
  • False Disables AprilTag detection.

robot.screen.set_font(PROP30)

# Cut off APrilTag detection after 5 seconds
while True:
    if robot.timer.time(SECONDS) > 5:
        robot.vision.tag_detection(False)

    robot.screen.clear_screen()
    robot.screen.set_cursor(3, 1)
    apriltags = robot.vision.get_data(ALL_TAGS)
    
    if apriltags:
        robot.screen.print("AprilTag detected!")
    else:
        robot.screen.print("Nothing detected!")

    wait(0.1, SECONDS)

吸气剂#

get_data#

get_data 函数会过滤来自 AI 视觉传感器帧的数据并返回一个元组。AI 视觉传感器可以检测包含预训练对象、AprilTag 或已配置颜色和颜色代码的签名。

Color Signatures and Color Codes must be configured first in the AI Vision Utility before they can be used with this method.

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.

用法:
robot.vision.get_data(signature, count)

参数

描述

signature

获取什么签名的数据。可用的签名有:

  • ALL_VISION - 运动球、桶、VEX AIM 编码机器人、AprilTag、颜色和颜色代码
  • ALL_CARGO - 运动球和桶
  • ALL_TAGS - 所有 AprilTag
  • ALL_COLORS - 所有配置的颜色签名和颜色代码
  • SPORTS_BALL - 仅限运动球
  • BLUE_BARREL - 仅限蓝色桶
  • ORANGE_BARREL - 仅限橙色桶
  • AIM_ROBOT - 所有 VEX AIM 编码机器人
  • TAG0TAG37 - 单个 AprilTag,ID 来自0 到 37
  • NAME - 颜色签名或颜色代码
其中 NAME 是在 AI Vision Utility 中配置的名称。44

count

可选。设置可返回的最大对象数,范围为 1 至 24(默认值:8)。

**注意:**可以使用 AIM Printables 中打印的 AprilTags 获取 AprilTags 5 至 37。

# Move forward if a sports ball is detected
while True:
    ball = robot.vision.get_data(SPORTS_BALL)
    if ball:
        robot.move_for(10, 0)
    wait(50, MSEC)

色彩签名#

A color signature is a unique color that the AI Vision Sensor can recognize. These signatures allow the sensor to detect and track objects based on their color. Once a Color Signature is configured, the sensor can identify objects with that specific color in its field of view. Color signatures are used with get_data to process and detect colored objects in real-time.

AI 视觉实用程序展示了一个连接的视觉传感器正在检测两个彩色物体。左侧显示实时摄像头画面,左侧为蓝色框,右侧为红色框,每个框都带有白色边框。黑色标签显示其各自的名称、坐标和尺寸。右侧包含颜色签名设置,红色和蓝色框的色调和饱和度范围均有滑块。底部是添加颜色、冻结视频、复制和保存图像的按钮,右下角有一个关闭按钮。

# Display if any objects match the Red_Box signature
while True:
    robot.screen.set_cursor(1, 1)
    robot.screen.clear_row(1)
    # Change to any configured Color Signature
    ai_objects = robot.vision.get_data(Red_Box)
    if ai_objects:
        robot.screen.print("Color signature detected!")

颜色代码#

颜色代码是由 2 到 4 个按特定顺序排列的颜色特征组成的结构化模式。这些代码使 AI 视觉传感器能够识别预定义的颜色模式。颜色代码可用于识别复杂物体或为自主导航创建独特的标记。

AI Vision Utility 界面显示一个已连接的视觉传感器正在检测两个相邻的物体,左侧为蓝色框,右侧为红色框,它们被组合成一个标记为 BlueRed 的白色边界框。检测信息包括角度 (A:11°)、坐标 (X:143, Y:103)、宽度 (W:233) 和高度 (H:108)。右侧面板列出了三个颜色特征:Red_Box、Blue_Box 和 BlueRed,并可调整色调和饱和度范围。BlueRed 特征结合了 Blue_Box 和 Red_Box。视频源下方是标有“冻结视频”、“复制图像”、“保存图像”和“关闭”的按钮。

# Display if any objects match the BlueRed code
while True:
    robot.screen.set_cursor(1, 1)
    robot.screen.clear_row(1)
    # Change to any configured Color Code
    ai_objects = robot.vision.get_data(BlueRed)
    if ai_objects:
        robot.screen.print("Color code detected!")

has_sports_ball#

has_sports_ball 返回一个布尔值,指示机器人当前是否有运动球。

  • True——机器人有一个运动球。

  • False — — 机器人没有体育球。

用法:
robot.has_sports_ball()

参数

描述

该方法没有参数。

# Kick when the robot has a sports ball
while True:
    if robot.has_sports_ball():
        robot.kicker.kick(MEDIUM)

    wait(50, MSEC)

has_any_barrel#

has_any_barrel 返回一个布尔值,指示机器人当前是否有任何类型的桶。

  • True — — 机器人有一桶。

  • False — — 机器人没有枪管。

用法:
robot.has_any_barrel()

参数

描述

该方法没有参数。

# Push a barrel away when detected
while True:
    if robot.has_any_barrel():
        robot.kicker.place()

    wait(50, MSEC)

has_blue_barrel#

has_blue_barrel 返回一个布尔值,指示机器人当前是否有一个蓝色桶。

  • True – 机器人有一个蓝色的桶。

  • False — — 机器人没有蓝色枪管。

用法:
robot.has_blue_barrel()

参数

描述

该方法没有参数。

# Push a blue barrel away when detected
while True:
    if robot.has_blue_barrel():
        robot.kicker.place()

    wait(50, MSEC)

has_orange_barrel#

has_orange_barrel 返回一个布尔值,指示机器人当前是否有一个橙色桶。

  • True - 机器人有橙色枪管。

  • False — — 机器人没有橙色枪管。

用法:
robot.has_orange_barrel()

参数

描述

该方法没有参数。

# Push an orange barrel away when detected
while True:
    if robot.has_orange_barrel():
        robot.kicker.place()

    wait(50, MSEC)

特性#

There are twelve properties that are included with each object stored in a tuple after the robot.vision.get_data method is used.

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

带有橙色条纹的蓝色桶位于框架的中心,周围环绕着黑色边界框。

.exists#

.exists 返回一个布尔值,指示索引是否存在于元组中。

  • True:索引存在。

  • False:索引不存在。

# Check if at least two objects are detected
while True:
    robot.screen.clear_screen()
    robot.screen.set_cursor(1, 1)
    ai_objects = robot.vision.get_data(ALL_CARGO)

    if ai_objects:
        if ai_objects[1].exists:
            robot.screen.print("More than 2")
        else:
            robot.screen.print("Less than 2")
    wait(0.1, SECONDS)

.width#

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

带有橙色条纹的蓝色桶位于框架中央,周围环绕着黑色边界框。两条垂直的红色虚线从框架顶部延伸至边界框的左右边缘。两条线之间的双向黑色箭头表示宽度测量值。

# Move towards a Blue Barrel until its width is
# larger than 100 pixels
while True:
    barrel = robot.vision.get_data(BLUE_BARREL)

    if barrel:
        if barrel[0].width < 100:
            robot.move_at(0)
    else:
        robot.stop_all_movement()

    wait(50, MSEC)

.height#

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

带有橙色条纹的蓝色桶位于框架中央,周围环绕着黑色边界框。两条水平红色虚线从框架左侧延伸至边界框的顶部和底部边缘。两条线之间的双向黑色箭头表示高度测量值。

# Move towards a Blue Barrel until its height is
# larger than 100 pixels
while True:
    barrel = robot.vision.get_data(BLUE_BARREL)

    if barrel:
        if barrel[0].height < 100:
            robot.move_at(0)
    else:
        robot.stop_all_movement()

    wait(50, MSEC)

.centerX#

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

带有橙色条纹的蓝色桶位于框架中央,周围环绕着黑色边界框。一条垂直的红色虚线从框架顶部延伸至边界框的中心,指示中心的 X 坐标。

# Turn slowly until a Blue Barrel is centered in
# front of the robot
robot.set_turn_velocity(30)
robot.turn(RIGHT)

while True:
    barrel = robot.vision.get_data(BLUE_BARREL)

    if barrel:
        if 140 < barrel[0].centerX < 180: 
            robot.stop_all_movement()

    wait(10,MSEC)

.centerY#

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

带有橙色条纹的蓝色桶位于框架中央,周围环绕着黑色边界框。一条水平红色虚线从框架左侧延伸至边界框中心,表示中心的 Y 坐标。

# Move towards a Blue Barrel until its
# center y-coordinate is more than 140 pixels
while True:
    barrel = robot.vision.get_data(BLUE_BARREL)

    if barrel:
        if barrel[0].centerY < 140:
            robot.move_at(0)
    else:
        robot.stop_all_movement()

    wait(50, MSEC)

.bearing#

.bearing 返回一个浮点数,表示物体距离 AI 视觉传感器视野中心左侧或右侧的距离,以度为单位。0 表示位于中心,正值表示位于右侧,负值表示位于左侧。

# Keep the blue barrel directly in front of the robot
robot.set_turn_velocity(40)
while True:
    vision_data = robot.vision.get_data(BLUE_BARREL)

    if vision_data:

        if vision_data[0].bearing > 5:
            robot.turn(RIGHT)
        elif vision_data[0].bearing < -5:
            robot.turn(LEFT)
        else:
            robot.stop_all_movement()

    else:
        robot.stop_all_movement()

    wait(0.1, SECONDS)

.rotation#

.rotation 以度为单位返回检测到的物体的方向,它是一个介于 0 到 359 之间的整数。

相机界面显示一个垂直堆叠的物体,上半部分为蓝色,下半部分为红色,位于画面中央。物体下方的标签为“Red_Blue A:270° CX:185 CY:81 W:93 H:150”,指示物体的名称、旋转角度、中心 X 和 Y 坐标、宽度和高度。网格线和数字轴标记图像尺寸,X 轴范围为 0 到 320,Y 轴范围为 0 到 240。

# Slide left or right depending on how the
# AprilTag is rotated
while True: 
    apriltags = robot.vision.get_data(ALL_TAGS)

    if apriltags: 
        if 50 < apriltags[0].rotation < 100 :
            robot.move_at(90)
            
        elif 270 < apriltags[0].rotation < 330 :
            robot.move_at(270)
        
        else:
            robot.stop_all_movement()
    else:
        robot.stop_all_movement()

    wait(50, MSEC)

.originX#

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

带有橙色条纹的蓝色桶位于框架中央,周围环绕着黑色边界框。一条垂直的红色虚线从框架顶部延伸到边界框的左边缘,表示边界框原点的 X 坐标。

# Display if an Orange Barrel is to the
# left or the right
while True:
    robot.screen.clear_screen()
    robot.screen.set_cursor(1,1)
    
    orange_barrel = robot.vision.get_data(ORANGE_BARREL)
    
    if orange_barrel:
        if orange_barrel[0].originX < 160:
            robot.screen.print("To the left!")
        else: 
            robot.screen.print("To the right!")

    wait(50, MSEC)

.originY#

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

带有橙色条纹的蓝色桶位于框架中央,周围环绕着黑色边界框。一条水平红色虚线从框架左侧延伸至边界框顶部边缘,表示边界框原点的 Y 坐标。

# Display if an Orange Barrel is close or far
# from the robot
while True:
    robot.screen.clear_screen()
    robot.screen.set_cursor(1, 1)

    orange_barrel = robot.vision.get_data(ORANGE_BARREL)
    
    if orange_barrel:
        if orange_barrel[0].originY < 80:
            robot.screen.print("Far")
        else: 
            robot.screen.print("Close")

    wait(50, MSEC)

.id#

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

对于 AprilTag,.id 属性表示检测到的 AprilTag 的 ID 号,范围为 0 到 36。对于 AI 分类,id 对应于预定义的 id,如下所示。

人工智能分类

ID

签名

0

SPORTS_BALL

蓝桶

1

BLUE_BARREL

橙色桶

2

ORANGE_BARREL

AIM机器人

3

AIM_ROBOT

# Move forward when AprilTag 1 is detected
while True:
    apriltags = robot.vision.get_data(ALL_TAGS)

    if apriltags:
        if apriltags[0].id == 1:
            robot.move_at(0)
    else:
        robot.stop_all_movement()

    wait(50, MSEC)

.score#

.score 以 1 到 100 之间的整数形式返回检测到的 AI 分类的置信度分数。

# Look confident if an Orange Barrel is detected
while True:
    barrel = robot.vision.get_data(ORANGE_BARREL)

    if barrel:
        if barrel[0].score > 95: 
            robot.screen.show_emoji(CONFIDENT)
        else:
            robot.screen.hide_emoji()

    wait(50, MSEC)

.type#

.type 返回检测到的对象类型。它将返回以下之一:

对象类型

包含的对象

AiVision.AI_OBJECT

- Sports balls
- Blue barrels
- Orange barrels

AiVision.TAG_OBJECT

- AprilTags

AiVision.COLOR_OBJECT

- Color signatures

AiVision.CODE_OBJECT

- Color codes

# Display if an AprilTag or AI Classification
# is detected
while True:
    robot.screen.clear_screen()
    robot.screen.set_cursor(1, 1)
    vision_data = robot.vision.get_data(ALL_VISION)
    if vision_data:
        if vision_data[0].type == AiVision.AI_OBJECT:
            robot.screen.print("AI Object!")
        elif vision_data[0].type == AiVision.TAG_OBJECT:
            robot.screen.print("AprilTag!")
    wait(0.1, SECONDS)

# Display a list of all detected objects
while True:
    robot.screen.clear_screen()
    robot.screen.set_cursor(1, 1)
    vision_data = robot.vision.get_data(ALL_VISION)
    
    if vision_data:
        for obj in vision_data:
            if obj.type == AiVision.AI_OBJECT:
                robot.screen.print("- AI Object")
            elif obj.type == AiVision.TAG_OBJECT:
                robot.screen.print("- AprilTag")
            robot.screen.next_row()
    
    wait(0.1, SECONDS)

构造函数#

Creating a Color Signature#

使用 Colordesc 构造函数创建一个新的颜色签名,然后使用 color_description 方法将其注册到 AI 视觉传感器。Colordesc 对象定义了传感器最多 7 个可检测颜色签名中的 1 个,但必须使用 color_description 明确设置才能生效。

Colordesc 用法:
Colordesc(index, red, green, blue, hangle, hdsat)

范围

描述

index

表示颜色签名索引的 1 到 7 之间的整数。如果两个颜色签名使用相同的索引,则第二个颜色签名将覆盖第一个。

red

表示颜色红色成分的 0 至 255 之间的整数。

green

表示颜色的绿色成分的 0 至 255 之间的整数。

blue

表示颜色蓝色成分的 0 至 255 之间的整数。

hangle

1 至 40 之间的浮点数,表示色调范围(以度为单位)。

hdsat

表示饱和度范围从 0.10 到 1.00 的浮点数。

color_description 用法:
robot.vision.color_description(object)

范围

描述

object

Colordesc 对象设置为可检测的颜色签名。

# Detect a red object
red_box = Colordesc(1, 207, 19, 25, 10.00, 0.20)
robot.vision.color_description(red_box)

while True:
    robot.screen.clear_screen()
    robot.screen.set_cursor(1, 1)

    red_boxes = robot.vision.get_data(red_box)

    if red_boxes:
        robot.screen.print("Red detected!")
    else:
        robot.screen.print("No red detected.")

    wait(0.2, SECONDS)

Creating a Color Code#

使用 Codedesc 构造函数创建一个新的颜色代码,然后使用 code_description 方法激活它。颜色代码将 2 到 4 个现有的 Colordesc 对象分组为一个标识符,AI 视觉传感器可以将其作为序列进行检测,但必须使用 code_description 明确设置才能生效。

Codedesc 用法:
Codedesc(index, c1, c2, c3, c4, c5)

范围

描述

index

颜色代码的索引,从 1 到 8。注意:如果创建两个具有相同索引的 Codedesc 对象,则第二个对象将覆盖第一个。

c1

代码中的第一个Colordesc对象。

c2

代码中的第二个Colordesc对象。

c3

可选。第三个 Colordesc 对象。

c4

可选。第四个 Colordesc 对象。

code_description 用法:
robot.vision.code_description(object)

范围

描述

object

一个 Codedesc 对象注册为可检测的颜色代码。

# Create Color Signatures
red_box = Colordesc(1, 207, 19, 25, 10.00, 0.20)
purple_box = Colordesc(2, 98, 18, 227, 10.00, 0.20)

robot.vision.color_description(red_box)
robot.vision.color_description(purple_box)

# Detect a red_purple Color Code
red_purple = Codedesc(1, red_box, purple_box)
robot.vision.code_description(red_purple)

while True:
    robot.screen.clear_screen()
    robot.screen.set_cursor(1, 1)

    code_objects = robot.vision.get_data(red_purple)

    if code_objects:
        robot.screen.print("Code detected!")
    else:
        robot.screen.print("No code detected.")

    wait(0.2, SECONDS)