Датчик зору#

Вступ#

Клас vision використовується для керування та доступу до даних із датчика EXP Vision. Цей датчик виявляє та відстежує кольорові сигнатури в межах свого поля зору, що дозволяє вашому роботу ідентифікувати цілі та реагувати на візуальну інформацію в режимі реального часу.

Датчик зору може одночасно виявляти кілька об’єктів-сигнатур та надавати таку інформацію, як положення об’єкта, ширина, висота та координати центру.

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

vision(
  int32_t  index,
  uint8_t  bright,
  Args&... sigs );

Деструктор класів#

Знищує об’єкт vision та звільняє пов’язані з ним ресурси.

~vision();

Параметри#

Параметр

Тип

Опис

index

int32_t

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

bright

uint8_t

Рівень яскравості датчика зору.

sigs

vision::signature or vision::code objects

Один або декілька об’єктів vision::signature або vision::code для реєстрації датчиком.

Приклади#

// Create Color Signatures
vision::signature Vision1__REDBOX = vision::signature(
    1,      // signature id
    10121,  // uMin
    10757,  // uMax
    10439,  // uMean
    -1657,  // vMin
    -1223,  // vMax
    -1440,  // vMean
    2.5,    // range
    1 );    // type

vision::signature Vision1__BLUEBOX = vision::signature(
    2,      // signature id
    -4479,  // uMin
    -3277,  // uMax
    -3878,  // uMean
    5869,   // vMin
    7509,   // vMax
    6689,   // vMean
    2.5,    // range
    1 );    // type

// Create a Color Code from two signatures
vision::code Vision1__BOXCODE = vision::code(
    Vision1__REDBOX,  // first signature
    Vision1__BLUEBOX  // second signature
);

// Create the Vision Sensor instance
vision Vision1 = vision(
    PORT1,                  // Smart Port
    50,                     // brightness
    Vision1__REDBOX,        // signature
    Vision1__BOXCODE );     // Color Code

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

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

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

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

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

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

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


// Create Color Signatures
vision::signature Vision1__REDBOX = vision::signature(
    1,      // signature id
    10121,  // uMin
    10757,  // uMax
    10439,  // uMean
    -1657,  // vMin
    -1223,  // vMax
    -1440,  // vMean
    2.5,    // range
    1 );    // type

vision::signature Vision1__BLUEBOX = vision::signature(
    2,      // signature id
    -4479,  // uMin
    -3277,  // uMax
    -3878,  // uMean
    5869,   // vMin
    7509,   // vMax
    6689,   // vMean
    2.5,    // range
    1 );    // type

// Create a Color Code from two signatures
vision::code Vision1__BOXCODE = vision::code(
    Vision1__REDBOX,  // first signature
    Vision1__BLUEBOX  // second signature
);

// Create the Vision Sensor instance
vision Vision1 = vision(
    PORT1,                  // Smart Port
    50,                     // brightness
    Vision1__REDBOX,        // signature
    Vision1__BOXCODE );     // Color Code

takeSnapshot#

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

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

Available Functions

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

int32_t takeSnapshot( uint32_t id );

2 — Робить знімок та шукає об’єкти, що відповідають заданому об’єкту vision::code.

int32_t takeSnapshot( code &cc );

3 — Робить знімок та шукає об’єкти, що відповідають заданому об’єкту vision::signature.

int32_t takeSnapshot( signature &sig );

4 — Робить знімок і зберігає лише найбільшу задану кількість об’єктів, що відповідають ідентифікатору підпису.

int32_t takeSnapshot( uint32_t id, uint32_t count );

5 — Робить знімок і зберігає лише найбільшу задану кількість об’єктів, що відповідають заданому об’єкту vision::code.

int32_t takeSnapshot( code &cc, uint32_t count );

6 — Робить знімок і зберігає лише найбільшу задану кількість об’єктів, що відповідають заданому об’єкту vision::signature.

int32_t takeSnapshot( signature &sig, uint32_t count );

Parameters

Параметр

Тип

Опис

id

uint32_t

Номер ідентифікатора підпису для пошуку.

cc

code &

Посилання на об’єкт vision::code з значенням для пошуку.

sig

signature &

Посилання на об’єкт vision::signature для пошуку.

count

uint32_t

Максимальна кількість об’єктів для виявлення.

Return Values

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

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

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

Приклади

while (true) {
  // Display if a blue object is detected
  Vision1.takeSnapshot(Vision1__BLUEBOX);

  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);

  if (Vision1.objects[0].exists) {
    Brain.Screen.print("Blue detected");
  } 
  else {
    Brain.Screen.print("No blue");
  }

  wait(0.5, seconds);
}

// Display when a blue object is detected
while (true) {
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.clearLine(1);

  Vision1.takeSnapshot(Vision1__BLUEBOX);

  if (Vision1.objects[0].exists) {
    Brain.Screen.print("Color detected!");
  }

  wait(100, msec); 
}

// Display when BOXCODE is detected
while (true) {
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.clearLine(1);

  Vision1.takeSnapshot(Vision1__BOXCODE);

  if (Vision1.objects[0].exists) {
    Brain.Screen.print("Code detected!");
  }
  wait( 100, msec);
}

installed#

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

Available Functions
bool installed();

Parameters

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

Return Values

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

  • true — The Vision Sensor is connected.
  • false — The Vision Sensor is not connected.

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

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

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

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

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

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

  • objectCount — Повертає кількість дійсних об’єктів, що зберігаються в objects.

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

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

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

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

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

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

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

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

  • .angle — Орієнтація виявленого колірного коду в градусах (якщо застосовується).

largestObject#

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

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

Syntax
VisionSensor.largestObject

Components

Компонент

Опис

VisionSensor

Назва вашого екземпляра Vision Sensor.

Приклади

int main() {
  // Initializing Robot Configuration. DO NOT REMOVE!
  vexcodeInit();

  // Display the largest detected object's width
  while (true) {
    Vision1.takeSnapshot(Vision1__BLUEBOX);

    Brain.Screen.clearScreen();
    Brain.Screen.setCursor(1, 1);

    if (Vision1.objects[0].exists) {
      Brain.Screen.print("%d", Vision1.largestObject.width);
    } 
    wait(0.5, seconds);
  }
}

objectCount#

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

Syntax
VisionSensor.objectCount

Components

Компонент

Опис

VisionSensor

Назва вашого екземпляра Vision Sensor.

Приклади

int main() {
  // Initializing Robot Configuration. DO NOT REMOVE!
  vexcodeInit();

  // Display how many blue objects are detected
  while (true) {
    Vision1.takeSnapshot(Vision1__BLUEBOX);

    Brain.Screen.clearScreen();
    Brain.Screen.setCursor(1, 1);

    Brain.Screen.print("Object Count: %d", Vision1.objectCount);

    wait(0.5, seconds);
  }
}

objects#

objects – це масив, що містить виявлені об’єкти з останнього виклику takeSnapshot.

Кожен елемент масиву представляє виявлений об’єкт і надає доступ до його властивостей, таких як width, height, centerX тощо.

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

Syntax
VisionSensor.objects[index].property

Components

Компонент

Опис

VisionSensor

Назва вашого екземпляра Vision Sensor.

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.

Приклади

// Display when a blue object is detected
while (true) {
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.clearLine(1);

  Vision1.takeSnapshot(Vision1__BLUEBOX);

  if (Vision1.objects[0].exists) {
    Brain.Screen.print("Color detected!");
  }

  wait(100, msec); 
}

.width#

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

Доступ

SensorName.objects[index].width

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

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

Приклади

// Approach an object until it's at least 100 pixels wide
while (true) {
  Vision1.takeSnapshot(Vision1__BLUEBOX);
  if (Vision1.objects[0].exists && Vision1.objects[0].width < 100) {
    Drivetrain.driveFor(forward, 10, mm);
  } 
  else {
    Drivetrain.stop();
  }
  wait(0.5, seconds);
}

.висота#

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

Доступ

SensorName.objects[index].height

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

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

Приклади

// Approach an object until it's at least 100 pixels tall
while (true) {
  Vision1.takeSnapshot(Vision1__BLUEBOX);

  if (Vision1.objects[0].exists && Vision1.objects[0].height < 100) {
    Drivetrain.driveFor(forward, 10, mm);
  } 
  else {
    Drivetrain.stop();
  }
  wait(0.5, seconds);  // Avoid over-processing
}

.centerX#

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

Доступ

SensorName.objects[index].centerX

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

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

Приклади

// Turn until an object is directly in front of the sensor
Drivetrain.setTurnVelocity(10, percent);
Drivetrain.turn(right);
while (true) {
  Vision1.takeSnapshot(Vision1__BLUEBOX);
  if (Vision1.objects[0].exists) {
    int centerX = Vision1.largestObject.centerX;
    if (140 < centerX && centerX < 180) {
      Drivetrain.stop();
    }
  }
  wait(0.5, seconds);
}

.centerY#

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

Доступ

SensorName.objects[index].centerY

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

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

Приклади

// Approach an object until it's at least 90 pixels tall
while (true) {
  Vision1.takeSnapshot(Vision1__BLUEBOX);

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

.originX#

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

Доступ

SensorName.objects[index].originX

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

Returns an int representing the x-coordinate of the top-left corner of the object’s bounding box in pixels. The value ranges from 0 to 316.

Приклади

// Display if an object is to the left or the right
while (true) {
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Vision1.takeSnapshot(Vision1__BLUEBOX);
  if (Vision1.objects[0].exists) {
    if (Vision1.objects[0].originX < 160) {
      Brain.Screen.print("To the left!");
    }
    else {
      Brain.Screen.print("To the right!");
    }
  }
  wait(0.5, seconds); 
}

.originY#

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

Доступ

SensorName.objects[index].originY

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

Returns an int representing the y-coordinate of the top-left corner of the object’s bounding box in pixels. The value ranges from 0 to 212.

Приклади

// Display if an object is close or far
while (true) {
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Vision1.takeSnapshot(Vision1__BLUEBOX);
  if (Vision1.objects[0].exists) {
    if (Vision1.objects[0].originY < 80) {
      Brain.Screen.print("Far");
    } else {
      Brain.Screen.print("Close");
    }
  }
  wait(0.5, seconds);
}

.кут#

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

Доступ

SensorName.objects[index].angle

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

Returns a double representing the orientation of the detected Color Code 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) {
  Vision1.takeSnapshot(Vision1__BOXCODE);
  if (Vision1.objects[0].exists) {
    double angle = Vision1.objects[0].angle;
    if (70 < angle && angle < 110) {
      Drivetrain.turnFor(right, 45, degrees);
    }
    else if (250 < angle && angle < 290) {
      Drivetrain.turnFor(left, 45, degrees);
    }
    else {
      Drivetrain.stop();
    }
  }
  wait(0.5, seconds);
}