Зір штучного інтелекту#
Вступ#
Датчик зору на базі штучного інтелекту робота-кодера VEX AIM виявляє та відстежує об’єкти, кольори та ідентифікатори AprilTag. Це дозволяє роботу аналізувати своє оточення, стежити за об’єктами та реагувати на основі виявлених візуальних даних.
Датчик зору зі штучним інтелектом має роздільну здатність 320×240 пікселів. Початок координат (0, 0) розташований у верхньому лівому куті, а центр датчика знаходиться в точці (160, 120), як показано на діаграмі нижче:

Нижче наведено список усіх методів та властивостей:
Дії — Показати або приховати зображення з камери AI Vision.
show_aivision— Відображає зображення зі штучного інтелекту на екрані робота.hide_aivision— Приховує стрічку AI Vision з екрана.tag_detection— Вмикає або вимикає виявлення ідентифікатора AprilTag.
Геттери — Виявляють, чи робот тримає об’єкт.
get_data— Повертає кортеж виявлених об’єктів для певної сигнатури.has_sports_ball— Повертає, чи є у робота спортивний м’яч.has_any_barrel— Повертає, чи має робот будь-який тип бочки.has_blue_barrel— Повертає, чи має робот синю бочку.has_orange_barrel— Повертає, чи має робот помаранчеву бочку.
Властивості — Дані об’єкта, повернуті з get_data.
exists— Чи існує об’єкт у поточному виявленні як логічне значення.width— Ширина виявленого об’єкта.height— Висота виявленого об’єкта.centerX— Положення центру об’єкта по осі X.centerY— Положення центру об’єкта по осі Y.bearing— Горизонтальний кут відносно передньої частини робота.rotation— Орієнтація об’єкта.originX— Позиція верхнього лівого кута об’єкта по осі X.originY— Позиція верхнього лівого кута об’єкта по осі Y.id— Класифікація або ідентифікатор тегу об’єкта.score— Оцінка достовірності для класифікацій ШІ.type— Повертає тип об’єкта (AI, Тег, Колір або Код).
Конструктори — Визначають колірні підписи та коди.
Створити колірну сигнатуру — Створює нову колірну сигнатуру на основі RGB та діапазонів відтінку/насиченості.
Створити колірний код — Об’єднує кілька колірних підписів в один колірний код.
Дії#
show_aivision#
show_aivision відображає дані в реальному часі з датчика зору штучного інтелекту на екрані робота. Дані в реальному часі перекриватимуть будь-які інші зображення чи текст на екрані.
Примітка: На екрані не відображатимуться жодні інші зображення чи текст, якщо для приховування стрічки не використовується параметр hide_aivision.
Usage:
robot.screen.show_aivision()
Параметри |
Опис |
|---|---|
Цей метод не має параметрів. |
# Watch the AI Vision Sensor detect AI Classifications
# and AprilTag IDs as you move the robot
robot.screen.show_aivision()
hide_aivision#
hide_aivision видаляє поток даних у реальному часі від датчика зору штучного інтелекту з екрана робота.
Usage:
robot.screen.hide_aivision()
Параметри |
Опис |
|---|---|
Цей метод не має параметрів. |
# View the AI Vision Sensor's feed for five seconds
robot.screen.show_aivision()
wait(5, SECONDS)
robot.screen.hide_aivision()
tag_detection#
tag_detection вмикає або вимикає виявлення ідентифікатора AprilTag, де стан є логічним значенням.
Датчик може виявляти ідентифікатори AprilTag від 0 до 36 з сімейства Circle21h7.
Usage:
robot.vision.tag_detection(state)
Параметри |
Опис |
|---|---|
|
Значення: |
robot.screen.set_font(PROP30)
# Cut off AprilTag ID detection after 5 seconds
while True:
if timer.time(SECONDS) > 5:
robot.vision.tag_detection(False)
robot.screen.clear_screen()
robot.screen.set_cursor(3, 1)
apriltags = robot.vision.get_data(ALL_TAGS)
if apriltags[0].exists:
robot.screen.print("AprilTag ID detected!")
else:
robot.screen.print("Nothing detected!")
wait(0.1, SECONDS)
Геттери#
get_data#
get_data фільтрує дані з кадру AI Vision Sensor до єдиного підпису — збереженого опису чогось, що може розпізнати датчик, наприклад, попередньо навченого об’єкта, ідентифікатора AprilTag або налаштованого колірного підпису чи колірного коду — і повертає кортеж.
Кольорові підписи та Кольорові коди необхідно спочатку налаштувати в утиліті AI Vision, перш ніж їх можна буде використовувати з цим методом.
Кортеж tuple зберігає об’єкти, відсортовані від найбільшого до найменшого за шириною, починаючи з індексу 0. Доступ до властивостей properties кожного об’єкта можна отримати за його індексом. Якщо не виявлено відповідних об’єктів, повертається порожній кортеж.
Usage:
robot.vision.get_data(signature, count)
Параметри |
Опис |
|---|---|
|
Фільтрує набір даних, щоб включити лише дані заданого підпису. Доступні підписи:
|
|
Необов’язково. Встановлює максимальну кількість об’єктів, які можна повернути, від 1 до 24 (за замовчуванням: 8). |
Примітка: Ідентифікатори AprilTag з 5 по 37 можна отримати, використовуючи роздруковані ідентифікатори AprilTag з AIM Printables.
# Move forward if a sports ball is detected
while True:
ball = robot.vision.get_data(SPORTS_BALL)
if ball[0].exists:
robot.move_for(10, 0)
wait(50, MSEC)
Примітка: Повернений кортеж можна відсортувати за будь-якою властивістю property, а не лише за шириною, використовуючи функцію Python sorted sorted Наприклад, сортування за ідентифікатором AprilTag:
# Print each detected AprilTag ID in ascending order by ID
while True:
apriltags = sorted(robot.vision.get_data(ALL_TAGS), key=id)
for tag in apriltags:
print(tag.id)
wait(1, SECONDS)
Або сортування за висотою:
# Print each detected AprilTag ID in ascending order by height
while True:
apriltags_by_height = sorted(robot.vision.get_data(ALL_TAGS), key=lambda tag: tag.height)
for tag in apriltags_by_height:
print(tag.height)
wait(1, SECONDS)
Перегляд даних#
Виведення кортежу, повернутого функцією get_data відображає список усіх властивостей усіх виявлених об’єктів:
# Display properties of all detected AprilTag IDs
while True:
vision_data = robot.vision.get_data(ALL_TAGS)
if vision_data[0].exists:
break
wait(0.25, SECONDS)
print(vision_data)

Класифікації ШІ#
Датчик зору AIM AI може виявляти такі класифікації штучного інтелекту:
Ідентифікаційний номер |
Класифікація ШІ |
Підпис |
|---|---|---|
0 |
М’яч |
|
1 |
Блакитна бочка |
|
2 |
Помаранчева бочка |
|
3 |
Робот AIM |
|
Кольорові підписи#
Колірна сигнатура – це унікальний колір, який може розпізнати датчик зору зі штучним інтелектом. Ці сигнатури дозволяють датчику виявляти та відстежувати об’єкти на основі їхнього кольору. Після налаштування колірної сигнатури датчик може ідентифікувати об’єкти з цим певним кольором у своєму полі зору. Колірні сигнатури використовуються разом з get_data для обробки та виявлення кольорових об’єктів у режимі реального часу.

# Display if any objects match the Red_Box signature
while True:
robot.screen.set_cursor(1, 1)
robot.screen.clear_row(1)
# Change to any configured Color Signature
ai_objects = robot.vision.get_data(Red_Box)
if ai_objects[0].exists:
robot.screen.print("Color signature detected!")
Колірні коди#
Колірний код — це структурований візерунок, що складається з 2–4 колірних сигнатур, розташованих у певному порядку. Ці коди дозволяють датчику зору зі штучним інтелектом розпізнавати заздалегідь визначені кольорові візерунки. Колірні коди корисні для ідентифікації складних об’єктів або створення унікальних маркерів для автономної навігації.

# Display if any objects match the BlueRed code
while True:
robot.screen.set_cursor(1, 1)
robot.screen.clear_row(1)
# Change to any configured Color Code
ai_objects = robot.vision.get_data(BlueRed)
if ai_objects[0].exists:
robot.screen.print("Color code detected!")
has_sports_ball#
has_sports_ball повертає логічне значення, яке вказує, чи є у робота наразі спортивний м’яч.
True— У робота є спортивний м’яч.False— У робота немає спортивного м’яча.
Usage:
robot.has_sports_ball()
Параметри |
Опис |
|---|---|
Цей метод не має параметрів. |
# Kick when the robot has a sports ball
while True:
if robot.has_sports_ball():
robot.kicker.kick(MEDIUM)
wait(50, MSEC)
has_any_barrel#
has_any_barrel повертає логічне значення, яке вказує, чи має робот наразі будь-який тип бочки.
True— У робота є бочка.False— У робота немає бочки.
Usage:
robot.has_any_barrel()
Параметри |
Опис |
|---|---|
Цей метод не має параметрів. |
# Push a barrel away when detected
while True:
if robot.has_any_barrel():
robot.kicker.place()
wait(50, MSEC)
has_blue_barrel#
has_blue_barrel повертає логічне значення, яке вказує, чи має робот наразі синю бочку.
True— Робот має синю бочку.False— У робота немає синьої бочки.
Usage:
robot.has_blue_barrel()
Параметри |
Опис |
|---|---|
Цей метод не має параметрів. |
# Push a blue barrel away when detected
while True:
if robot.has_blue_barrel():
robot.kicker.place()
wait(50, MSEC)
has_orange_barrel#
has_orange_barrel повертає логічне значення, яке вказує, чи має робот наразі помаранчеву бочку.
True— Робот має помаранчеву бочку.False— У робота немає помаранчевої бочки.
Usage:
robot.has_orange_barrel()
Параметри |
Опис |
|---|---|
Цей метод не має параметрів. |
# Push an orange barrel away when detected
while True:
if robot.has_orange_barrel():
robot.kicker.place()
wait(50, MSEC)
Властивості#
Існує дванадцять властивостей, які додаються до кожного об’єкта, що зберігається в кортежі після використання методу robot.vision.get_data.
All property values except .id, .score, and .type describe the detected object’s position, size, orientation, or bearing at the moment robot.vision.get_data was used. These values are measured in pixels or degrees, based on the sensor’s 320 by 240 pixel resolution.

.exists#
.exists повертає логічне значення, яке вказує, чи існує індекс у кортежі чи ні.
True— Індекс існує.False— Індекс не існує.
# Check if at least two objects are detected
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
ai_objects = robot.vision.get_data(ALL_CARGO)
if ai_objects[0].exists:
if ai_objects[1].exists:
robot.screen.print("At least 2")
else:
robot.screen.print("Less than 2")
wait(0.1, SECONDS)
.width#
.width повертає ширину виявленого об’єкта в пікселях, що є цілим числом від 1 до 320.
Примітка: Значення пікселів відносні до системи координат датчика. Див. діаграму у вступі для довідки.

# Move towards a Blue Barrel until its width is
# larger than 100 pixels
while True:
barrel = robot.vision.get_data(BLUE_BARREL)
if barrel[0].exists:
if barrel[0].width < 100:
robot.move_at(0)
else:
robot.stop_all_movement()
wait(50, MSEC)
.height#
.height повертає висоту виявленого об’єкта в пікселях, що є цілим числом від 1 до 240.
Примітка: Значення пікселів відносні до системи координат датчика. Див. діаграму у вступі для довідки.

# Move towards a Blue Barrel until its height is
# larger than 100 pixels
while True:
barrel = robot.vision.get_data(BLUE_BARREL)
if barrel[0].exists:
if barrel[0].height < 100:
robot.move_at(0)
else:
robot.stop_all_movement()
wait(50, MSEC)
.centerX#
.centerX повертає x-координату центру виявленого об’єкта в пікселях, яка є цілим числом від 0 до 320.
Примітка: Значення пікселів відносні до системи координат датчика. Див. діаграму у вступі для довідки.

# Turn slowly until a Blue Barrel is centered in
# front of the robot
robot.set_turn_velocity(30)
robot.turn(RIGHT)
while True:
barrel = robot.vision.get_data(BLUE_BARREL)
if barrel[0].exists:
if 140 < barrel[0].centerX < 180:
robot.stop_all_movement()
wait(10,MSEC)
.centerY#
.centerY повертає y-координату центру виявленого об’єкта в пікселях, яка є цілим числом від 0 до 240.
Примітка: Значення пікселів відносні до системи координат датчика. Див. діаграму у вступі для довідки.

# Move towards a Blue Barrel until its
# center y-coordinate is more than 140 pixels
while True:
barrel = robot.vision.get_data(BLUE_BARREL)
if barrel[0].exists:
if barrel[0].centerY < 140:
robot.move_at(0)
else:
robot.stop_all_movement()
wait(50, MSEC)
.bearing#
.bearing повертає десяткове число (float), яке представляє відстань між об’єктом та центром поля зору датчика штучного інтелекту у градусах. Значення 0 означає, що об’єкт розташований по центру, додатні значення означають, що об’єкт розташований праворуч, а від’ємні значення означають, що об’єкт розташований ліворуч.
# Turn to keep the Blue Barrel directly in front
robot.set_turn_velocity(40)
while True:
vision_data = robot.vision.get_data(BLUE_BARREL)
if vision_data[0].exists:
if vision_data[0].bearing > 5:
robot.turn(RIGHT)
elif vision_data[0].bearing < -5:
robot.turn(LEFT)
else:
robot.stop_all_movement()
else:
robot.stop_all_movement()
wait(0.1, SECONDS)
.rotation#
.rotation повертає орієнтацію об’єкта на площині огляду датчика штучного інтелекту, виміряну в градусах від 0 до 359. Колірний код дорівнює 0°, коли його кольори розташовані по горизонтальній лінії (наприклад, червоний–синій). Якщо кольори повертаються, кут змінюється (наприклад, розташування синього-червоного повертає 180°).
Для наведеного нижче прикладу Колірний код налаштовано так, що ліворуч червоний, а праворуч – синій.
На цьому зображенні накладання синього поверх червоного еквівалентне повороту оригінального колірного коду на 270 градусів праворуч.

# Slide left or right depending on how a Color Code (BlueRed)
# is rotated on the vertical plane
while True:
# Original Color Code is Red to the left, Blue to the right
code = robot.vision.get_data(BlueRed)
if code[0].exists:
# Check if Color Code is now Red on top of Blue
if 50 < code[0].rotation < 100 :
robot.move_at(90)
# Check if Color Code is now Blue on top of Red
elif 270 < code[0].rotation < 330 :
robot.move_at(270)
else:
robot.stop_all_movement()
else:
robot.stop_all_movement()
wait(50, MSEC)
.originX#
.originX повертає x-координату верхнього лівого кута рамки визначення виявленого об’єкта в пікселях, що є цілим числом від 0 до 320.
Примітка: Значення пікселів відносні до системи координат датчика. Див. діаграму у вступі для довідки.

# Display if an Orange Barrel is to the
# left or the right
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1,1)
orange_barrel = robot.vision.get_data(ORANGE_BARREL)
if orange_barrel[0].exists:
if orange_barrel[0].originX < 160:
robot.screen.print("To the left!")
else:
robot.screen.print("To the right!")
wait(50, MSEC)
.originY#
.originY повертає y-координату верхнього лівого кута рамки визначення виявленого об’єкта в пікселях, що є цілим числом від 0 до 240.
Примітка: Значення пікселів відносні до системи координат датчика. Див. діаграму у вступі для довідки.

# Display if an Orange Barrel is close or far
# from the robot
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
orange_barrel = robot.vision.get_data(ORANGE_BARREL)
if orange_barrel[0].exists:
if orange_barrel[0].originY < 80:
robot.screen.print("Far")
else:
robot.screen.print("Close")
wait(50, MSEC)
.id#
.id повертає ідентифікатор виявленої класифікації ШІ або ідентифікатор AprilTag як ціле число.
Для ідентифікатора AprilTag властивість .id представляє виявлений номер ідентифікатора AprilTag у діапазоні від 0 до 37. Для класифікації ШІ властивість .id відповідає попередньо визначеному ідентифікатору в розділі Класифікації ШІ.
# Move forward when AprilTag ID 1 is detected
while True:
apriltags = robot.vision.get_data(ALL_TAGS)
if apriltags[0].exists:
if apriltags[0].id == 1:
robot.move_at(0)
else:
robot.stop_all_movement()
wait(50, MSEC)
.score#
.score повертає бал достовірності виявленої класифікації ШІ як ціле число від 1 до 100.
Нижчий бал означає, що датчик менш впевнений у виявленому об’єкті, тоді як вищий бал означає, що датчик більш впевнений.
# Look confident if an Orange Barrel is detected
while True:
barrel = robot.vision.get_data(ORANGE_BARREL)
if barrel[0].exists:
if barrel[0].score > 95:
robot.screen.show_emoji(CONFIDENT)
else:
robot.screen.hide_emoji()
wait(50, MSEC)
.type#
.type повертає ціле число, яке вказує на тип виявленого об’єкта. Ви можете порівняти це значення, використовуючи або номер типу, або відповідну іменовану константу:
Тип об’єкта |
Включені об’єкти |
|---|---|
|
— Спортивні м’ячі |
|
— Ідентифікатори тегів AprilTag |
|
— Кольорові підписи |
|
— Кольорові коди |
# Display if an AprilTag ID or AI Classification
# is detected
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
vision_data = robot.vision.get_data(ALL_VISION)
if vision_data[0].exists:
if vision_data[0].type == AiVision.AI_OBJECT:
robot.screen.print("AI Object!")
elif vision_data[0].type == AiVision.TAG_OBJECT:
robot.screen.print("AprilTag ID!")
wait(0.1, SECONDS)
# Display a list of all detected objects
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
vision_data = robot.vision.get_data(ALL_VISION)
if vision_data[0].exists:
for obj in vision_data:
if obj.type == AiVision.AI_OBJECT:
robot.screen.print("- AI Object")
elif obj.type == AiVision.TAG_OBJECT:
robot.screen.print("- AprilTag ID")
robot.screen.next_row()
wait(0.1, SECONDS)
Конструктори#
Creating a Color Signature#
Нова кольорова сигнатура створюється за допомогою конструктора Colordesc , а потім реєструється в сенсоре штучного інтелекту з візуальним зображенням за допомогою методу color_description Об’єкт Colordesc визначає 1 з максимум 7 виявлюваних кольорових сигнатур для сенсора, але її необхідно явно встановити за допомогою color_description , щоб вона набула чинності.
Використання Colordesc:
Colordesc(index, red, green, blue, hangle, hdsat)
Параметр |
Опис |
|---|---|
|
Ціле число від 1 до 7, що представляє індекс колірної сигнатури. Якщо дві колірні сигнатури використовують однаковий індекс, друга перевизначатиме першу. |
|
Ціле число від 0 до 255 для червоного компонента кольору. |
|
Ціле число від 0 до 255 для зеленого компонента кольору. |
|
Ціле число від 0 до 255 для синього компонента кольору. |
|
Число з плаваючою комою від 1 до 40, що представляє діапазон відтінку в градусах. |
|
Число з плаваючою комою від 0,10 до 1,00, що представляє діапазон насичення. |
Використання_опису_колориту:
robot.vision.color_description(object)
Параметр |
Опис |
|---|---|
|
Об’єкт |
# Detect a red object
red_box = Colordesc(1, 207, 19, 25, 10.00, 0.20)
robot.vision.color_description(red_box)
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
red_boxes = robot.vision.get_data(red_box)
if red_boxes[0].exists:
robot.screen.print("Red detected!")
else:
robot.screen.print("No red detected.")
wait(0.2, SECONDS)
Creating a Color Code#
Новий колірний код створюється за допомогою конструктора Codedesc , а потім активується за допомогою методу code_description Колірний код групує від 2 до 4 існуючих об’єктів Colordesc в один ідентифікатор, який AI Vision Sensor може розпізнати як послідовність, але його потрібно явно встановити за допомогою code_description , щоб він набув чинності.
Використання коду:
Codedesc(index, c1, c2, c3, c4, c5)
Параметр |
Опис |
|---|---|
|
Індекс колірного коду від 1 до 8. Примітка: Якщо створити два об’єкти |
|
Перший об’єкт |
|
Другий об’єкт |
|
Необов’язково. Третій об’єкт |
|
Необов’язково. Четвертий об’єкт |
Використання code_description:
robot.vision.code_description(object)
Параметр |
Опис |
|---|---|
|
Об’єкт |
# Create Color Signatures
red_box = Colordesc(1, 207, 19, 25, 10.00, 0.20)
purple_box = Colordesc(2, 98, 18, 227, 10.00, 0.20)
robot.vision.color_description(red_box)
robot.vision.color_description(purple_box)
# Detect a red_purple Color Code
red_purple = Codedesc(1, red_box, purple_box)
robot.vision.code_description(red_purple)
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
code_objects = robot.vision.get_data(red_purple)
if code_objects[0].exists:
robot.screen.print("Code detected!")
else:
robot.screen.print("No code detected.")
wait(0.2, SECONDS)