Датчик зрения#

Введение#

Класс 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 объект. Он также может ограничивать количество объектов, захваченных в моментальный снимок.

The objects array stores objects ordered from largest to smallest by width, starting at index 0. Each object’s properties can be accessed using its index. If no matching objects are detected, objectCount will be 0 and objects[i].exists will be 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 возвращает ширину обнаруженного объекта.

Доступ

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

возвращаемых значений

Возвращает целое число int представляющее координату x центра объекта в пикселях. Значение находится в диапазоне от 0 до 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

возвращаемых значений

Возвращает целое число int представляющее координату Y центра объекта в пикселях. Значение находится в диапазоне от 0 до 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

возвращаемых значений

Возвращает целое число int представляющее координату x верхнего левого угла ограничивающего прямоугольника объекта в пикселях. Значение находится в диапазоне от 0 до 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

возвращаемых значений

Возвращает целое число int представляющее координату Y верхнего левого угла ограничивающего прямоугольника объекта в пикселях. Значение находится в диапазоне от 0 до 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

возвращаемых значений

Возвращает значение типа double , представляющее ориентацию обнаруженного цветового кода в градусах. Значение находится в диапазоне от 0 до 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);
}