视觉仪#

简介#

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

获取方法 — 检测无人机是否持有物体。

  • get_data —针对特定特征返回一个包含所检测物体的元组。

属性—从get_data返回的对象数据。

  • exists – 表示当前检测中是否存在该物体。

  • width —检测到的对象的宽度。

  • height —检测到的物体的高度。

  • centerX —对象中心的X位置。

  • centerY —对象中心的Y位置。

  • bearing – 物体相对于前视摄像头的角度,或无人机转向该物体所需旋转的角度。

  • rotation —对象的方向。

  • originX —对象左上角的X位置。

  • originY —对象左上角的Y位置。

  • id – 物体的标签 ID。

  • type – 返回物体的类型。

获取方法#

get_data#

get_data 根据指定的特征标识(即传感器能够识别的物体的已保存描述,例如 AprilTag ID)筛选摄像头画面中的数据,并返回一个元组。

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

用法:
drone.vision.get_data(camera, signature, count)

参数

描述

camera

要获取数据的摄像头:DOWNWARD_CAMERA或 FORWARD_CAMERA。

signature

筛选数据集,仅保留与指定特征标识匹配的数据。可用的特征标识包括:

  • ALL_TAGS - 所有 AprilTag ID
  • TAG0 至 TAG37 - 0 至 37 之间的单个 AprilTag ID

count

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

# Climb upward when an AprilTag ID is detected
drone.take_off(climb_to=500)
while True:
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    if vision_data[0].exists:
        drone.climb_for(direction=UP, distance=200)

特性#

使用 get_data 后,存储在 元组 中的每个物体都包含多个属性。

除 .id 和 .type 外,所有属性值均描述调用 get_data 时检测到的物体的位置、大小、姿态或方位角。这些值以像素或度为单位进行测量。每个摄像头的分辨率各不相同:

  • 前向:640 x 480像素

  • 向下:640 x 400像素

.exists#

.exists 返回一个布尔值,表示指定索引是否存在于元组中。如果没有检测到任何物体,则返回错误。

  • True — 该索引存在。

  • False —索引不存在。

# Climb upward when an AprilTag ID is detected
drone.take_off(climb_to=500)
while True:
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    if vision_data[0].exists:
        drone.climb_for(direction=UP, distance=200)

.width#

.width 返回检测到的物体的宽度(以像素为单位),返回值为 1 至 640 之间的整数。

# Show if the AprilTag ID appears large or small
while True:
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    clear_console()
    if vision_data[0].exists:
        if vision_data[0].width > 100:
            print("Large")
        else:
            print("Small")
    wait(0.2, SECONDS)

.height#

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

# Show if the AprilTag ID appears large or small
while True:
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    clear_console()
    if vision_data[0].exists:
        if vision_data[0].height > 100:
            print("Large")
        else:
            print("Small")
    wait(0.2, SECONDS)

.centerX#

.centerX 返回检测到的物体中心点的 x 坐标(以像素为单位),返回值为 1 至 640 之间的整数。

# Show if an AprilTag ID is to the left or the right of the camera
while True:
    clear_console()
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    if vision_data[0].exists:
        if vision_data[0].centerX < 320:
            print("To the left!")
        else:
            print("To the right!")
    wait(0.2, SECONDS)

.centerY#

.centerY 返回检测到的物体中心点的 y 坐标(以像素为单位),返回值为 1 至 480 之间的整数。

# Take off and align drone with AprilTag ID on wall
# Change drone.take_off parameter to see different results
drone.take_off(climb_to=800)
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
    if vision_data[0].centerY < 240:
        print("Below the target!")
    else:
        print("Above the target!")
else:
    print("No target found!")

.bearing#

.bearing 返回一个角度,表示物体相对于无人机的位置。具体行为取决于所使用的摄像头。

0° 表示物体中心与传感器中心对齐。正值表示物体位于右侧,负值表示物体位于左侧。

传感器

返回

向下

无人机前部必须旋转一定角度才能与物体的中心对齐,角度范围从 -180º 到 180º。

向前

物体向视觉传感器中心左侧或右侧偏移的度数,范围为 -180º 至 180º。

# Align the front of the drone to an AprilTag ID
drone.set_turn_velocity(15)
drone.take_off(climb_to=500)
while True:
    vision_data = drone.vision.get_data(DOWNWARD_CAMERA, ALL_TAGS)
    if vision_data[0].exists:
        if -20 < vision_data[0].bearing < 20:
            # Hover once sensor is centered on AprilTag ID
            drone.hover()
            controller.sound.play(SUCCESS)
            while controller.sound.is_active():
                wait(50, MSEC)
        elif vision_data[0].bearing < -21:
            drone.turn(LEFT)
        else:
            drone.turn(RIGHT)
    wait(5, MSEC)

.rotation#

.rotation 返回检测到的 AprilTag ID 的旋转角度,返回值为 1 至 359 度之间的整数。

# Turn left or right based on the rotation of an AprilTag ID
drone.take_off(climb_to=1000)
while True:
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    if vision_data[0].exists:
        if 240 < vision_data[0].rotation < 300:
            drone.turn_for(LEFT, 90)
        elif 60 < vision_data[0].rotation < 120:
            drone.turn_for(RIGHT, 90)
        else:
            drone.hover()
    wait(0.2, SECONDS)

.originX#

.originX 返回检测到的物体边界框左上角的 x 坐标(以像素为单位),返回值为 1 至 640 之间的整数。

# Draw lines to the AprilTag ID origin from all corners
while True:
    controller.screen.clear_screen()
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    if vision_data[0].exists:
        controller.screen.draw_line(0, 0, vision_data[0].originX, vision_data[0].originY)
        controller.screen.draw_line(0, 480, vision_data[0].originX, vision_data[0].originY)
        controller.screen.draw_line(640, 0, vision_data[0].originX, vision_data[0].originY)
        controller.screen.draw_line(640, 480, vision_data[0].originX, vision_data[0].originY)
    wait(0.2, SECONDS)

.originY#

.originY 返回检测到的物体边界框左上角的 y 坐标(以像素为单位),返回值为 1 至 480 之间的整数。

# Draw lines to the AprilTag ID origin from all corners
while True:
    controller.screen.clear_screen()
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    if vision_data[0].exists:
        controller.screen.draw_line(0, 0, vision_data[0].originX, vision_data[0].originY)
        controller.screen.draw_line(0, 480, vision_data[0].originX, vision_data[0].originY)
        controller.screen.draw_line(640, 0, vision_data[0].originX, vision_data[0].originY)
        controller.screen.draw_line(640, 480, vision_data[0].originX, vision_data[0].originY)
    wait(0.2, SECONDS)

.id#

.id 返回检测到的 AprilTag ID 的识别编号,返回值为 0 至 37 之间的整数。

# Display the detected AprilTag ID
while True:
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    clear_console()
    if vision_data[0].exists:
        print(vision_data[0].id)
    wait(0.2, SECONDS)

.type#

.type 返回检测到的物体类型。可能返回以下值:

对象类型

数值

包含的对象

drone.vision.TAG_OBJECT

8

AprilTag IDs

drone.vision.COLOR_OBJECT

1

颜色签名 - 即将推出!

drone.vision.CODE_OBJECT

2

颜色代码 - 即将推出!

# Display what AprilTag ID is detected
while True:
    controller.screen.clear_screen()
    controller.screen.set_cursor(1, 1)
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    if vision_data[0].exists:
        if vision_data[0].type == drone.vision.TAG_OBJECT:
            controller.screen.print("AprilTag ID: ")
            controller.screen.print(vision_data[0].id)

    wait(0.1, SECONDS)