Visiesensor#

Invoering#

De vision klasse wordt gebruikt om de gegevens van de IQ (2e generatie) Vision Sensor te besturen en te benaderen. Deze sensor detecteert en volgt kleursignaturen binnen zijn gezichtsveld, waardoor uw robot doelen kan identificeren en in realtime op visuele informatie kan reageren.

De visionsensor kan meerdere objecten tegelijk detecteren en levert informatie zoals de positie, breedte, hoogte en middelpuntcoördinaten van het object.

Klasseconstructors#

vision(
  int32_t  index,
  uint8_t  bright,
  Args&... sigs );

Klasse-destructor#

Vernietigt het vision object en geeft de bijbehorende resources vrij.

~vision();

Parameters#

Parameter

Type

Beschrijving

index

int32_t

De slimme poort waarop de visionsensor is aangesloten, wordt weergegeven als PORTx, waarbij x het poortnummer is (bijvoorbeeld PORT1).

bright

uint8_t

Het helderheidsniveau van de beeldsensor.

sigs

vision::signature or vision::code objects

Een of meer vision::signature of vision::code objecten die bij de sensor geregistreerd moeten worden.

Voorbeelden#

// 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

Lidfuncties#

De klasse vision omvat de volgende lidfuncties:

  • takeSnapshot — Legt gegevens vast voor een specifieke kleursignatuur of kleurcode.

  • installed — Of de Vision Sensor is verbonden met de IQ (2e generatie) Brain.

Om toegang te krijgen tot de gedetecteerde objectgegevens na het aanroepen van takeSnapshot, gebruikt u de beschikbare Properties.

Voordat er lidfuncties van vision kunnen worden aangeroepen, moet er een instantie van vision worden aangemaakt, zoals hieronder wordt weergegeven:

/* 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#

Legt een afbeelding vast met de Vision Sensor, verwerkt deze op basis van de signatuur en werkt de array met objects object bij. Deze methode kan ook het aantal objecten beperken dat in de momentopname wordt vastgelegd.

De array objects slaat objecten op, geordend van groot naar klein op basis van breedte, beginnend bij index 0. De eigenschappen van elk object kunnen worden benaderd via de index. Als er geen overeenkomende objecten worden gevonden, zal objectCount 0 zijn en objects[i].exists zal onwaar zijn.

Available Functions

1 — Maakt een momentopname en zoekt naar objecten die overeenkomen met de opgegeven handtekening-ID.

int32_t takeSnapshot( uint32_t id );

2 — Maakt een momentopname en zoekt naar objecten die overeenkomen met het opgegeven vision::code object.

int32_t takeSnapshot( code &cc );

3 — Maakt een momentopname en zoekt naar objecten die overeenkomen met het opgegeven vision::signature object.

int32_t takeSnapshot( signature &sig );

4 — Maakt een momentopname en slaat alleen het grootste opgegeven aantal objecten op dat overeenkomt met de handtekening-ID.

int32_t takeSnapshot( uint32_t id, uint32_t count );

5 — Maakt een momentopname en slaat alleen het grootste opgegeven aantal objecten op dat overeenkomt met het opgegeven vision::code object.

int32_t takeSnapshot( code &cc, uint32_t count );

6 — Maakt een momentopname en slaat alleen het grootste opgegeven aantal objecten op dat overeenkomt met het opgegeven vision::signature object.

int32_t takeSnapshot( signature &sig, uint32_t count );

Parameters

Parameter

Type

Beschrijving

id

uint32_t

Het te zoeken handtekening-ID-nummer.

cc

code &

Een verwijzing naar een vision::code object waarnaar gezocht moet worden.

sig

signature &

Een verwijzing naar een object met vision::signature waarnaar gezocht moet worden.

count

uint32_t

Het maximale aantal te detecteren objecten.

Return Values

Retourneert een int32_t die het aantal gevonden overeenkomende objecten weergeeft.

Notes
  • De beeldsensor moet een momentopname maken voordat objectgegevens kunnen worden opgevraagd.

  • Als count is opgegeven, worden alleen de grootste gedetecteerde objecten (tot het opgegeven aantal) opgeslagen.

Voorbeelden

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#

Geeft aan of de Vision Sensor is verbonden met de IQ (2e generatie) Brain.

Available Functions
bool installed();

Parameters

Deze functie accepteert geen parameters.

Return Values

Geeft een Booleaanse waarde terug die aangeeft of de Vision Sensor is aangesloten:

  • true — The Vision Sensor is connected.
  • false — The Vision Sensor is not connected.

Eigenschappen#

Het aanroepen van takeSnapshot werkt de detectieresultaten van de Vision Sensor bij. Elke snapshot vernieuwt de array objects , die de gedetecteerde objecten bevat voor de gevraagde kleursignatuur of kleurcode.

De gegevens van de Vision Sensor worden benaderd via eigenschappen van objecten die zijn opgeslagen in Vision1.objects[index], waarbij index begint bij 0.

De beeldresolutie van de Vision Sensor is 316 bij 212 pixels. De positie en grootte van objecten worden weergegeven in pixels ten opzichte van het huidige gezichtsveld van de sensor.

De volgende eigenschappen zijn beschikbaar:

  • largestObject — Selecteert het grootste gedetecteerde object uit de meest recente momentopname.

  • objectCount — Retourneert het aantal geldige objecten dat is opgeslagen in objects.

  • objects — Array van gedetecteerde objecten bijgewerkt door takeSnapshot.

  • .exists — Of de objectvermelding geldige gegevens bevat.

  • .width — Breedte van het gedetecteerde object in pixels.

  • .height — Hoogte van het gedetecteerde object in pixels.

  • .centerX — X-positie van het middelpunt van het object in pixels.

  • .centerY — Y-positie van het middelpunt van het object in pixels.

  • .originX — X-positie van de linkerbovenhoek van het object in pixels.

  • .originY — Y-positie van de linkerbovenhoek van het object in pixels.

  • .angle — Oriëntatie van de gedetecteerde kleurcode in graden (indien van toepassing).

largestObject#

Haalt het grootste gedetecteerde object op uit de array met objects object.

Deze methode kan worden gebruikt om altijd het grootste object te verkrijgen uit objects zonder een index op te geven.

Syntax
VisionSensor.largestObject

Components

component

Beschrijving

VisionSensor

De naam van uw Vision Sensor-instantie.

Voorbeelden

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#

Geeft het aantal items in de array objects terug als een geheel getal.

Syntax
VisionSensor.objectCount

Components

component

Beschrijving

VisionSensor

De naam van uw Vision Sensor-instantie.

Voorbeelden

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 is een array met de gedetecteerde objecten van de meest recente aanroep van takeSnapshot.

Elk element in de array vertegenwoordigt een gedetecteerd object en biedt toegang tot de eigenschappen ervan, zoals width, height, centerX, en meer.

De objecten zijn gesorteerd van groot naar klein (op basis van breedte), beginnend bij index 0.

Syntax
VisionSensor.objects[index].property

Components

component

Beschrijving

VisionSensor

De naam van uw Vision Sensor-instantie.

index

De objectindex in de array. Index begint bij 0.

property

Een van de beschikbare objecteigenschappen.

.bestaat#

.exists retourneert of de opgegeven objectindex een geldig gedetecteerd object bevat.

Toegang

SensorName.objects[index].exists

retourwaarden

Retourneert een Booleaanse waarde die aangeeft of de opgegeven objectindex een geldig gedetecteerd object bevat:

  • true — A valid object exists at the specified index.
  • false — No object exists at the specified index.

Voorbeelden

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

.breedte#

.width geeft de breedte van het gedetecteerde object terug.

Toegang

SensorName.objects[index].width

retourwaarden

Retourneert een int die de breedte van het gedetecteerde object in pixels weergeeft. De waarde varieert van 1 tot 316.

Voorbeelden

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

.hoogte#

.height geeft de hoogte van het gedetecteerde object terug.

Toegang

SensorName.objects[index].height

retourwaarden

Retourneert een int die de hoogte van het gedetecteerde object in pixels weergeeft. De waarde varieert van 1 tot 212.

Voorbeelden

// 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 retourneert de x-coördinaat van het middelpunt van het gedetecteerde object.

Toegang

SensorName.objects[index].centerX

retourwaarden

Retourneert een int die de x-coördinaat van het middelpunt van het object in pixels vertegenwoordigt. De waarde ligt tussen 0 en 316.

Voorbeelden

// 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 retourneert de y-coördinaat van het middelpunt van het gedetecteerde object.

Toegang

SensorName.objects[index].centerY

retourwaarden

Retourneert een int die de y-coördinaat van het middelpunt van het object in pixels voorstelt. De waarde varieert van 0 tot 212.

Voorbeelden

// 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 retourneert de x-coördinaat van de linkerbovenhoek van het begrenzingskader van het gedetecteerde object.

Toegang

SensorName.objects[index].originX

retourwaarden

Retourneert een int die de x-coördinaat van de linkerbovenhoek van de begrenzingsbox van het object in pixels weergeeft. De waarde ligt tussen 0 en 316.

Voorbeelden

// 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 retourneert de y-coördinaat van de linkerbovenhoek van het begrenzingskader van het gedetecteerde object.

Toegang

SensorName.objects[index].originY

retourwaarden

Retourneert een int die de y-coördinaat van de linkerbovenhoek van de begrenzingsbox van het object in pixels weergeeft. De waarde ligt tussen 0 en 212.

Voorbeelden

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

.hoek#

.angle geeft de oriëntatie van de gedetecteerde kleurcode terug.

Toegang

SensorName.objects[index].angle

retourwaarden

Retourneert een double die de oriëntatie van de gedetecteerde kleurcode in graden weergeeft. De waarde varieert van 0 tot 359.9.

Voorbeelden

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