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

Вступ#

Клас aivision використовується для керування та доступу до даних із датчика зору V5 AI. Датчик зору AI може виявляти:

  • Класифікації ШІ (наприклад, ігрові об’єкти)

  • Ідентифікатори тегів квітня

  • Користувацькі кольорові підписи

  • Користувацькі колірні коди

Він надає дані про об’єкт, включаючи положення, розмір, орієнтацію, ідентифікатор класифікації та показник достовірності.

Датчик обробляє візуальну інформацію за допомогою вбудованої моделі штучного інтелекту, вибраної в AI Vision Utility у VEXcode. Вибрана модель визначає, які класифікації штучного інтелекту може виявляти датчик. Під час використання VS Code модель штучного інтелекту спочатку має бути налаштована у VEXcode, перш ніж її можна буде використовувати у вашій програмі. Виявлені об’єкти повертаються через масив objects після виклику takeSnapshot.

Конструктори класів#

aivision(
  int32_t index,
  Args&... sigs );

Параметри#

Параметр

Тип

Опис

index

int32_t

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

sigs

colordesc, codedesc, or AI constants

Один або декілька типів виявлення для реєстрації датчиком:

  • aivision::ALL_AIOBJS — Усі класифікації ШІ
  • aivision::ALL_TAGS — Усі ідентифікатори AprilTag
  • aivision::colordesc — Власна кольорова сигнатура
  • aivision::codedesc — Власний колірний код

Моделі та класифікації штучного інтелекту#

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

Елементи класу

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

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

0

blueBall

1

greenBall

2

redBall

3

blueRing

4

greenRing

5

redRing

6

blueCube

7

greenCube

8

redCube

Високі ставки на змагання з робототехніки VEX V5

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

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

0

mobileGoal

1

redRing

2

blueRing

Відповідь на конкурс робототехніки VEX V5

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

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

0

blueBlock

1

redBlock

VEX V5 Robotics Competition Understanding

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

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

0

redBluePin

1

blueYellowPin

2

redYellowPin

3

yellowPin

4

cup

Приклади#

// Create Color Signatures
aivision::colordesc AIVision1__greenBox(
    1,      // index
    85,     // red
    149,    // green
    46,     // blue
    23,     // hangle
    0.23 ); // hdsat

aivision::colordesc AIVision1__blueBox(
    2,      // index
    77,     // red
    135,    // green
    125,    // blue
    27,     // hangle
    0.29 ); // hdsat

// Create a Color Code from two color signatures
aivision::codedesc AIVision1__greenBlue(
    1,                    // code index
    AIVision1__greenBox,  // first color signature
    AIVision1__blueBox ); // second color signature

// Create the AI Vision Sensor instance
aivision AIVision1(
    PORT11,                  // Smart Port
    AIVision1__greenBlue,    // color code
    aivision::ALL_AIOBJS );  // enable AI Classifications

Функції-члени#

Клас aivision містить такі функції-члени:

  • takeSnapshot — Збирає дані для певної колірної сигнатури, колірного коду, групи класифікації ШІ або групи ідентифікаторів AprilTag.

  • installed — Повертає, чи підключено датчик зору штучного інтелекту до V5 Brain.

Щоб отримати доступ до даних виявленого об’єкта після виклику takeSnapshot, скористайтеся доступними Властивості.

Перед викликом будь-яких функцій-членів aivision необхідно створити екземпляр aivision , як показано нижче:

/* This constructor is required when using VS Code.
AI Vision Sensor configuration is generated automatically
in VEXcode using the Device Menu. Replace the values
as needed. */


// Create Color Signatures
aivision::colordesc AIVision1__greenBox(
    1,      // index
    85,     // red
    149,    // green
    46,     // blue
    23,     // hangle
    0.23 ); // hdsat

aivision::colordesc AIVision1__blueBox(
    2,      // index
    77,     // red
    135,    // green
    125,    // blue
    27,     // hangle
    0.29 ); // hdsat

// Create a Color Code from two color signatures
aivision::codedesc AIVision1__greenBlue(
    1,                    // code index
    AIVision1__greenBox,  // first color signature
    AIVision1__blueBox ); // second color signature

// Create the AI Vision Sensor instance
aivision AIVision1(
    PORT1,                   // Smart Port
    AIVision1__greenBlue,    // color code
    aivision::ALL_AIOBJS );  // enable AI Classifications

takeSnapshot#

Захоплює зображення з датчика зору штучного інтелекту, обробляє його за допомогою вибраної моделі штучного інтелекту або налаштованих колірних сигнатур та оновлює масив objects.

Кожен виклик оновлює масив objects найновішими результатами виявлення. Об’єкти впорядковуються від найбільшого до найменшого (за шириною), починаючи з індексу 0Якщо об’єкти не виявлені, objectCount буде дорівнювати 0 , а objects[i].exists буде дорівнювати false.

1 — Робить знімок, використовуючи ідентифікатор об’єкта та тип об’єкта.

int32_t takeSnapshot(
  uint32_t id,
  objectType type,
  uint32_t count );

2 — Робить знімок за допомогою Кольорового підпису.

int32_t takeSnapshot(
  const colordesc &desc,
  int32_t count = 8 );

3 — Робить знімок за допомогою Кольорового коду.

int32_t takeSnapshot(
  const codedesc &desc,
  int32_t count = 8 );

4 — Робить знімок, використовуючи AprilTag ID.

int32_t takeSnapshot(
  const tagdesc &desc,
  int32_t count = 8 );

5 — Робить знімок за допомогою Класифікації ШІ.

int32_t takeSnapshot(
  const aiobjdesc &desc,
  int32_t count = 8 );

6 — Робить знімок за допомогою дескриптора об’єкта.

int32_t takeSnapshot(
  const objdesc &desc,
  int32_t count = 8 );

Parameters

Параметр

Тип

Опис

id

uint32_t

The identifier of the object to detect when using the (id, type, count) function. The meaning depends on type:

  • colorObject — Color Descriptor index (1–7)
  • codeObject — Color Code index (1–8)
  • modelObject — AI Classification ID
  • tagObject — AprilTag ID (0–36)

Note: In VEXcode, AI Classification names (such as blueBall) may be used directly. In VS Code, the numeric ID must be used.

type

objectType

Визначає категорію об’єкта, пов’язаного з id:

desc

colordesc &, codedesc &, tagdesc &, aiobjdesc &, or objdesc &

Дескриптор, що використовується для виявлення певного об’єкта. Передається безпосередньо до takeSnapshot, наприклад:

  • AIVision1.takeSnapshot(AIVision1__greenBox);
  • AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
Попередньо визначені константи дескриптора:
  • aivision::ALL_TAGS — Виявляє всі ідентифікатори AprilTag
  • aivision::ALL_COLORS — Виявляє всі налаштовані Кольорові підписи
  • aivision::ALL_CODES — Виявляє всі налаштовані Кольорові коди
  • aivision::ALL_AIOBJS — Виявляє всі Класифікації ШІ
  • aivision::ALL_OBJECTS — Виявляє все, що може розпізнати датчик

count

uint32_t / int32_t

Максимальна кількість об’єктів, що зберігаються зі знімка. За замовчуванням — 8.

Повернених значень

Повертає значення int32_t , яке представляє кількість виявлених об’єктів, що відповідають заданому сигнатурі або типу виявлення.

Примітки

  • Датчик зору зі штучним інтелектом повинен зробити знімок, перш ніж можна буде отримати доступ до даних об’єкта.

  • Масив objects оновлюється при кожному виклику.

  • Якщо вказано значення count , зберігаються лише найбільші виявлені об’єкти (до вказаної кількості).

Класифікації ШІ залежать від моделі, вибраної в утиліті ШІ Vision у VEXcode.

Приклади

// Move forward if an object is detected
while (true) {
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
  if (AIVision1.objects[0].exists) {
    Drivetrain.driveFor(forward, 50, mm);
  }
  wait(50, msec);
}

installed#

Повертає, чи підключено датчик зору штучного інтелекту до V5 Brain.

Доступні функції

bool installed();

Параметри

Ця функція не приймає жодних параметрів.

Повернених значень

Повертає логічне значення, яке вказує, чи підключено датчик зору штучного інтелекту:

  • true — Датчик зору зі штучним інтелектом підключено.

  • false — Датчик зору зі штучним інтелектом не підключено.

// Display a message if the AI Vision Sensor is connected
if (AIVision1.installed()){
  Brain.Screen.print("Installed!");
}

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

Виклик takeSnapshot оновлює результати виявлення датчика зору штучного інтелекту. Кожен знімок оновлює масив objects , який містить виявлені об’єкти для запитуваної класифікації штучного інтелекту, колірної сигнатури, колірного коду або ідентифікатора AprilTag.

Доступ до даних AI Vision здійснюється через властивості об’єктів, що зберігаються в AIVisionSensor.objects[index], де index починається з 0.

Об’єкти впорядковані від найбільшого до найменшого (за площею).

Роздільна здатність зображення датчика штучного інтелекту становить 320 × 240. Значення положення та розміру об’єкта повідомляються в пікселях відносно поточного ракурсу датчика.

Доступні такі властивості:

  • objectCount — Повертає кількість виявлених об’єктів з останнього знімка.

  • largestObject — Вибирає найбільший виявлений об’єкт з останнього знімка.

  • objects — Масив, що містить виявлені об’єкти, оновлені за допомогою takeSnapshot.

  • .exists — Чи містить запис об’єкта коректні дані.

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

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

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

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

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

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

  • .angle — Орієнтація колірного коду або ідентифікатора AprilTag у градусах.

  • .id — Classification ID or AprilTag ID.

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

objectCount#

objectCount повертає кількість елементів у масиві objects у вигляді цілого числа.

Syntax
AIVisionSensor.objectCount

Components

Компонент

Опис

AIVisionSensor

Назва вашого екземпляра датчика зору штучного інтелекту.

Приклади

// Display the number of detected objects
while (true) {
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.clearLine(1);
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
  if (AIVision1.objects[0].exists) {
    Brain.Screen.print("%d", AIVision1.objectCount);
  }
  wait(50, msec);
}

largestObject#

largestObject отримує найбільший виявлений об’єкт з масиву objects.

Цей метод можна використовувати для того, щоб завжди отримувати найбільший об’єкт з objects без вказівки індексу.

Syntax
AIVisionSensor.largestObject

Components

Компонент

Опис

AIVisionSensor

Назва вашого екземпляра датчика зору штучного інтелекту.

Приклади

// Display the closest AprilTag ID
while (true) {
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.clearLine(1);
  AIVision1.takeSnapshot(aivision::ALL_TAGS);
  if (AIVision1.objects[0].exists) {
    Brain.Screen.print("%d", AIVision1.largestObject.id);
  }
  wait(50, msec);
}

objects#

objects повертає масив властивостей виявлених об’єктів. Використовуйте масив для доступу до певних значень property окремих об’єктів.

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

Усі значення властивостей, окрім id та score описують положення та розмір виявленого об’єкта в області зору датчика штучного інтелекту у момент використання takeSnapshot Ці значення вимірюються в пікселях, виходячи з роздільної здатності датчика 320 на 240 пікселів.

Syntax
AIVisionSensor.objects[index].property

Components

Компонент

Опис

AIVisionSensor

Назва вашого екземпляра датчика зору штучного інтелекту.

index

Індекс об’єкта в масиві. Індекс починається з 0.

property

Одна з доступних властивостей об’єкта.

.існує#

.exists повертає, чи містить вказаний індекс об’єкта коректний виявлений об’єкт.

Доступ

SensorName.objects[index].exists

Повернених значень

Повертає логічне значення, яке вказує, чи містить вказаний індекс об’єкта дійсний виявлений об’єкт:

  • true — A valid object exists at the specified index.
  • false — No object exists at the specified index.

Приклади

// Move forward if an object is detected
while (true) {
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
  if (AIVision1.objects[0].exists) {
    Drivetrain.driveFor(forward, 50, mm);
  }
  wait(50, msec);
}

.width#

.width повертає ширину виявленого об’єкта.

Доступ

SensorName.objects[index].width

Повернених значень

Повертає значення int16_t яке представляє ширину виявленого об’єкта в пікселях. Значення може змінюватися від 1 до 320.

Приклади

// Approach an object until it's at least 100 pixels wide
while (true) {
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);

  if (AIVision1.objects[0].exists) {
    if (AIVision1.objects[0].width < 100) {
      Drivetrain.drive(forward);
    } else {
      Drivetrain.stop();
    }
  } else {
    Drivetrain.stop();
  }
  wait(50, msec);
}

.висота#

.height повертає висоту виявленого об’єкта.

Доступ

SensorName.objects[index].height

Повернених значень

Повертає значення int16_t яке представляє висоту виявленого об’єкта в пікселях. Значення може змінюватися від 1 до 240.

Приклади

// Approach an object until it's at least 90 pixels tall
while (true) {
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);

  if (AIVision1.objects[0].exists) {
    if (AIVision1.objects[0].height < 90) {
      Drivetrain.drive(forward);
    } else {
      Drivetrain.stop();
    }
  } else {
    Drivetrain.stop();
  }
  wait(50, msec);
}

.centerX#

.centerX повертає x-координату центру виявленого об’єкта.

Доступ

SensorName.objects[index].centerX

Повернених значень

Returns an int16_t representing the x-coordinate of the object’s center in pixels. The value ranges from 0 to 320.

Приклади

// Turn until an object is directly in front of the sensor
Drivetrain.setTurnVelocity(10, percent);
Drivetrain.turn(right);
while (true) {
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);

  if (AIVision1.objects[0].exists) {
    if (AIVision1.objects[0].centerX > 140 && AIVision1.objects[0].centerX < 180) {
      Drivetrain.stop();
    }
  }
  wait(10, msec);
}

.centerY#

.centerY повертає y-координату центру виявленого об’єкта.

Доступ

SensorName.objects[index].centerY

Повернених значень

Returns an int16_t representing the y-coordinate of the object’s center in pixels. The value ranges from 0 to 240.

Приклади

// Approach an object until it's close to the sensor
while (true) {
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);

  if (AIVision1.objects[0].exists) {
    if (AIVision1.objects[0].centerY < 150) {
      Drivetrain.drive(forward);
    } else {
      Drivetrain.stop();
    }
  } else {
    Drivetrain.stop();
  }
  wait(50, msec);
}

.кут#

.angle повертає орієнтацію виявленого колірного коду або ідентифікатора AprilTag.

Доступ

SensorName.objects[index].angle

Повернених значень

Returns a float representing the rotation of the detected Color Code or AprilTag ID in degrees. The value ranges from 0 to 359.9.

Приклади

// Turn left or right depending on how a configured
// Color Code is rotated
while (true) {
  AIVision1.takeSnapshot(AIVision1__redBlue);
  if (AIVision1.objects[0].exists) {
    if (AIVision1.objects[0].angle > 50 && AIVision1.objects[0].angle < 100) {
      Drivetrain.turn(right);
    }
    else if (AIVision1.objects[0].angle > 270 && AIVision1.objects[0].angle < 330) {
      Drivetrain.turn(left);
    }
    else {
      Drivetrain.stop();
    }
  } else {
    Drivetrain.stop();
  }
  wait(50, msec);
}

.originX#

.originX повертає x-координату верхнього лівого кута рамки визначення виявленого об’єкта.

Доступ

SensorName.objects[index].originX

Повернених значень

Returns an int16_t representing the x-coordinate of the object’s bounding box origin in pixels. The value ranges from 0 to 320.

Приклади

// Display if an object is to the left or the right
while (true) {
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
  if (AIVision1.objects[0].exists) {
    if (AIVision1.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-координату верхнього лівого кута рамки визначення виявленого об’єкта.

Доступ

SensorName.objects[index].originY

Повернених значень

Returns an int16_t representing the y-coordinate of the object’s bounding box origin in pixels. The value ranges from 0 to 240.

Приклади

// Display if an object is close or far
while (true) {
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
  if (AIVision1.objects[0].exists) {
    if (AIVision1.objects[0].originY < 110) {
      Brain.Screen.print("Close");
    } else {
      Brain.Screen.print("Far");
    }
  }
  wait(100, msec);
}

.id#

.id повертає виявлений ідентифікатор AprilTag або ідентифікатор класифікації ШІ.

Доступ

SensorName.objects[index].id

Повернених значень

Повертає int32_t , що представляє ідентифікатор виявленого об’єкта:

  • Для Класифікацій ШІ це відповідає ідентифікатору, визначеному вибраною моделлю ШІ.

  • Для ідентифікаторів AprilTag це значення відповідає виявленому номеру ідентифікатора AprilTag (0–36).

Приклади

// Move forward when AprilTag ID 1 is detected
while (true) {
  AIVision1.takeSnapshot(aivision::ALL_TAGS);
  if (AIVision1.objects[0].exists) {
    if (AIVision1.objects[0].id == 1) {
      Drivetrain.drive(forward);
    }
  } else {
    Drivetrain.stop();
  }
  wait(50, msec);
}

.score#

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

Доступ

SensorName.objects[index].score

Повернених значень

Повертає значення int16_t , що вказує на коефіцієнт достовірності виявленої класифікації ШІ від 1 до 100.

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

Приклади

// Display if a score is confident
while (true) {
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);

  if (AIVision1.objects[0].exists) {
    Brain.Screen.clearScreen();
    Brain.Screen.setCursor(1, 1);

    if (AIVision1.objects[0].score > 95) {
      Brain.Screen.print("Confident");
    } else {
      Brain.Screen.print("Not confident");
    }
  }
  wait(50, msec);
}