ИИ-зрение#
Введение#
Датчик визуального восприятия с искусственным интеллектом робота-программиста VEX AIM обнаруживает и отслеживает объекты, цвета и идентификаторы AprilTag. Это позволяет роботу анализировать окружающую среду, следовать за объектами и реагировать на основе обнаруженных визуальных данных.
Датчик AI Vision имеет разрешение 320×240 пикселей. Начало координат (0, 0) расположено в верхнем левом углу, а центр датчика находится в точке (160, 120), как показано на схеме ниже:

Ниже приведён список всех методов и свойств:
Действия — Показать или скрыть видеопоток с камеры AI Vision.
show_aivision— Отображает видеопоток AI Vision на экране робота.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, Tag, Color или Code).
Конструкторы — определяют цветовые сигнатуры и коды.
Создать цветовую сигнатуру — Создает новую цветовую сигнатуру на основе RGB и диапазонов оттенка/насыщенности.
Создать цветовой код — Объединяет несколько цветовых сигнатур в один цветовой код.
Действия#
show_aivision#
show_aivision отображает поток данных с датчика AI Vision на экране робота. Поток данных будет перекрывать любые другие изображения или текст на экране.
Примечание: На экране не будут отображаться никакие другие изображения или текст, если не используется 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 удаляет поток данных в реальном времени с датчика AI Vision Sensor с экрана робота.
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, где state — логическое значение.
Датчик способен распознавать метки 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, прежде чем их можно будет использовать с этим методом.
The tuple stores objects ordered from largest to smallest by width, starting at index 0. Each object’s properties can be accessed using its index. An empty tuple is returned if no matching objects are detected.
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)
Примечание: Возвращаемый кортеж можно отсортировать по любому свойству, а не только по ширине, используя функцию Python sorted Например, сортировка по ID 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 ( 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 Vision Sensor способен распознавать следующие классификации ИИ:
Идентификационный номер |
Классификация ИИ |
Подпись |
|---|---|---|
0 |
Мяч |
|
1 |
Синяя бочка |
|
2 |
Оранжевая бочка |
|
3 |
Робот AIM |
|
Цветовые сигнатуры#
Цветовая сигнатура — это уникальный цвет, который может распознать датчик AI Vision. Эти сигнатуры позволяют датчику обнаруживать и отслеживать объекты на основе их цвета. После настройки цветовой сигнатуры датчик может идентифицировать объекты с этим конкретным цветом в своем поле зрения. Цветовые сигнатуры используются с 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 каждый объект, хранящийся в кортеже, включает двенадцать свойств.
Все значения свойств, кроме .id, .scoreи .type , описывают положение, размер, ориентацию или направление обнаруженного объекта в момент использования robot.vision.get_data Эти значения измеряются в пикселях или градусах, исходя из разрешения датчика 320 на 240 пикселей.

.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), представляющее, насколько объект смещен влево или вправо от центра поля зрения датчика AI Vision в градусах. Значение 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 возвращает ориентацию объекта в плоскости обзора датчика AI Vision, измеряемую в градусах от 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 ), а затем регистрируется в датчике AI Vision Sensor с помощью метода color_description ). Объект Colordesc ) определяет одну из семи обнаруживаемых цветовых сигнатур для датчика, но для вступления в силу она должна быть явно задана с помощью метода color_description ).
Использование Colordesc:
Colordesc(index, red, green, blue, hangle, hdsat)
Параметр |
Описание |
|---|---|
|
Целое число от 1 до 7, представляющее индекс цветовой сигнатуры. Если две цветовые сигнатуры используют один и тот же индекс, вторая переопределит первую. |
|
Целое число от 0 до 255, обозначающее красную составляющую цвета. |
|
Целое число от 0 до 255, обозначающее зеленую составляющую цвета. |
|
Целое число от 0 до 255, обозначающее синюю составляющую цвета. |
|
Число с плавающей запятой от 1 до 40, представляющее диапазон оттенков в градусах. |
|
Число с плавающей запятой от 0,10 до 1,00, представляющее диапазон насыщенности. |
Использование color_description:
robot.vision.color_description(object)
Параметр |
Описание |
|---|---|
|
Объект Colordesc 1 |
# 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 Codedesc а затем активируется с помощью метода code_description code_description 2 до Colordesc в один идентификатор, который датчик AI Vision может распознать как последовательность, но для вступления в силу его необходимо явно установить с помощью code_description.
Использование Codedesc:
Codedesc(index, c1, c2, c3, c4, c5)
Параметр |
Описание |
|---|---|
|
Индекс цветового кода, от 1 до 8. Примечание: Если вы создадите два объекта Codedesc |
|
Первый объект |
|
Второй объект |
|
Необязательно. Третий объект |
|
Необязательно. Четвертый объект |
Использование 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)