Датчик зору#
Вступ#
Клас vision використовується для керування та доступу до даних із датчика зору IQ (2-го покоління). Цей датчик виявляє та відстежує кольорові сигнатури в межах свого поля зору, що дозволяє вашому роботу ідентифікувати цілі та реагувати на візуальну інформацію в режимі реального часу.
Датчик зору може одночасно виявляти кілька об’єктів-сигнатур та надавати таку інформацію, як положення об’єкта, ширина, висота та координати центру.
Конструктори класів#
vision(
int32_t index,
uint8_t bright,
Args&... sigs );
Деструктор класів#
Знищує об’єкт vision та звільняє пов’язані з ним ресурси.
~vision();
Параметри#
Параметр |
Тип |
Опис |
|---|---|---|
|
|
Розумний порт, до якого підключено датчик зору, записується як |
|
|
Рівень яскравості датчика зору. |
|
|
Один або декілька об’єктів |
Приклади#
// 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— Чи підключено датчик зору до мозку IQ (2-го покоління).
Щоб отримати доступ до даних виявленого об’єкта після виклику 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.
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 );
Parameters6 — Робить знімок і зберігає лише найбільшу задану кількість об’єктів, що відповідають заданому об’єкту
vision::signature.int32_t takeSnapshot( signature &sig, uint32_t count );
Параметр |
Тип |
Опис |
|---|---|---|
|
|
Номер ідентифікатора підпису для пошуку. |
|
|
Посилання на об’єкт |
|
|
Посилання на об’єкт типу |
|
|
Максимальна кількість об’єктів для виявлення. |
Повертає значення int32_t , яке представляє кількість виявлених відповідних об’єктів.
Датчик зору повинен зробити знімок, перш ніж можна буде отримати доступ до даних об’єкта.
Якщо вказано значення
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#
Повертає, чи підключено датчик зору до мозку IQ (2-го покоління).
Available Functionsbool installed();
Ця функція не приймає жодних параметрів.
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 без вказівки індексу.
VisionSensor.largestObject
Компонент |
Опис |
|---|---|
|
Назва вашого екземпляра 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 у вигляді цілого числа.
VisionSensor.objectCount
Компонент |
Опис |
|---|---|
|
Назва вашого екземпляра 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.
VisionSensor.objects[index].property
Компонент |
Опис |
|---|---|
|
Назва вашого екземпляра Vision Sensor. |
|
Індекс об’єкта в масиві. Індекс починається з |
|
Одна з доступних властивостей об’єкта. |
.існує#
.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);
}