Vizuální senzor#
Zavedení#
Třída vision se používá k ovládání a přístupu k datům ze senzoru EXP Vision. Tento senzor detekuje a sleduje barevné podpisy ve svém zorném poli, což umožňuje robotovi identifikovat cíle a reagovat na vizuální informace v reálném čase.
Vizuální senzor dokáže detekovat více charakteristických objektů současně a poskytuje informace, jako je poloha objektu, šířka, výška a souřadnice středu.
Konstruktory tříd#
vision(
int32_t index,
uint8_t bright,
Args&... sigs );
Destruktor tříd#
Destroys the vision object and releases associated resources.
~vision();
Parametry#
Parametr |
Typ |
Popis |
|---|---|---|
|
|
Inteligentní port, ke kterému je připojen kamerový senzor, zapsaný jako |
|
|
Úroveň jasu obrazového senzoru. |
|
|
Jeden nebo více objektů typu |
Příklady#
// 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
Členské funkce#
Třída vision obsahuje následující členské funkce:
takeSnapshot— Zachytí data pro konkrétní barevný podpis nebo barevný kód.installed— Zda je Vision Sensor připojen k EXP Brain.
Pro přístup k datům detekovaného objektu po volání takeSnapshot použijte dostupné Properties.
Před voláním jakékoli členské funkce typu vision je nutné vytvořit instanci vision , jak je znázorněno níže:
/* 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#
Zachytí obrázek z vizuální sondy, zpracuje ho na základě signatury a aktualizuje pole objects Tato metoda může také omezit počet objektů zachycených ve snímku.
Pole objects ukládá objekty seřazené od největšího po nejmenší podle šířky, počínaje indexem 0. K vlastnostem properties každého objektu lze přistupovat pomocí jeho indexu. Pokud nejsou detekovány žádné odpovídající objekty, objectCount bude 0 a objects[i].exists bude false.
1 — Pořídí snímek a vyhledá objekty odpovídající zadanému ID podpisu.
int32_t takeSnapshot( uint32_t id );
2 — Pořídí snímek a vyhledá objekty odpovídající zadanému objektu
vision::code.int32_t takeSnapshot( code &cc );
3 — Pořídí snímek a vyhledá objekty odpovídající zadanému objektu
vision::signature.int32_t takeSnapshot( signature &sig );
4 — Vytvoří snímek a uloží pouze největší zadaný počet objektů odpovídajících ID podpisu.
int32_t takeSnapshot( uint32_t id, uint32_t count );
5 — Pořídí snímek a uloží pouze největší zadaný počet objektů odpovídající zadanému objektu
vision::code.int32_t takeSnapshot( code &cc, uint32_t count );
Parameters6 — Pořídí snímek a uloží pouze největší zadaný počet objektů odpovídající zadanému objektu
vision::signature.int32_t takeSnapshot( signature &sig, uint32_t count );
Parametr |
Typ |
Popis |
|---|---|---|
|
|
Číslo podpisu, které se má vyhledat. |
|
|
Odkaz na objekt typu |
|
|
Odkaz na objekt |
|
|
Maximální počet objektů k detekci. |
Vrací hodnotu int32_t představující počet detekovaných odpovídajících objektů.
Před přístupem k datům objektu musí kamerový senzor pořídit snímek.
Pokud je zadána hodnota
count, ukládají se pouze největší detekované objekty (do zadaného počtu).
Příklady
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#
Vrací, zda je Vision Sensor připojen k EXP Brain.
Available Functionsbool installed();
Tato funkce nepřijímá žádné parametry.
Return ValuesVrací booleovskou hodnotu označující, zda je připojen senzor vidění:
-
true— The Vision Sensor is connected. -
false— The Vision Sensor is not connected.
Nemovitosti#
Voláním takeSnapshot se aktualizují výsledky detekce senzoru Vision. Každý snímek aktualizuje pole objects , které obsahuje detekované objekty pro požadovaný barevný podpis nebo barevný kód.
K datům senzoru Vision Sensor se přistupuje prostřednictvím vlastností objektů uložených v Vision1.objects[index], kde index začíná na 0.
Rozlišení obrazu z vizuální senzoru je 316 x 212 pixelů. Poloha a velikost objektu jsou uváděny v pixelech vzhledem k aktuálnímu pohledu senzoru.
K dispozici jsou následující vlastnosti:
largestObject— Vybere největší detekovaný objekt z nejnovějšího snímku.objectCount— Vrátí počet platných objektů uložených veobjects.objects— Pole detekovaných objektů aktualizovaných funkcítakeSnapshot..exists— Zda položka objektu obsahuje platná data..width— Šířka detekovaného objektu v pixelech..height— Výška detekovaného objektu v pixelech..centerX— Pozice středu objektu na souřadnici X v pixelech..centerY— Pozice středu objektu na souřadnici Y v pixelech..originX— Pozice levého horního rohu objektu na souřadnici X v pixelech..originY— Pozice Y levého horního rohu objektu v pixelech..angle— Orientace detekovaného barevného kódu ve stupních (pokud je to relevantní).
largestObject#
Načte největší detekovaný objekt z pole objects.
Tuto metodu lze použít k tomu, aby se z objects vždy získal největší objekt bez zadání indexu.
VisionSensor.largestObject
Komponent |
Popis |
|---|---|
|
Název vaší instance Vision Sensor. |
Příklady
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#
Vrátí počet položek v poli objects jako celé číslo.
VisionSensor.objectCount
Komponent |
Popis |
|---|---|
|
Název vaší instance Vision Sensor. |
Příklady
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 je pole obsahující detekované objekty z posledního volání funkce takeSnapshot.
Každý prvek v poli představuje detekovaný objekt a poskytuje přístup k jeho vlastnostem, jako například width, height, centerX a další.
Objekty jsou seřazeny od největšího po nejmenší (podle šířky), počínaje indexem 0.
VisionSensor.objects[index].property
Komponent |
Popis |
|---|---|
|
Název vaší instance Vision Sensor. |
|
Index objektu v poli. Index začíná na |
|
Jedna z dostupných vlastností objektu. |
.existuje#
.exists vrací, zda zadaný index objektu obsahuje platný detekovaný objekt.
Přístup
SensorName.objects[index].exists
Návratové hodnoty
Vrací booleovskou hodnotu označující, zda zadaný index objektu obsahuje platný detekovaný objekt:
-
true— A valid object exists at the specified index. -
false— No object exists at the specified index.
Příklady
// 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);
}
.šířka#
.width vrací šířku detekovaného objektu.
Přístup
SensorName.objects[index].width
Návratové hodnoty
Vrací int představující šířku detekovaného objektu v pixelech. Hodnota se pohybuje v rozmezí od 1 do 316.
Příklady
// 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);
}
.výška#
.height vrací výšku detekovaného objektu.
Přístup
SensorName.objects[index].height
Návratové hodnoty
Vrací int představující výšku detekovaného objektu v pixelech. Hodnota se pohybuje v rozmezí od 1 do 212.
Příklady
// 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 vrací souřadnici x středu detekovaného objektu.
Přístup
SensorName.objects[index].centerX
Návratové hodnoty
Returns an int representing the x-coordinate of the object’s center in pixels. The value ranges from 0 to 316.
Příklady
// 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 vrací souřadnici y středu detekovaného objektu.
Přístup
SensorName.objects[index].centerY
Návratové hodnoty
Returns an int representing the y-coordinate of the object’s center in pixels. The value ranges from 0 to 212.
Příklady
// 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 vrací souřadnici x levého horního rohu ohraničujícího rámečku detekovaného objektu.
Přístup
SensorName.objects[index].originX
Návratové hodnoty
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.
Příklady
// 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 vrací souřadnici y levého horního rohu ohraničujícího rámečku detekovaného objektu.
Přístup
SensorName.objects[index].originY
Návratové hodnoty
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.
Příklady
// 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);
}
.úhel#
.angle vrací orientaci detekovaného barevného kódu.
Přístup
SensorName.objects[index].angle
Návratové hodnoty
Returns a double representing the orientation of the detected Color Code in degrees. The value ranges from 0 to 359.9.
Příklady
// 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);
}