Capteur de vision IA#
Introduction#
La classe aivision permet de contrôler et d’accéder aux données du capteur de vision IA EXP. Ce capteur peut détecter :
Classifications d’IA (telles que les objets de jeu)
Identifiants AprilTag
Signatures de couleur personnalisées
Codes de couleur personnalisés
Il fournit des données sur l’objet, notamment sa position, sa taille, son orientation, son identifiant de classification et son score de confiance.
Le capteur traite les informations visuelles à l’aide d’un modèle d’IA embarqué, sélectionné dans l’utilitaire AI Vision de VEXcode. Le modèle sélectionné détermine les classifications d’IA que le capteur peut détecter. Sous VS Code, le modèle d’IA doit être configuré au préalable dans VEXcode avant de pouvoir être utilisé dans votre programme. Les objets détectés sont renvoyés dans le tableau objects après l’appel de takeSnapshot.
Constructeurs de classes#
aivision(
int32_t index,
Args&... sigs );
Paramètres#
Paramètre |
Taper |
Description |
|---|---|---|
|
|
Le port intelligent auquel le capteur de vision AI est connecté, écrit comme |
|
|
Un ou plusieurs types de détection à enregistrer auprès du capteur :
|
Modèles et classifications d’IA#
Le capteur de vision IA peut détecter différents objets grâce à certaines classifications IA. Selon le modèle de classification IA sélectionné lors de la configuration du capteur dans la fenêtre « Périphériques », différents objets peuvent être détectés. Les modèles actuellement disponibles sont :
Éléments de la salle de classe
Numéro d’identification |
Classification par IA |
|---|---|
0 |
|
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
Compétition de robotique VEX V5 à enjeux élevés
Numéro d’identification |
Classification par IA |
|---|---|
0 |
|
1 |
|
2 |
|
Report de la compétition de robotique VEX V5
Numéro d’identification |
Classification par IA |
|---|---|
0 |
|
1 |
|
Dérogation pour la compétition de robotique VEX V5
Numéro d’identification |
Classification par IA |
|---|---|
0 |
|
1 |
|
2 |
|
3 |
|
4 |
|
Exemples#
// Create Color Signatures
aivision::colordesc AIVision1__greenBox(
1, // index
85, // red
149, // green
46, // blue
23, // hangle
0.23 ); // hdsat
aivision::colordesc AIVision1__blueBox(
2, // index
77, // red
135, // green
125, // blue
27, // hangle
0.29 ); // hdsat
// Create a Color Code from two color signatures
aivision::codedesc AIVision1__greenBlue(
1, // code index
AIVision1__greenBox, // first color signature
AIVision1__blueBox ); // second color signature
// Create the AI Vision Sensor instance
aivision AIVision1(
PORT11, // Smart Port
AIVision1__greenBlue, // color code
aivision::ALL_AIOBJS ); // enable AI Classifications
Fonctions des membres#
La classe aivision comprend les fonctions membres suivantes :
takeSnapshot— Capture les données pour une signature de couleur, un code couleur, un groupe de classification IA ou un groupe d’identifiants AprilTag spécifiques.installed— Indique si le capteur de vision IA est connecté au cerveau EXP.
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 une quelconque fonction membre de aivision , une instance aivision doit être créée, comme indiqué ci-dessous :
/* This constructor is required when using VS Code.
AI Vision Sensor configuration is generated automatically
in VEXcode using the Device Menu. Replace the values
as needed. */
// Create Color Signatures
aivision::colordesc AIVision1__greenBox(
1, // index
85, // red
149, // green
46, // blue
23, // hangle
0.23 ); // hdsat
aivision::colordesc AIVision1__blueBox(
2, // index
77, // red
135, // green
125, // blue
27, // hangle
0.29 ); // hdsat
// Create a Color Code from two color signatures
aivision::codedesc AIVision1__greenBlue(
1, // code index
AIVision1__greenBox, // first color signature
AIVision1__blueBox ); // second color signature
// Create the AI Vision Sensor instance
aivision AIVision1(
PORT1, // Smart Port
AIVision1__greenBlue, // color code
aivision::ALL_AIOBJS ); // enable AI Classifications
takeSnapshot#
Capture une image à partir du capteur de vision IA, la traite à l’aide du modèle IA sélectionné ou des signatures de couleur configurées, et met à jour le tableau objects.
Chaque appel actualise le tableau objects avec les résultats de détection les plus récents. Les objets sont ordonnés du plus grand au plus petit (par largeur), en commençant à l’index 0. Si aucun objet n’est détecté objectCount sera 0 et objects[i].exists sera false.
1 — Prend un instantané à l’aide d’un ID d’objet et d’un type d’objet.
int32_t takeSnapshot( uint32_t id, objectType type, uint32_t count );
2 — Prend un instantané à l’aide d’une Signature de couleur.
int32_t takeSnapshot( const colordesc &desc, int32_t count = 8 );
3 — Prend un instantané en utilisant un Code couleur.
int32_t takeSnapshot( const codedesc &desc, int32_t count = 8 );
4 — Prend un instantané à l’aide d’un AprilTag ID.
int32_t takeSnapshot( const tagdesc &desc, int32_t count = 8 );
5 — Prend un instantané à l’aide d’une Classification IA.
int32_t takeSnapshot( const aiobjdesc &desc, int32_t count = 8 );
Parameters6 — Prend un instantané à l’aide d’un descripteur d’objet.
int32_t takeSnapshot( const objdesc &desc, int32_t count = 8 );
Paramètre |
Taper |
Description |
|---|---|---|
|
|
The identifier of the object to detect when using the
Note: In VEXcode, AI Classification names (such as blueBall) may be used directly. In VS Code, the numeric ID must be used. |
|
|
Specifies the category of object associated with
|
|
|
Descriptor used to detect a specific object. Passed directly to
|
|
|
Nombre maximal d’objets stockés à partir de l’instantané. Par défaut : 8. |
Valeurs de retour
Renvoie un int32_t représentant le nombre d’objets détectés correspondant à la signature ou au type de détection spécifié.
Notes
Le capteur de vision IA doit prendre une capture d’écran avant que les données de l’objet puissent être consultées.
Le tableau
objectsest actualisé à chaque appel.Lorsque
countest spécifié, seuls les plus grands objets détectés (jusqu’à la quantité spécifiée) sont stockés.
Les classifications par IA dépendent du modèle sélectionné dans l’utilitaire de vision IA de VEXcode.
Exemples
// Move forward if an object is detected
while (true) {
AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
if (AIVision1.objects[0].exists) {
Drivetrain.driveFor(forward, 50, mm);
}
wait(50, msec);
}
installed#
Indique si le capteur de vision IA est connecté au cerveau EXP.
Fonctions disponibles
bool installed();
Paramètres
Cette fonction ne prend aucun paramètre.
Valeurs de retour
Renvoie une valeur booléenne indiquant si le capteur de vision IA est connecté :
true— Le capteur de vision IA est connecté.false— Le capteur de vision IA n’est pas connecté.
// Display a message if the AI Vision Sensor is connected
if (AIVision1.installed()){
Brain.Screen.print("Installed!");
}
Propriétés#
L’appel à takeSnapshot met à jour les résultats de détection du capteur de vision IA. Chaque instantané actualise le tableau objects , qui contient les objets détectés pour la classification IA, la signature couleur, le code couleur ou l’identifiant AprilTag demandés.
Les données AI Vision sont accessibles via les propriétés des objets stockés dans AIVisionSensor.objects[index], où index commence à 0.
Les objets sont classés du plus grand au plus petit (par surface).
La résolution d’image du capteur de vision AI est 320 × 240 pixels. Les valeurs de position et de taille de l’objet sont rapportées en unités de pixels par rapport à la vue actuelle du capteur.
Les propriétés suivantes sont disponibles :
objectCount— Renvoie le nombre d’objets détectés à partir du dernier instantané.largestObject— Sélectionne le plus grand objet détecté dans le dernier instantané.objects— Tableau contenant les 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 d’un code couleur ou d’un identifiant AprilTag en degrés..id— ID de classification ou ID AprilTag..score— Score de confiance pour les classifications d’IA.
objectCount#
objectCount renvoie le nombre d’éléments dans le tableau objects sous forme d’entier.
AIVisionSensor.objectCount
Composant |
Description |
|---|---|
|
Le nom de votre instance de capteur de vision IA. |
Exemples
// Display the number of detected objects
while (true) {
Brain.Screen.setCursor(1, 1);
Brain.Screen.clearLine(1);
AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
if (AIVision1.objects[0].exists) {
Brain.Screen.print("%d", AIVision1.objectCount);
}
wait(50, msec);
}
largestObject#
largestObject récupère le plus grand objet détecté parmi les objects.
Cette méthode peut être utilisée pour toujours obtenir l’objet le plus grand parmi objects sans spécifier d’index.
AIVisionSensor.largestObject
Composant |
Description |
|---|---|
|
Le nom de votre instance de capteur de vision IA. |
Exemples
// Display the closest AprilTag ID
while (true) {
Brain.Screen.setCursor(1, 1);
Brain.Screen.clearLine(1);
AIVision1.takeSnapshot(aivision::ALL_TAGS);
if (AIVision1.objects[0].exists) {
Brain.Screen.print("%d", AIVision1.largestObject.id);
}
wait(50, msec);
}
objects#
objects renvoie un tableau des propriétés d’objet détectées. Utilisez le tableau pour accéder aux valeurs spécifiques de property des objets individuels.
Il existe dix propriétés incluses avec chaque objet stocké dans le tableau objects après l’utilisation takeSnapshot.
Toutes les valeurs de propriétés, à l’exception de id et score que du score, décrivent la position et la taille de l’objet détecté dans le champ de vision du capteur de vision IA au moment de la prise de vue takeSnapshot . Ces valeurs sont exprimées en pixels, selon la résolution du capteur (320 x 240 pixels).
AIVisionSensor.objects[index].property
Composant |
Description |
|---|---|
|
Le nom de votre instance de capteur de vision IA. |
|
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
// Move forward if an object is detected
while (true) {
AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
if (AIVision1.objects[0].exists) {
Drivetrain.driveFor(forward, 50, mm);
}
wait(50, msec);
}
.largeur#
.width renvoie la largeur de l’objet détecté.
Accès
SensorName.objects[index].width
Valeurs de retour
Renvoie un int16_t représentant la largeur de l’objet détecté en pixels. La valeur est comprise entre 1 et 320.
Exemples
// Approach an object until it's at least 100 pixels wide
while (true) {
AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
if (AIVision1.objects[0].exists) {
if (AIVision1.objects[0].width < 100) {
Drivetrain.drive(forward);
} else {
Drivetrain.stop();
}
} else {
Drivetrain.stop();
}
wait(50, msec);
}
.hauteur#
.height renvoie la hauteur de l’objet détecté.
Accès
SensorName.objects[index].height
Valeurs de retour
Renvoie un entier int16_t représentant la hauteur de l’objet détecté en pixels. La valeur est comprise entre 1 et 240.
Exemples
// Approach an object until it's at least 90 pixels tall
while (true) {
AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
if (AIVision1.objects[0].exists) {
if (AIVision1.objects[0].height < 90) {
Drivetrain.drive(forward);
} else {
Drivetrain.stop();
}
} else {
Drivetrain.stop();
}
wait(50, msec);
}
.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 int16_t représentant la coordonnée x du centre de l’objet en pixels. La valeur est comprise entre 0 et 320.
Exemples
// Turn until an object is directly in front of the sensor
Drivetrain.setTurnVelocity(10, percent);
Drivetrain.turn(right);
while (true) {
AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
if (AIVision1.objects[0].exists) {
if (AIVision1.objects[0].centerX > 140 && AIVision1.objects[0].centerX < 180) {
Drivetrain.stop();
}
}
wait(10, msec);
}
.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 int16_t représentant la coordonnée y du centre de l’objet en pixels. La valeur est comprise entre 0 et 240.
Exemples
// Approach an object until it's close to the sensor
while (true) {
AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
if (AIVision1.objects[0].exists) {
if (AIVision1.objects[0].centerY < 150) {
Drivetrain.drive(forward);
} else {
Drivetrain.stop();
}
} else {
Drivetrain.stop();
}
wait(50, msec);
}
.angle#
.angle renvoie l’orientation du code couleur ou de l’identifiant AprilTag détecté.
Accès
SensorName.objects[index].angle
Valeurs de retour
Renvoie un nombre flottant float représentant la rotation du code couleur ou de l’identifiant AprilTag 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) {
AIVision1.takeSnapshot(AIVision1__redBlue);
if (AIVision1.objects[0].exists) {
if (AIVision1.objects[0].angle > 50 && AIVision1.objects[0].angle < 100) {
Drivetrain.turn(right);
}
else if (AIVision1.objects[0].angle > 270 && AIVision1.objects[0].angle < 330) {
Drivetrain.turn(left);
}
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 int16_t représentant la coordonnée x de l’origine de la boîte englobante de l’objet en pixels. La valeur est comprise entre 0 et 320.
Exemples
// Display if an object is to the left or the right
while (true) {
Brain.Screen.clearScreen();
Brain.Screen.setCursor(1, 1);
AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
if (AIVision1.objects[0].exists) {
if (AIVision1.objects[0].originX < 120) {
Brain.Screen.print("To the left!");
} else {
Brain.Screen.print("To the right!");
}
} else {
Brain.Screen.print("No objects");
}
wait(100, msec);
}
.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 int16_t représentant la coordonnée y de l’origine de la boîte englobante de l’objet en pixels. La valeur est comprise entre 0 et 240.
Exemples
// Display if an object is close or far
while (true) {
Brain.Screen.clearScreen();
Brain.Screen.setCursor(1, 1);
AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
if (AIVision1.objects[0].exists) {
if (AIVision1.objects[0].originY < 110) {
Brain.Screen.print("Close");
} else {
Brain.Screen.print("Far");
}
}
wait(100, msec);
}
.identifiant#
.id renvoie l’identifiant AprilTag ou l’identifiant de classification IA détecté.
Accès
SensorName.objects[index].id
Valeurs de retour
Renvoie un entier int32_t représentant l’ID de l’objet détecté :
Pour Classifications IA, cela correspond à l’ID défini par le modèle IA sélectionné.
Pour les identifiants AprilTag, cela représente le numéro d’identification AprilTag détecté (0–36).
Exemples
// Move forward when AprilTag ID 1 is detected
while (true) {
AIVision1.takeSnapshot(aivision::ALL_TAGS);
if (AIVision1.objects[0].exists) {
if (AIVision1.objects[0].id == 1) {
Drivetrain.drive(forward);
}
} else {
Drivetrain.stop();
}
wait(50, msec);
}
.score#
.score renvoie le score de confiance de la classification IA détectée.
Accès
SensorName.objects[index].score
Valeurs de retour
Renvoie un entier int16_t indiquant le score de confiance de la classification IA détectée entre 1 et 100.
Un score plus bas signifie que le capteur est moins sûr de l’objet détecté, tandis qu’un score plus élevé signifie que le capteur est plus sûr de lui.
Exemples
// Display if a score is confident
while (true) {
AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
if (AIVision1.objects[0].exists) {
Brain.screen.clearScreen();
Brain.screen.setCursor(1, 1);
if (AIVision1.objects[0].score > 95) {
Brain.Screen.print("Confident");
} else {
Brain.Screen.print("Not confident");
}
}
wait(50, msec);
}
