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 |
|---|---|---|
|
|
Le port intelligent auquel le capteur de vision est connecté, écrit sous la forme |
|
|
Niveau de luminosité du capteur de vision. |
|
|
Un ou plusieurs objets |
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.
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::signaturespé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::codespécifié.int32_t takeSnapshot( code &cc, uint32_t count );
Parameters6 — Prend un instantané et ne stocke que le plus grand nombre spécifié d’objets correspondant à l’objet
vision::signaturespécifié.int32_t takeSnapshot( signature &sig, uint32_t count );
Paramètre |
Taper |
Description |
|---|---|---|
|
|
Le numéro d’identification de la signature à rechercher. |
|
|
Une référence à un objet |
|
|
Une référence à un objet |
|
|
Nombre maximal d’objets à détecter. |
Renvoie un entier int32_t représentant le nombre d’objets correspondants détectés.
Le capteur de vision doit prendre une photo avant que les données de l’objet puissent être accessibles.
Lorsque
countest 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 (1ère génération).
Available Functionsbool installed();
Cette fonction ne prend aucun paramètre.
Return ValuesRenvoie 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 dansobjects.objects— Tableau d’objets détectés mis à jour partakeSnapshot..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.
VisionSensor.largestObject
Composant |
Description |
|---|---|
|
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.
VisionSensor.objectCount
Composant |
Description |
|---|---|
|
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.
VisionSensor.objects[index].property
Composant |
Description |
|---|---|
|
Le nom de votre instance de capteur de vision. |
|
L’index de l’objet dans le tableau. L’index commence à |
|
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);
}