Зрение#

Введение#

Визуальный датчик дрона VEX AIR обнаруживает и отслеживает идентификаторы AprilTag. Это позволяет дрону анализировать окружающую среду, следовать за объектами и реагировать на основе обнаруженных визуальных данных. Ниже приведен список всех доступных методов и свойств:

Геттеры – определяют, держит ли дрон какой-либо объект.

  • get_data – Возвращает кортеж обнаруженных объектов для конкретной сигнатуры.

Свойства – Данные объекта, возвращаемые из get_data.

  • exists – Существует ли объект в текущем обнаружении.

  • width – Ширина обнаруженного объекта.

  • height – Высота обнаруженного объекта.

  • centerX – X-позиция центра объекта.

  • centerY – Y-положение центра объекта.

  • bearing – Угол объекта относительно переднего датчика зрения или градусы, необходимые для того, чтобы дрон повернулся лицом к объекту.

  • rotation – Ориентация объекта.

  • originX – X-позиция верхнего левого угла объекта.

  • originY – Y-позиция верхнего левого угла объекта.

  • id – Идентификатор тега объекта.

  • type – Возвращает тип объекта.

Геттеры#

get_data#

Функция get_data фильтрует данные из кадра датчика зрения, сводя их к одной сигнатуре — сохраненному описанию чего-либо, что датчик может распознать, например, идентификатора AprilTag, — и возвращает кортеж.

Кортеж хранит объекты, упорядоченные по ширине от наибольшего к наименьшему, начиная с индекса 0. Доступ к свойствам каждого объекта (properties) осуществляется по его индексу. Если соответствующие объекты не обнаружены, возвращается пустой кортеж.

Usage:
drone.vision.get_data(camera, signature, count)

Параметры

Описание

camera

Камера, с которой необходимо получить данные: либо DOWNWARD_CAMERA , либо FORWARD_CAMERA.

signature

Фильтрует набор данных, чтобы включить только данные заданной подписи. Доступные подписи:

  • ALL_TAGS - Все идентификаторы AprilTag
  • TAG0 TAG37 - Один идентификатор AprilTag от 0 до 37

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 в виде целого числа в градусах от 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 в виде целого числа от 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

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)