Датчик зрения#

Введение#

Визуальный датчик — это датчик на основе камеры, способный обнаруживать и отслеживать цветовые сигнатуры и цветовые коды. Он позволяет роботу анализировать окружающую среду и реагировать на визуальные сигналы.

В приведенных ниже примерах настроенный датчик зрения будет называться vision_1, а настроенные объекты цветовой сигнатуры, такие как RED_BOX, будут использоваться во всех последующих примерах в этой документации по API при обращении к методам класса Vision.

Ниже приведён список всех методов:

Геттеры — получают данные с датчика зрения.

  • take_snapshot — Захватывает данные для конкретной подписи.

  • installed — Подключен ли датчик зрения к IQ (2-го поколения) Brain.

Свойства — Данные объекта, возвращенные из take_snapshot.

  • largest_object — Немедленно выберите самый большой объект из снимка датчика зрения.

  • .exists — Существует ли объект в текущем обнаружении.

  • .width — Ширина обнаруженного объекта.

  • .height — Высота обнаруженного объекта.

  • .centerX — X-координата центра объекта.

  • .centerY — Положение центра объекта по оси Y.

  • .angle — Ориентация цветового кода.

  • .originX — X-позиция верхнего левого угла объекта.

  • .originY — Y-координата верхнего левого угла объекта.

Конструкторы — вручную инициализируют и настраивают датчики.

  • Vision — Создает датчик зрения.

  • Signature — Создает цветовую подпись.

  • Code — Создает цветовой код.

Геттеры#

take_snapshot#

take_snapshot фильтрует данные из кадра датчика зрения, сводя их к одной сигнатуре — сохраненному описанию того, что датчик может распознать, например, настроенной цветовой сигнатуре или цветовому коду, — и возвращает кортеж.

Цветовые сигнатуры и Цветовые коды необходимо предварительно настроить в утилите Vision, прежде чем их можно будет использовать с этим методом.

Кортеж хранит объекты, упорядоченные по ширине от наибольшего к наименьшему, начиная с индекса 0. Доступ к свойствам каждого объекта (properties) осуществляется по его индексу. Если соответствующие объекты не обнаружены, возвращается пустой кортеж.

Usage:
vision_1.take_snapshot(SIGNATURE)

Параметры

Описание

SIGNATURE

Фильтрует набор данных, чтобы включить только данные с заданной сигнатурой. Доступные сигнатуры:

  • Цветовые сигнатуры или цветовые коды — название датчика зрения, два символа подчеркивания, а затем название цветовой сигнатуры или цветового кода. Например: vision_1__RED_BOX.

# 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)

installed#

installed возвращает логическое значение, указывающее, подключен ли в данный момент датчик зрения к процессору IQ (2-го поколения).

  • True — Датчик зрения подключен к мозгу IQ (2-го поколения).

  • False — Датчик зрения не подключен к IQ (2-го поколения) Brain.

Usage:
vision_1.installed()

Параметры

Описание

Этот метод не имеет параметров.

# Display a message if the Vision Sensor is connected
if vision_1.installed():
    brain.screen.print("Installed!")

Характеристики#

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)

Tuple Properties#

После использования take_snapshot каждый объект, хранящийся в кортеже, включает в себя восемь свойств.

Все значения свойств описывают положение и размер обнаруженного объекта в поле зрения датчика зрения в момент использования параметра take_snapshot ). Эти значения измеряются в пикселях, исходя из разрешения датчика 316 на 212 пикселей.

.существует#

.exists возвращает логическое значение, указывающее, существует ли индекс в кортеже или нет.

  • True — Индекс существует.

  • False — Индекс не существует.

# Check if at least one red objects 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 возвращает ширину обнаруженного объекта в пикселях, которая является целым числом от 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 возвращает высоту обнаруженного объекта в пикселях, которая является целым числом от 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 возвращает ориентацию обнаруженного объекта в градусах, которая является целым числом от 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 50 < box_code[0].angle < 100:
            drivetrain.turn(RIGHT)
            
        elif 270 < box_code[0].angle < 330:
            drivetrain.turn(LEFT)
        
        else:
            drivetrain.stop()
    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 Sensor#

Vision создает датчик зрения.

Использование

Vision(port, brightness, sigs)

Параметры

Описание

port

К какому интеллектуальному порту подключен датчик зрения, от 1 до 12.

brightness

Дополнительно. Значение яркости датчика зрения, от 1 до 100.

sigs

Необязательно. Имя одного или нескольких объектов Цветовая подпись или Цветовой код.

Пример

# Create a new Signature "RED_BOX" with the Signature class
RED_BOX = Signature(1, -3911, -3435, -3673,10879, 11421, 11150,2.5, 0)
# Create a new Vision Sensor "vision_1" with the Vision
# class, with the "RED_BOX" Signature.
vision_1 = Vision(Ports.PORT1, 100, RED_BOX)

# Move forward if a red object is detected
while True:
    red_object = vision_1.take_snapshot(RED_BOX)
    if red_object[0].exists:
        drivetrain.drive_for(FORWARD, 10, MM)
    wait(5, MSEC)

Color Signature#

Signature создает цветовую сигнатуру. На датчике зрения одновременно можно хранить до семи различных цветовых сигнатур.

Применение:

Signature(index, uMin, uMax, uMean, vMin, vMax, vMean, rgb, type)

Параметр

Описание

index

Индекс объекта Signature , от 1 до 7. Примечание: Создание двух объектов Signature с одинаковым номером индекса приведет к тому, что второй созданный объект заменит первый.

uMin

Значение от uMin в утилите Vision Utility.

uMax

Значение от uMax в утилите Vision Utility.

uMean

Значение от uMean в инструменте Vision Utility.

vMin

Значение от vMin в программе Vision Utility.

vMax

Значение от vMax в утилите Vision Utility.

vMean

Значение от vMean в инструменте Vision Utility.

rgb

Значение от rgb в утилите Vision Utility.

type

Значение от type в утилите Vision Utility.

Чтобы получить значения для создания цветовой сигнатуры, перейдите в Утилита Vision. После настройки цветовой сигнатуры скопируйте значения параметров из окна конфигурации.

Пример

# Create a new Signature RED_BOX with the Signature class
RED_BOX = Signature(1, 10121, 10757, 10439,-1657, -1223, -1440,2.5, 1)
# Create a new Vision Sensor "vision_1" with the Vision
# class, with the RED_BOX Signature.
vision_1 = Vision(Ports.PORT1, 100, RED_BOX)

# Move forward if a red object is detected
while True:
    red_object = vision_1.take_snapshot(RED_BOX)
    if red_object[0].exists:
        drivetrain.drive_for(FORWARD, 10, MM)
    wait(5, MSEC)

Color Code#

Код Code создает цветовой код. Для его использования требуется как минимум две уже определенные цветовые сигнатуры. На датчике зрения можно одновременно хранить до восьми различных цветовых кодов.

Применение:

Code(sig1, sig2, sig3, sig4, sig5)

Параметр

Описание

sig1

Ранее созданная Цветовая подпись.

sig2

Ранее созданная Цветовая подпись.

sig3

Необязательно. Ранее созданная Цветовая подпись.

sig4

Необязательно. Ранее созданная Цветовая подпись.

sig5

Необязательно. Ранее созданная Цветовая подпись.

Пример

# Create two new Signatures for a red and blue box
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 for a red box to the left of a blue box
RED_BLUE = Code(RED_BOX, BLUE_BOX)
# Create a new Vision Sensor "vision_1" with the Vision
# class, with the red_box and blue_box Signatures.
vision_1 = Vision(Ports.PORT1, 100, RED_BOX, BLUE_BOX)

# Display a message if Color Code is detected
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(RED_BLUE)
    if box_code[0].exists:
        brain.screen.print("Color code detected!")
        wait(100, MSEC)