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

index

int32_t

Inteligentní port, ke kterému je připojen kamerový senzor, zapsaný jako PORTx, kde x je číslo portu (například PORT1).

bright

uint8_t

Úroveň jasu obrazového senzoru.

sigs

vision::signature or vision::code objects

Jeden nebo více objektů typu vision::signature nebo vision::code, které mají být zaregistrovány senzorem.

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.

Available Functions

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 );

6 — 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 );

Parameters

Parametr

Typ

Popis

id

uint32_t

Číslo podpisu, které se má vyhledat.

cc

code &

Odkaz na objekt typu vision::code s hodnotou , který se má vyhledat.

sig

signature &

Odkaz na objekt vision::signature s hodnotou 0, který se má vyhledat.

count

uint32_t

Maximální počet objektů k detekci.

Return Values

Vrací hodnotu int32_t představující počet detekovaných odpovídajících objektů.

Notes
  • 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 Functions
bool installed();

Parameters

Tato funkce nepřijímá žádné parametry.

Return Values

Vrací 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 ve objects.

  • 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.

Syntax
VisionSensor.largestObject

Components

Komponent

Popis

VisionSensor

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.

Syntax
VisionSensor.objectCount

Components

Komponent

Popis

VisionSensor

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.

Syntax
VisionSensor.objects[index].property

Components

Komponent

Popis

VisionSensor

Název vaší instance Vision Sensor.

index

Index objektu v poli. Index začíná na 0.

property

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);
}