Датчик зору зі штучним інтелектом#

Вступ#

Датчик зору IQ AI може виявляти та відстежувати об’єкти, кольори та ідентифікатори AprilTag. Це дозволяє роботу аналізувати своє оточення, стежити за об’єктами та реагувати на основі виявлених візуальних даних.

У наведених нижче прикладах налаштований датчик зору IQ AI матиме назву ai_vision_1, а налаштовані об’єкти кольорової підписи, такі як RED_BOX, будуть використовуватися в усіх наступних прикладах цієї документації API під час посилання на AiVision AiVision.

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

Отримувачі — Отримання даних із датчика зору IQ AI.

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

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

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

  • .exists — Чи існує об’єкт у поточному виявленні.

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

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

  • .centerX — Положення центру об’єкта по осі X.

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

  • .angle — Orientation of the Color Code or AprilTag ID.

  • .originX — Позиція верхнього лівого кута об’єкта по осі X.

  • .originY — Позиція верхнього лівого кута об’єкта по осі Y.

  • .id — Класифікація або ідентифікатор тегу об’єкта.

  • .score — Оцінка достовірності для класифікацій ШІ.

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

  • AiVision — Створює датчик зору IQ AI.

  • Colordesc — Створює колірну сигнатуру.

  • Codedesc — Створює колірний код.

Геттери#

take_snapshot#

take_snapshot фільтрує дані з кадру датчика IQ AI Vision Sensor до єдиної сигнатури — збереженого опису чогось, що датчик може розпізнати, наприклад, попередньо навченого об’єкта, ідентифікатора AprilTag або налаштованої кольорової сигнатури чи кольорового коду — та повертає кортеж.

Кольорові підписи та Кольорові коди необхідно спочатку налаштувати в утиліті Vision, перш ніж їх можна буде використовувати з цим методом.

Кортеж зберігає об’єкти, відсортовані від найбільшого до найменшого за шириною, починаючи з індексу 0. Доступ до properties кожного об’єкта можна отримати за його індексом. Якщо не виявлено відповідних об’єктів, повертається порожній кортеж.

Usage:
ai_vision_1.take_snapshot(SIGNATURE)

Параметри

Опис

SIGNATURE

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

  • Кольорові підписи або кольорові коди – назва датчика IQ AI Vision, два підкреслення, а потім назва кольорового підпису або кольорового коду. Наприклад: ai_vision_1__RED_BOX.
  • AiVision.ALL_AIOBJS – усі виявлені Класифікації ШІ залежно від моделі, налаштованої в утиліті AI Vision.
  • AiVision.ALL_TAGS – усі ідентифікатори AprilTag.

count

Необов’язково. Встановлює максимальну кількість об’єктів, які можна повернути, від 1 до 24 (за замовчуванням: 8).

# Move forward if an object is detected
while True:
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)
    if objects[0].exists:
        drivetrain.drive_for(FORWARD, 50, MM)
    wait(50, MSEC)

Примітка: Повернений кортеж можна відсортувати за будь-якою властивістю property, а не лише за шириною, використовуючи функцію Python sorted sorted Наприклад, сортування за ідентифікатором AprilTag:

# Print each detected AprilTag ID in ascending order by ID
while True:
    apriltags = sorted(ai_vision_1.take_snapshot(AiVision.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(ai_vision_1.take_snapshot(AiVision.ALL_TAGS), key=lambda tag: tag.height)
    for tag in apriltags_by_height:
        print(tag.height)
    wait(1, SECONDS)

Класифікації ШІ#

Датчик зору IQ AI може виявляти різні об’єкти за певними класифікаціями ШІ. Залежно від моделі класифікації ШІ, вибраної під час налаштування датчика зору ШІ у вікні «Пристрої», будуть виявлені різні об’єкти. Наразі доступні такі моделі:

Предмети для класу

Ідентифікаційний номер

Класифікація ШІ

0

ClassroomElements.BLUE_BALL

1

ClassroomElements.GREEN_BALL

2

ClassroomElements.RED_BALL

3

ClassroomElements.BLUE_RING

4

ClassroomElements.GREEN_RING

5

ClassroomElements.RED_RING

6

ClassroomElements.BLUE_CUBE

7

ClassroomElements.GREEN_CUBE

8

ClassroomElements.RED_CUBE

Змагання з робототехніки VEX IQ – мікс та матч

Ідентифікаційний номер

Класифікація ШІ

0

GameElementsMixAndMatch.BEAM

1

GameElementsMixAndMatch.BLUE_PIN

2

GameElementsMixAndMatch.RED_PIN

3

GameElementsMixAndMatch.ORANGE_PIN

Підвищення рівня змагань з робототехніки VEX IQ

Ідентифікаційний номер

Класифікація ШІ

0

GameElementsLevelUp.BLUE_BEANBAG

1

GameElementsLevelUp.RED_BEANBAG

2

GameElementsLevelUp.YELLOW_BEANBAG

Кольорові підписи#

Колірна сигнатура – ​​це унікальний колір, який може розпізнати датчик IQ AI Vision Sensor. Ці сигнатури дозволяють датчику IQ AI Vision Sensor виявляти та відстежувати об’єкти на основі їхнього кольору. Після налаштування колірної сигнатури датчик може ідентифікувати об’єкти з цим певним кольором у своєму полі зору. Колірні сигнатури використовуються разом з take_snapshot для обробки та виявлення кольорових об’єктів у режимі реального часу.

Щоб використовувати налаштований колірний підпис у проєкті, його назва має бути назвою датчика, двома символами підкреслення, а потім назвою колірного підпису. Наприклад: ai_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 = ai_vision_1.take_snapshot(ai_vision_1__RED_BOX)
    if red_box[0].exists:
        brain.screen.print("Color detected!")
        wait(100, MSEC)

Колірні коди#

Колірний код – це структурований візерунок, що складається з колірних сигнатур, розташованих у певному порядку. Ці коди дозволяють датчику IQ AI Vision Sensor розпізнавати заздалегідь визначені кольорові візерунки. Колірні коди корисні для ідентифікації складних об’єктів або створення унікальних маркерів для автономної навігації.

Щоб використовувати налаштований колірний код у проєкті, його назва має бути назвою датчика, двома символами підкреслення, а потім назвою колірного коду. Наприклад: ai_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 = ai_vision_1.take_snapshot(ai_vision_1__BOX_CODE)
    if box_code[0].exists:
        brain.screen.print("Code detected!")
        wait(100, MSEC)

installed#

installed повертає логічне значення, яке вказує, чи підключено датчик зору IQ AI до IQ (2-го покоління) Brain.

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

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

Usage:
ai_vision_1.installed()

Параметри

Опис

Цей метод не має параметрів.

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

Властивості#

Існує десять властивостей, які додаються до кожного об’єкта, що зберігається в кортежі tuple після використання take_snapshot.

All property values except .id and .score describe the detected object’s position and size in the IQ AI Vision Sensor’s view at the moment take_snapshot was used. These values are measured in pixels, based on the sensor’s 320 by 240 pixel resolution.

.exists#

.exists повертає логічне значення, яке вказує, чи існує індекс у кортежі чи ні.

  • True — Індекс існує.

  • False — Індекс не існує.

# Check if at least two objects are detected
while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1, 1)
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if objects[1].exists:
            brain.screen.print("At least 2")

        else:
            brain.screen.print("Less than 2")
    wait(50, MSEC)

.width#

.width повертає ширину виявленого об’єкта в пікселях, що є цілим числом від 1 до 320.

# Approach an object until it's at least 100 pixels wide
while True:
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if objects[0].width < 100:
            drivetrain.drive(FORWARD)
    else:
        drivetrain.stop()
    wait(50, MSEC)

.height#

.height повертає висоту виявленого об’єкта в пікселях, що є цілим числом від 1 до 240.

# Approach an object until it's at least 90 pixels tall
while True:
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if objects[0].height < 90:
            drivetrain.drive(FORWARD)
    else:
        drivetrain.stop()
    wait(50, MSEC)

.centerX#

.centerX повертає x-координату центру виявленого об’єкта в пікселях, яка є цілим числом від 0 до 320.

# Turn until an object is directly in front of the sensor
drivetrain.set_turn_velocity(10, PERCENT)
drivetrain.turn(RIGHT)

while True:
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if 140 < objects[0].centerX < 180:
            drivetrain.stop()
    wait(10,MSEC)

.centerY#

.centerY повертає y-координату центру виявленого об’єкта в пікселях, яка є цілим числом від 0 до 240.

# Approach an object until the object's center is
# high enough in the field of view
while True:
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if objects[0].centerY < 150:
            drivetrain.drive(FORWARD)
    else:
        drivetrain.stop()
    wait(50, MSEC)

.angle#

.angle повертає орієнтацію виявленого колірного коду або ідентифікатора AprilTag у градусах, що є цілим числом від 0 до 359.

# Turn left or right depending on how a
# configured Color Code is rotated
while True:
    box_code = ai_vision_1.take_snapshot(ai_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 до 320.

# Display if an object is to the left or the right
while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1,1)

    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if objects[0].originX < 120:
            brain.screen.print("To the left!")
        else:
            brain.screen.print("To the right!")
    else:
        brain.screen.print("No objects")
    wait(100, MSEC)

.originY#

.originY повертає y-координату верхнього лівого кута рамки визначення виявленого об’єкта в пікселях, що є цілим числом від 0 до 240.

# Display if an object is close or far
while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1,1)

    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if objects[0].originY < 110:
            brain.screen.print("Close")
        else:
            brain.screen.print("Far")

.id#

.id повертає ідентифікатор виявленої Класифікація ШІ або ідентифікатор AprilTag як ціле число. Класифікації ШІ залежать від моделі, налаштованої в утиліті ШІ Vision.

Для ідентифікатора AprilTag властивість .id представляє виявлений номер ідентифікатора AprilTag у діапазоні від 0 до 36. Для класифікації ШІ властивість .id відповідає попередньо визначеному ідентифікатору в розділі Класифікації ШІ.

# Move forward when AprilTag ID 1 is detected
while True:
    apriltags = ai_vision_1.take_snapshot(AiVision.ALL_TAGS)

    if apriltags[0].exists:
        if apriltags[0].id == 1:
            robot.drive(FORWARD)
    else:
        drivetrain.stop()

    wait(50, MSEC)

.score#

.score повертає бал достовірності виявленої класифікації ШІ як ціле число від 1 до 100.

Нижчий бал означає, що датчик менш впевнений у виявленому об’єкті, тоді як вищий бал означає, що датчик більш впевнений.

# Display if a score is confident
while True:
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)
    brain.screen.clear_screen()
    brain.screen.set_cursor(1, 1)
    if objects[0].exists:
        if objects[0].score > 95:
            brain.screen.print("Confident")
    else:
        brain.screen.print("Not confident")

    wait(50, MSEC)

Конструктори#

Конструктори використовуються для ручного створення об’єктів AiVision, Colordescта Codedesc , які необхідні для налаштування датчика зору IQ AI поза VEXcode.

AI Vision Sensor#

AiVision створює датчик зору IQ AI.

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

Vision(port, sigs)

Параметри

Опис

port

До якого смарт-порту підключено датчик IQ AI Vision Sensor, від 1 до 12.

sigs

Необов’язково. Назва одного або кількох підписів:

Приклад

ai_vision_1 = AiVision(Ports.PORT1, AiVision.ALL_AIOBJS)

# Move forward if an object is detected
while True:
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)
    if objects[0].exists:
        drivetrain.drive_for(FORWARD, 50, MM)
    wait(50, MSEC)

Color Signature#

Colordesc створює колірну сигнатуру. На датчику IQ AI Vision Sensor можна одночасно зберігати до семи різних колірних сигнатур.

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

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

Параметр

Опис

index

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

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 new Signature RED_BOX with the Colordesc class
RED_BOX = Colordesc(1, 10121, 10757, 10439,-1657, -1223, -1440,2.5, 1)
# Create a new AI Vision Sensor "ai_vision_1" with the AiVision
# class, with the RED_BOX Signature.
ai_vision_1 = AiVision(Ports.PORT1, 100, RED_BOX)

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

Color Code#

Codedesc створює колірний код. Для його використання потрібні щонайменше дві вже визначені колірні сигнатури. На датчику зору можна зберігати до восьми різних колірних кодів одночасно.

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

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

Параметр

Опис

sig1

Раніше створений Кольоровий підпис.

sig2

Раніше створений Кольоровий підпис.

sig3

Необов’язково. Раніше створений Кольоровий підпис.

sig4

Необов’язково. Раніше створений Кольоровий підпис.

sig5

Необов’язково. Раніше створений Кольоровий підпис.

Приклад

# Create two new Signatures for a red and blue box
RED_BOX = Colordesc(1, 10121, 10757, 10439,-1657, -1223, -1440, 2.5, 1)
BLUE_BOX = Colordesc(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 = Codedesc(RED_BOX, BLUE_BOX)
# Create a new AI Vision Sensor "ai_vision_1" with the AiVision
# class, with the RED_BOX and BLUE_BOX Signatures.
ai_vision_1 = AiVision(Ports.PORT1, 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 = ai_vision_1.take_snapshot(RED_BLUE)
    if box_code[0].exists:
        brain.screen.print("Code detected!")
        wait(100, MSEC)