Зрение#
Введение#
Визуальный датчик для VEX EXP обнаруживает и отслеживает цветовые сигнатуры и цветовые коды. Это позволяет визуальному датчику анализировать окружающую среду и реагировать на основе обнаруженных визуальных данных.
На этой странице в качестве примеров названий датчика зрения, цветовой сигнатуры и цветового кода используются vision_1, RED_BOXи BOX_CODE соответственно. При необходимости замените их своими собственными настроенными именами.
Ниже приведён список всех методов:
Геттеры – получают данные с датчика зрения.
take_snapshot– Захватывает данные для конкретной цветовой сигнатуры или цветового кода.largest_object– Выберите самый большой объект из снимка.installed– Подключен ли датчик зрения к EXP Brain.
Свойства – Данные объекта, возвращенные из take_snapshot.
.exists– Существует ли объект в текущем обнаружении..width– Ширина обнаруженного объекта..height– Высота обнаруженного объекта..centerX– X-координата центра объекта..centerY– Y-положение центра объекта..angle– Ориентация цветового кода..originX– X-позиция верхнего левого угла объекта..originY– Y-координата верхнего левого угла объекта.
Конструкторы – Вручную инициализируют и настраивают датчик зрения и его сигнатуры.
Геттеры#
take_snapshot#
take_snapshot фильтрует данные из кадра датчика зрения, сводя их к одной сигнатуре — сохраненному описанию того, что датчик может распознать, например, настроенной цветовой сигнатуре или цветовому коду, — и возвращает кортеж.
Цветовые сигнатуры и Цветовые коды необходимо предварительно настроить в утилите Vision, прежде чем их можно будет использовать с этим методом.
Кортеж хранит объекты, упорядоченные по ширине от наибольшего к наименьшему, начиная с индекса 0. Доступ к свойствам каждого объекта (properties) осуществляется по его индексу. Если соответствующие объекты не обнаружены, возвращается пустой кортеж.
Usage:
vision_1.take_snapshot(SIGNATURE)
Параметры |
Описание |
|---|---|
|
Фильтрует набор данных, чтобы включить только данные с заданной сигнатурой. Доступные сигнатуры:
|
# Move forward if a red object is detected
while True:
red_box = vision_1.take_snapshot(vision_1__RED_BOX)
if red_box[0].exists:
drivetrain.drive_for(FORWARD, 10, MM)
wait(5, MSEC)
Цветовые сигнатуры#
Цветовая сигнатура — это уникальный цвет, который может распознать датчик зрения. Эти сигнатуры позволяют датчику обнаруживать и отслеживать объекты на основе их цвета. После настройки цветовой сигнатуры датчик может идентифицировать объекты с этим конкретным цветом в своем поле зрения. Цветовые сигнатуры используются с take_snapshot для обработки и обнаружения цветных объектов в реальном времени.
Для использования настроенной цветовой сигнатуры в проекте её имя должно состоять из имени датчика зрения, двух нижних подчеркиваний, а затем имени цветовой сигнатуры. Например: vision_1__RED_BOX.
# Display if any objects match the RED_BOX signature
while True:
brain.screen.set_cursor(1, 1)
brain.screen.clear_row(1)
# Change to any configured Color Signature
red_box = vision_1.take_snapshot(vision_1__RED_BOX)
if red_box[0].exists:
brain.screen.print("Color signature detected!")
wait(100, MSEC)
Цветовые коды#
Цветовой код — это структурированный узор, состоящий из цветовых сигнатур, расположенных в определенном порядке. Эти коды позволяют датчику зрения распознавать заранее заданные цветовые схемы. Цветовые коды полезны для идентификации сложных объектов или создания уникальных маркеров для автономной навигации.
Для использования настроенного цветового кода в проекте его имя должно состоять из имени датчика зрения, двух подчеркиваний, а затем имени цветового кода. Например: vision_1__BOX_CODE.
# Display if any objects match the BOX_CODE code
while True:
brain.screen.set_cursor(1, 1)
brain.screen.clear_row(1)
# Change to any configured Color Code
box_code = vision_1.take_snapshot(vision_1__BOX_CODE)
if box_code[0].exists:
brain.screen.print("Color code detected!")
wait(100, MSEC)
largest_object#
largest_object извлекает самый большой обнаруженный объект для получения данных из кортежа, возвращаемого при последнем использовании take_snapshot.
Этот метод позволяет всегда получать наибольший объект из кортежа без указания индекса.
Usage:
vision_1.largest_object()
# Turn slowly until the largest object is centered in
# front of the Vision Sensor
drivetrain.set_turn_velocity(10, PERCENT)
drivetrain.turn(RIGHT)
while True:
red_box = vision_1.take_snapshot(vision_1__RED_BOX)
if red_box[0].exists:
if 140 < vision_1.largest_object().centerX < 180:
drivetrain.stop()
wait(10,MSEC)
installed#
installed возвращает логическое значение, указывающее, подключен ли в данный момент датчик зрения к EXP Brain.
True– Датчик зрения подключен к мозгу EXP.False– Датчик зрения не подключен к блоку управления EXP.
Usage:
vision_1.installed()
Параметры |
Описание |
|---|---|
Этот метод не имеет параметров. |
# Display a message if the Vision Sensor is connected
if vision_1.installed():
brain.screen.print("Vision Sensor Installed!")
Характеристики#
После использования take_snapshot каждый объект, хранящийся в кортеже, включает в себя восемь свойств.
Все значения свойств описывают положение и размер обнаруженного объекта в поле зрения датчика зрения в момент использования параметра take_snapshot ). Эти значения измеряются в пикселях, исходя из разрешения датчика 316 на 212 пикселей.
.exists#
.exists возвращает логическое значение, указывающее, существует ли индекс в кортеже или нет.
True- Индекс существует.False- Индекс не существует.
# Check if at least one red object is detected
# You will receive an error if no objects are detected
while True:
brain.screen.clear_screen()
brain.screen.set_cursor(1, 1)
red_objects = vision_1.take_snapshot(vision_1__RED_BOX)
if red_objects[0].exists:
brain.screen.print("At least 1")
else:
brain.screen.print("No red objects")
wait(0.5, SECONDS)
.width#
.width возвращает ширину обнаруженного объекта в пикселях, которая является целым числом от 1 до 316.
# Move towards a blue object until its width is
# larger than 100 pixels
while True:
blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)
if blue_box[0].exists:
if blue_box[0].width < 100:
drivetrain.drive_for(FORWARD, 10, MM)
else:
drivetrain.stop()
wait(50, MSEC)
.height#
.height возвращает высоту обнаруженного объекта в пикселях, которая является целым числом от 1 до 212.
# Move towards a blue object until its height is
# larger than 100 pixels
while True:
blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)
if blue_box[0].exists:
if blue_box[0].height < 100:
drivetrain.drive_for(FORWARD, 10, MM)
else:
drivetrain.stop()
wait(50, MSEC)
.centerX#
.centerX возвращает x-координату центра обнаруженного объекта в пикселях, которая является целым числом от 0 до 316.
# Turn slowly until the largest blue object is centered
# in front of the Vision Sensor.
drivetrain.set_turn_velocity(10, PERCENT)
drivetrain.turn(RIGHT)
while True:
blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)
if blue_box[0].exists:
if 140 < vision_1.largest_object().centerX < 180:
drivetrain.stop()
wait(10,MSEC)
.centerY#
.centerY возвращает y-координату центра обнаруженного объекта в пикселях, которая является целым числом от 0 до 212.
# Move towards a blue object until its
# center y-coordinate is more than 140 pixels
while True:
blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)
if blue_box[0].exists:
if blue_box[0].centerY < 140:
drivetrain.drive(FORWARD)
else:
drivetrain.stop()
wait(50, MSEC)
.angle#
.angle возвращает ориентацию обнаруженного объекта в градусах, которая является целым числом от 0 до 359.
# Turn left or right depending on how a
# configured box code is rotated
while True:
box_code = vision_1.take_snapshot(vision_1__BOX_CODE)
if box_code[0].exists:
if 70 < box_code[0].angle < 110:
drivetrain.turn_for(RIGHT, 45, DEGREES)
elif 250 < box_code[0].angle < 290:
drivetrain.turn_for(LEFT, 45, DEGREES)
else:
drivetrain.stop()
wait(50, MSEC)
.originX#
.originX возвращает x-координату верхнего левого угла ограничивающего прямоугольника обнаруженного объекта в пикселях, которая является целым числом от 0 до 316.
# Display if a red object is to the
# left or the right
while True:
brain.screen.clear_screen()
brain.screen.set_cursor(1,1)
red_box = vision_1.take_snapshot(vision_1__RED_BOX)
if red_box[0].exists:
if red_box[0].originX < 160:
brain.screen.print("To the left!")
else:
brain.screen.print("To the right!")
wait(50, MSEC)
.originY#
.originY возвращает y-координату верхнего левого угла ограничивающего прямоугольника обнаруженного объекта в пикселях, которая является целым числом от 0 до 212.
# Display if a red object is close or far
# from the robot
while True:
brain.screen.clear_screen()
brain.screen.set_cursor(1,1)
red_box = vision_1.take_snapshot(vision_1__RED_BOX)
if red_box[0].exists:
if red_box[0].originY < 80:
brain.screen.print("Far")
else:
brain.screen.print("Close")
wait(50, MSEC)
Строители#
Конструкторы используются для ручного создания объектов Vision, Signatureи Code , которые необходимы для настройки датчика зрения вне VEXcode.
Vision#
Vision создает датчик зрения.
Использование
Vision(smartport, brightness, sigs)
Параметры |
Описание |
|---|---|
|
Интеллектуальный порт, к которому подключен датчик зрения, обозначается как |
|
Дополнительно. Значение яркости датчика зрения, от 1 до 100. |
|
Необязательно. Имя одного или нескольких объектов Цветовая подпись или Цветовой код, разделенных запятыми ( |
# Create the Color Signatures
RED_BOX = Signature(1, 10121, 10757, 10439,-1657, -1223, -1440, 2.5, 1)
BLUE_BOX = Signature(2, -4443, -3373, -3908,6253, 7741, 6997, 2.5, 1)
# Create the Color Code
BOX_CODE = Code(RED_BOX, BLUE_BOX)
"""
Create a Vision Sensor with the following values:
- Port 1
- brightness: 80
- RED_BOX and BOX_CODE signatures
"""
vision_1 = Vision(Ports.PORT1, 80, RED_BOX, BOX_CODE)
Signature#
Signature создает цветовую сигнатуру. На датчике зрения одновременно можно хранить до семи различных цветовых сигнатур.
Применение:
Signature(index, uMin, uMax, uMean, vMin, vMax, vMean, rgb, type)
Параметр |
Описание |
|---|---|
|
Индекс объекта |
|
Значение от |
|
Значение от |
|
Значение от |
|
Значение от |
|
Значение от |
|
Значение от |
|
Значение от |
|
Значение от |
Чтобы получить значения для создания цветовой сигнатуры, перейдите в Утилита Vision. После настройки цветовой сигнатуры скопируйте значения параметров из окна конфигурации.
"""
Create a Color Signature with the following values:
- index: 1
- uMin: 10121
- uMax: 10757
- uMean: 10439
- vMin: -1657
- vMax: -1223
- vMean: -1440
- rgb: 2.5
- type: 1
"""
RED_BOX = Signature(1, 10121, 10757, 10439,-1657, -1223, -1440,2.5, 1)
Code#
Код Code создает цветовой код. Для его использования требуется как минимум две уже определенные цветовые сигнатуры. На датчике зрения можно одновременно хранить до восьми различных цветовых кодов.
Применение:
Code(sig1, sig2, sig3, sig4, sig5)
Параметр |
Описание |
|---|---|
|
Ранее созданная Цветовая подпись. |
|
Ранее созданная Цветовая подпись. |
|
Необязательно. Ранее созданная Цветовая подпись. |
|
Необязательно. Ранее созданная Цветовая подпись. |
|
Необязательно. Ранее созданная Цветовая подпись. |
# Create the Color Signatures
RED_BOX = Signature(1, 10121, 10757, 10439,-1657, -1223, -1440, 2.5, 1)
BLUE_BOX = Signature(2, -4443, -3373, -3908,6253, 7741, 6997, 2.5, 1)
# Create a Color Code with the Color Signatures
BOX_CODE = Code(RED_BOX, BLUE_BOX)