Бачення#
Вступ#
Датчик зору дрона 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 фільтрує дані з кадру Vision Sensor до єдиного підпису — збереженого опису чогось, що датчик може розпізнати, наприклад, ідентифікатора 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)
Властивості#
Існує кілька властивостей, які додаються до кожного об’єкта, що зберігається в tuple після використання 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 повертає ідентифікаційний номер виявленого 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 |
Ідентифікатори тегів квітня |
|
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)