Capteur de vision#

Introduction#

La classe vision permet de contrôler et d’accéder aux données du capteur de vision IQ (2e génération). Ce capteur détecte et suit les signatures de couleur dans son champ de vision, permettant ainsi à votre robot d’identifier des cibles et de réagir aux informations visuelles en temps réel.

Le capteur de vision peut détecter simultanément plusieurs objets distinctifs et fournit des informations telles que la position, la largeur, la hauteur et les coordonnées du centre de l’objet.

Constructeurs de classes#

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

Destructeur de classe#

Détruit l’objet vision et libère les ressources associées.

~vision();

Paramètres#

Paramètre

Taper

Description

index

int32_t

Le port intelligent auquel le capteur de vision est connecté, écrit sous la forme PORTx, où x est le numéro de port (par exemple, PORT1).

bright

uint8_t

Niveau de luminosité du capteur de vision.

sigs

vision::signature or vision::code objects

Un ou plusieurs objets vision::signature ou vision::code à enregistrer auprès du capteur.

Exemples#

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

Fonctions des membres#

La classe vision comprend les fonctions membres suivantes :

  • takeSnapshot — Capture les données pour une signature de couleur ou un code couleur spécifique.

  • installed — Indique si le capteur de vision est connecté au cerveau IQ (2e génération).

Pour accéder aux données de l’objet détecté après avoir appelé takeSnapshot, utilisez les Propriétés disponibles.

Avant d’appeler les fonctions membres de vision , une instance vision doit être créée, comme indiqué ci-dessous :

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

Cette méthode capture une image à partir du capteur de vision, la traite en fonction de sa signature et met à jour le tableau contenant objects objet. Elle permet également de limiter le nombre d’objets capturés dans l’instantané.

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 — Prend un instantané et recherche les objets correspondant à l’ID de signature spécifié.

int32_t takeSnapshot( uint32_t id );

2 — Prend un instantané et recherche les objets correspondant à l’objet spécifié vision::code.

int32_t takeSnapshot( code &cc );

3 — Prend un instantané et recherche les objets correspondant à l’objet vision::signature spécifié.

int32_t takeSnapshot( signature &sig );

4 — Prend un instantané et ne stocke que le plus grand nombre spécifié d’objets correspondant à l’ID de signature.

int32_t takeSnapshot( uint32_t id, uint32_t count );

5 — Prend un instantané et ne stocke que le plus grand nombre spécifié d’objets correspondant à l’objet vision::code spécifié.

int32_t takeSnapshot( code &cc, uint32_t count );

6 — Prend un instantané et ne stocke que le plus grand nombre spécifié d’objets correspondant à l’objet vision::signature spécifié.

int32_t takeSnapshot( signature &sig, uint32_t count );

Parameters

Paramètre

Taper

Description

id

uint32_t

Le numéro d’identification de la signature à rechercher.

cc

code &

Une référence à un objet vision::code à rechercher.

sig

signature &

Une référence à un objet vision::signature à rechercher.

count

uint32_t

Nombre maximal d’objets à détecter.

Return Values

Renvoie un entier int32_t représentant le nombre d’objets correspondants détectés.

Notes
  • Le capteur de vision doit prendre une photo avant que les données de l’objet puissent être accessibles.

  • Lorsque count est spécifié, seuls les plus grands objets détectés (jusqu’à la quantité spécifiée) sont stockés.

Exemples

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#

Indique si le capteur de vision est connecté au cerveau IQ (2e génération).

Available Functions
bool installed();

Parameters

Cette fonction ne prend aucun paramètre.

Return Values

Renvoie une valeur booléenne indiquant si le capteur de vision est connecté :

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

Propriétés#

L’appel à takeSnapshot met à jour les résultats de détection du capteur de vision. Chaque instantané rafraîchit le tableau objects , qui contient les objets détectés pour la signature de couleur ou le code couleur demandé.

Les données du capteur de vision sont accessibles via les propriétés des objets stockés dans Vision1.objects[index], où index commence à 0.

La résolution d’image du capteur de vision est de 316 x 212 pixels. La position et la taille des objets sont exprimées en pixels par rapport au champ de vision actuel du capteur.

Les propriétés suivantes sont disponibles :

  • largestObject — Sélectionne le plus grand objet détecté dans le dernier instantané.

  • objectCount — Renvoie le nombre d’objets valides stockés dans objects.

  • objects — Tableau d’objets détectés mis à jour par takeSnapshot.

  • .exists — Indique si l’entrée de l’objet contient des données valides.

  • .width — Largeur de l’objet détecté en pixels.

  • .height — Hauteur de l’objet détecté en pixels.

  • .centerX — Position X du centre de l’objet en pixels.

  • .centerY — Position Y du centre de l’objet en pixels.

  • .originX — Position X du coin supérieur gauche de l’objet en pixels.

  • .originY — Position Y du coin supérieur gauche de l’objet en pixels.

  • .angle — Orientation du code couleur détecté en degrés (le cas échéant).

largestObject#

Récupère le plus grand objet détecté dans le tableau de objects objet.

Cette méthode peut être utilisée pour toujours obtenir l’objet le plus grand parmi objects sans spécifier d’index.

Syntax
VisionSensor.largestObject

Components

Composant

Description

VisionSensor

Le nom de votre instance de capteur de vision.

Exemples

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#

Renvoie le nombre d’éléments contenus dans le tableau objects sous forme d’entier.

Syntax
VisionSensor.objectCount

Components

Composant

Description

VisionSensor

Le nom de votre instance de capteur de vision.

Exemples

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 est un tableau contenant les objets détectés lors de l’appel le plus récent à takeSnapshot.

Chaque élément du tableau représente un objet détecté et donne accès à ses propriétés, telles que width, height, centerX, et plus encore.

Les objets sont classés du plus grand au plus petit (par largeur), en commençant à l’index 0.

Syntax
VisionSensor.objects[index].property

Components

Composant

Description

VisionSensor

Le nom de votre instance de capteur de vision.

index

L’index de l’objet dans le tableau. L’index commence à 0.

property

One of the available object properties.

.existe#

.exists renvoie si l’index d’objet spécifié contient un objet détecté valide.

Accès

SensorName.objects[index].exists

Valeurs de retour

Renvoie une valeur booléenne indiquant si l’index d’objet spécifié contient un objet détecté valide :

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

Exemples

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

.largeur#

.width renvoie la largeur de l’objet détecté.

Accès

SensorName.objects[index].width

Valeurs de retour

Renvoie un entier int représentant la largeur de l’objet détecté en pixels. La valeur est comprise entre 1 et 316.

Exemples

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

.hauteur#

.height renvoie la hauteur de l’objet détecté.

Accès

SensorName.objects[index].height

Valeurs de retour

Renvoie un entier int représentant la hauteur de l’objet détecté en pixels. La valeur est comprise entre 1 et 212.

Exemples

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

.centreX#

.centerX renvoie la coordonnée x du centre de l’objet détecté.

Accès

SensorName.objects[index].centerX

Valeurs de retour

Renvoie un entier int représentant la coordonnée x du centre de l’objet en pixels. La valeur est comprise entre 0 et 316.

Exemples

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

.centreY#

.centerY renvoie la coordonnée y du centre de l’objet détecté.

Accès

SensorName.objects[index].centerY

Valeurs de retour

Renvoie un entier int représentant la coordonnée y du centre de l’objet en pixels. La valeur est comprise entre 0 et 212.

Exemples

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

.origineX#

.originX renvoie la coordonnée x du coin supérieur gauche de la boîte englobante de l’objet détecté.

Accès

SensorName.objects[index].originX

Valeurs de retour

Renvoie un entier int représentant la coordonnée x du coin supérieur gauche de la boîte englobante de l’objet en pixels. La valeur est comprise entre 0 et 316.

Exemples

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

.origine#

.originY renvoie la coordonnée y du coin supérieur gauche de la boîte englobante de l’objet détecté.

Accès

SensorName.objects[index].originY

Valeurs de retour

Renvoie un entier int représentant la coordonnée y du coin supérieur gauche de la boîte englobante de l’objet en pixels. La valeur est comprise entre 0 et 212.

Exemples

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

.angle renvoie l’orientation du code couleur détecté.

Accès

SensorName.objects[index].angle

Valeurs de retour

Renvoie un double double représentant l’orientation du code couleur détecté en degrés. La valeur est comprise entre 0 et 359.9.

Exemples

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