Зрение#
Введение#
Визуальный датчик дрона 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)
Параметры |
Описание |
|---|---|
|
Камера, с которой необходимо получить данные: либо |
|
Фильтрует набор данных, чтобы включить только данные заданной подписи. Доступные подписи:
|
|
Необязательный параметр. Задает максимальное количество объектов, которые могут быть возвращены, от 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 будет возвращено следующее:
Тип объекта |
Числовое значение |
Включенные объекты |
|---|---|---|
|
8 |
Идентификаторы AprilTag |
|
1 |
Цветовые подписи - Скоро! |
|
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)