想象#

VEX EXP 的视觉传感器可以检测并追踪颜色特征和颜色代码。这使得视觉传感器能够分析周围环境并根据检测到的视觉数据做出反应。以下是所有方法的列表:

方法——从视觉传感器获取数据。

  • take_snapshot – 捕获特定颜色特征或颜色代码的数据。

  • largest_object – 立即从快照中选择最大的对象。

  • 已安装 – 视觉传感器是否连接到 EXP Brain。

属性 – 从 take_snapshot 返回的对象数据。

  • .exists – 以布尔值表示该对象是否存在于当前检测中。

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

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

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

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

  • .angle – 颜色代码的方向(以度为单位)。

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

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

构造函数——手动初始化和配置视觉传感器。

在 VEXcode 中,视觉传感器及其配置的 颜色签名颜色代码 的初始化是自动完成的。在以下示例中,配置的视觉传感器将被命名为 vision_1。要手动初始化和构建视觉传感器及其颜色签名和颜色代码,请参阅本页的 构造函数 部分。

方法#

take_snapshot#

take_snapshot 会过滤视觉传感器帧中的数据并返回一个元组。视觉传感器可以检测已配置的颜色签名和颜色代码。

必须先在 Vision Utility 中配置 颜色签名颜色代码,然后才能使用此方法。

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

用法:
vision_1.take_snapshot(SIGNATURE)

参数

描述

签名

要获取数据的签名。这是视觉传感器的名称,两个下划线,然后是颜色签名或颜色代码的名称。例如:“vision_1__RED_BOX”。

# Move forward if a red object is detected
while True:
    red_box = vision_1.take_snapshot(vision_1__RED_BOX)
    if red_box:
        drivetrain.drive_for(FORWARD, 10, MM)
    wait(5, MSEC)

色彩签名#

颜色特征是视觉传感器能够识别的独特颜色。这些特征使传感器能够根据物体的颜色检测和跟踪物体。配置颜色特征后,传感器可以识别其视野范围内具有该特定颜色的物体。颜色特征与 take_snapshot 一起使用,可以实时处理和检测彩色物体。

为了在项目中使用已配置的颜色签名,其名称必须为视觉传感器的名称、两个下划线,以及颜色签名的名称。例如:“vision_1__RED_BOX”。

# Display if any objects match the RED_BOX signature
while True:
    brain.screen.set_cursor(1, 1)
    brain.screen.clear_screen()
    # Change to any configured Color Signature
    red_box = vision_1.take_snapshot(vision_1__RED_BOX)
    if red_box:
        brain.screen.print("Color signature")
        brain.screen.next_row()
        brain.screen.print("detected!")
        wait(100, MSEC)

颜色代码#

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

为了在项目中使用已配置的颜色代码,其名称必须为视觉传感器的名称、两个下划线以及颜色代码的名称。例如:“vision_1__BOX_CODE”。

# Display if any objects match the BOX_CODE code
while True:
    brain.screen.set_cursor(1, 1)
    brain.screen.clear_screen()
    # Change to any configured Color Code
    box_code = vision_1.take_snapshot(vision_1__BOX_CODE)
    if box_code:
        brain.screen.print("Color code")
        brain.screen.next_row()
        brain.screen.print("detected!")
        wait(100, MSEC)

largest_object#

largest_object 从最近一次使用 take_snapshot 返回的元组中检索检测到的最大对象以获取数据。

此方法可用于始终从元组中获取最大对象,而无需指定索引。

用法:
vision_1.largest_object

# Turn slowly until the largest object is centered in
# front of the Vision Sensor
drivetrain.set_turn_velocity(10, PERCENT)
drivetrain.turn(RIGHT)

while True:
    red_box = vision_1.take_snapshot(vision_1__RED_BOX)

    if red_box:
        if 140 < vision_1.largest_object().centerX < 180: 
            drivetrain.stop()

    wait(10,MSEC)

installed#

installed 返回一个布尔值,指示视觉传感器当前是否连接到 EXP Brain。

  • “True”——视觉传感器已连接到 EXP Brain。

  • “False” – 视觉传感器未连接到 EXP Brain。

参数

描述

该方法没有参数。

# Display a message if the Vision Sensor is connected
if vision_1.installed():
    brain.screen.print("Vision Sensor")
    brain.screen.next_row()
    brain.screen.print("Installed!")

特性#

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

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

.exists#

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

  • True:索引存在。

  • False:索引不存在。

# Check if at least at least one red objects is detected
# You will receive an error if no objects are detected

while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1, 1)
    red_objects = vision_1.take_snapshot(vision_1__RED_BOX)

    if red_objects:
        if red_objects[0].exists:
            brain.screen.print("At least 1")
            
    else:
        brain.screen.print("No red objects")

    wait(0.5, SECONDS)

.width#

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

# Move towards a blue object until its width is
# larger than 100 pixels
while True:
    blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)

    if blue_box:
        if blue_box[0].width < 100:
            drivetrain.drive_for(FORWARD, 10, MM)
    else:
        drivetrain.stop()

    wait(50, MSEC)

.height#

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

# Move towards a blue object until its height is
# larger than 100 pixels
while True:
    blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)

    if blue_box:
        if blue_box[0].height < 100:
            drivetrain.drive_for(FORWARD, 10, MM)
    else:
        drivetrain.stop()

    wait(50, MSEC)

.centerX#

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

# Turn slowly until the largest blue object is centered
# in front of the Vision Sensor.
drivetrain.set_turn_velocity(10, PERCENT)
drivetrain.turn(RIGHT)

while True:
    blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)

    if blue_box:
        if 140 < vision_1.largest_object().centerX < 180: 
            drivetrain.stop()

    wait(10,MSEC)

.centerY#

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

# Move towards a blue object until its
# center y-coordinate is more than 140 pixels
while True:
    blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)

    if blue_box:
        if blue_box[0].centerY < 140:
            drivetrain.drive(FORWARD)
    else:
        drivetrain.stop()

    wait(50, MSEC)

.angle#

.angle 以度为单位返回检测到的物体的方向,它是 0 到 316 之间的整数。

# Turn left or right depending on how a
# configured box code is rotated
while True: 
    box_code = vision_1.take_snapshot(vision_1__BOX_CODE)

    if box_code: 
        if 70 < box_code[0].angle < 110:
            drivetrain.turn_for(RIGHT, 45, DEGREES)
            
        elif 250 < box_code[0].angle < 290:
            drivetrain.turn_for(LEFT, 45, DEGREES)
        
        else:
            drivetrain.stop()

    wait(50, MSEC)

.originX#

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

# Display if a red object is to the
# left or the right
while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1,1)
    
    red_box = vision_1.take_snapshot(vision_1__RED_BOX)
    
    if red_box:
        if red_box[0].originX < 160:
            brain.screen.print("To the left!")
        else: 
            brain.screen.print("To the right!")

    wait(50, MSEC)

.originY#

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

# Display if a red object is close or far
# from the robot
while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1,1)
    
    red_box = vision_1.take_snapshot(vision_1__RED_BOX)

    if red_box:
        if red_box[0].originY < 80:
            brain.screen.print("Far")
        else: 
            brain.screen.print("Close")

    wait(50, MSEC)

构造函数#

构造函数用于手动创建“Vision”、“Signature”和“Code”对象,这些对象对于在 VEXcode 之外配置视觉传感器是必需的。

对于下面的示例,配置的视觉传感器将被命名为“vision_1”,并且配置的颜色签名对象(例如“RED_BOX”)将在整个 API 文档的所有后续示例中用于引用“Vision”类方法。

Vision Sensor#

“Vision”创建一个视觉传感器。

用法

视觉(端口、亮度、信号)

参数

描述

端口

视觉传感器连接到的有效 智能端口

亮度

**可选。**视觉传感器的亮度值,从 1 到 100。

sigs

**可选。**一个或多个 颜色签名颜色代码 对象的名称。

# Create a new Signature "RED_BOX" with the Colordesc class
RED_BOX = Signature(1, -3911, -3435, -3673,10879, 11421, 11150,2.5, 0)
# Create a new Vision Sensor "vision_1" with the Vision
# class, with the "RED_BOX" Signature.
vision_1 = Vision(Ports.PORT1, 100, RED_BOX)

# Move forward if a red object is detected
while True:
    red_object = vision_1.take_snapshot(RED_BOX)
    if red_object:
        drivetrain.drive_for(FORWARD, 10, MM)
    wait(5, MSEC)

Color Signature#

“签名”会创建一个颜色签名。视觉传感器上最多可同时存储七种不同的颜色签名。

用法:

签名(索引、uMin、uMax、uMean、vMin、vMax、vMean、rgb、类型)

范围

描述

索引

Signature 对象的索引,从 1 到 7。**注意:**创建两个具有相同索引号的 Signature 对象将导致第二个创建的对象覆盖第一个。

uMin

Vision Utility 中“uMin”的值。

uMax

Vision Utility 中“uMax”的值。

uMean

Vision Utility 中“uMean”的值。

vMin

Vision Utility 中“vMin”的值。

vMax

Vision Utility 中“vMax”的值。

vMean

Vision Utility 中“vMean”的值。

rgb

Vision Utility 中“rgb”的值。

类型

Vision Utility 中“type”的值。

要获取创建颜色签名的值,请转到 Vision Utility。配置颜色签名后,从配置窗口复制参数值。

# Create a new Signature RED_BOX with the Colordesc class
RED_BOX = Signature(1, 10121, 10757, 10439,-1657, -1223, -1440,2.5, 1)
# Create a new Vision Sensor "vision_1" with the Vision
# class, with the RED_BOX Signature.
vision_1 = Vision(Ports.PORT1, 100, RED_BOX)

# Move forward if a red object is detected
while True:
    red_object = vision_1.take_snapshot(RED_BOX)
    if red_object:
        drivetrain.drive_for(FORWARD, 10, MM)
    wait(5, MSEC)

Color Code#

“代码”用于创建颜色代码。它需要至少两个已定义的颜色签名才能使用。一个视觉传感器最多可同时存储八个不同的颜色代码。

用法:

代码(sig1、sig2、sig3、sig4、sig5)

范围

描述

sig1

先前创建的 颜色签名

sig2

先前创建的 颜色签名

sig3

可选。 之前创建的 颜色签名

sig4

可选。 之前创建的 颜色签名

sig5

可选。 之前创建的 颜色签名

# Create two new Signatures for a red and blue box
RED_BOX = Signature(1, 10121, 10757, 10439,-1657, -1223, -1440, 2.5, 1)
BLUE_BOX = Signature(2, -4443, -3373, -3908,6253, 7741, 6997, 2.5, 1)
# Create a Color Code for a red box to the left of a blue box
RED_BLUE = Code(RED_BOX, BLUE_BOX)
# Create a new Vision Sensor "vision_1" with the Vision
# class, with the red_box and blue_box Signatures.
vision_1 = Vision(Ports.PORT1, 100, RED_BOX, BLUE_BOX)

# Display a message if Color Code is detected
while True:
    brain.screen.set_cursor(1, 1)
    brain.screen.clear_screen()
    # Change to any configured Color Code
    box_code = vision_1.take_snapshot(RED_BLUE)
    if box_code:
        brain.screen.print("Color code")
        brain.screen.next_row()
        brain.screen.print("detected!")
        wait(100, MSEC)