Бачення#

Вступ#

Датчик зору для VEX EXP виявляє та відстежує колірні сигнатури та колірні коди. Це дозволяє датчику зору аналізувати навколишнє середовище та реагувати на основі виявлених візуальних даних.

На цій сторінці використовується vision_1, RED_BOXта BOX_CODE як приклади назв датчика зору, кольорової сигнатури та кольорового коду відповідно. За потреби замініть їх власними налаштованими назвами.

Нижче наведено список усіх методів:

Отримувачі – Отримуйте дані з датчика зору.

  • take_snapshot – Збирає дані для певної колірної сигнатури або колірного коду.

  • largest_object – Вибрати найбільший об’єкт зі знімка.

  • installed – Чи підключено датчик зору до EXP Brain.

Властивості – Дані об’єкта, повернуті з take_snapshot.

  • .exists – Whether the object exists in the current detection.

  • .width – Ширина виявленого об’єкта.

  • .height – Висота виявленого об’єкта.

  • .centerX – X position of the object’s center.

  • .centerY – положення центру об’єкта по осі Y.

  • .angle – Орієнтація колірного коду.

  • .originX – X position of the object’s top-left corner.

  • .originY – Y position of the object’s top-left corner.

Конструктори – ініціалізують та налаштовують датчик зору та його сигнатури вручну.

  • 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 Sensor, двома символами підкреслення, а потім назвою колірного підпису. Наприклад: 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, двома символами підкреслення, а потім назвою колірного коду. Наприклад: 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 Brain.

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 , які необхідні для налаштування Vision Sensor поза VEXcode.

Vision#

Vision створює Датчик Зору.

Використання

Vision(smartport, brightness, sigs)

Параметри

Опис

smartport

Розумний порт, до якого підключено датчик зору, записується як Ports.PORTx , де x – номер порту.

brightness

Необов’язково. Значення яскравості для датчика зору, від 1 до 100.

sigs

Необов’язково. Назва одного або кількох об’єктів Колірний підпис або Код кольору, розділених комами (,).

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

Параметр

Опис

index

Індекс об’єкта Signature , від 1 до 7. Примітка: Створення двох об’єктів Signature з однаковим індексним номером призведе до того, що другий створений об’єкт перезапише перший.

uMin

Значення від uMin у програмі Vision Utility.

uMax

Значення від uMax в утиліті Vision.

uMean

Значення від uMean у Vision Utility.

vMin

Значення від vMin у Vision Utility.

vMax

Значення від vMax в утиліті Vision.

vMean

Значення від vMean у програмі Vision Utility.

rgb

Значення від rgb в утиліті Vision.

type

Значення від type в утиліті Vision.

Щоб отримати значення для створення колірного підпису, перейдіть до Vision Utility. Після налаштування колірного підпису скопіюйте значення параметрів з вікна конфігурації.

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

Параметр

Опис

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)