Датчик зрения#
Введение#
Класс vision используется для управления датчиком зрения V5 и доступа к его данным. Этот датчик обнаруживает и отслеживает цветовые сигнатуры в поле зрения, позволяя роботу идентифицировать цели и реагировать на визуальную информацию в режиме реального времени.
Визуальный датчик способен одновременно обнаруживать несколько объектов с характерными признаками и предоставляет такую информацию, как положение объекта, его ширина, высота и координаты центра.
Конструкторы классов#
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— Подключен ли датчик зрения к V5 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.
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#
Возвращает значение, указывающее, подключен ли датчик зрения к процессору V5 Brain.
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 возвращает ширину обнаруженного объекта.
Доступ
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);
}