Sensor de visión de IA#
Introducción#
La aivision clase aivision se utiliza para controlar y acceder a los datos del sensor de visión EXP AI. El sensor de visión AI puede detectar:
Clasificaciones de IA (como objetos de juego)
AprilTag IDs
Firmas de color personalizadas
Códigos de color personalizados
Proporciona datos de objetos que incluyen posición, tamaño, orientación, ID de clasificación y puntaje de confianza.
El sensor procesa la información visual mediante un modelo de IA integrado, seleccionado en la Utilidad de Visión por IA de VEXcode. El modelo seleccionado determina qué clasificaciones de IA puede detectar el sensor. Al usar VS Code, el modelo de IA debe configurarse primero en VEXcode antes de poder usarlo en el programa. Los objetos detectados se devuelven a través del array objects después de llamar a takeSnapshot.
Constructores de clase#
aivision(
int32_t index,
Args&... sigs );
Parámetros#
Parámetro |
Tipo |
Descripción |
|---|---|---|
|
|
El puerto inteligente al que está conectado el sensor de visión AI, escrito como |
|
|
Uno o más tipos de detección para registrar en el sensor
|
Modelos y clasificaciones de IA#
El sensor de visión de IA puede detectar diferentes objetos con ciertas clasificaciones de IA. Dependiendo del modelo de clasificación de IA seleccionado al configurar el sensor de visión de IA en la ventana Dispositivos, se pueden detectar diferentes objetos. Los modelos disponibles actualmente son:
Elementos del aula
Número de identificación |
Clasificación de IA |
|---|---|
0 |
|
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
VEX V5 Robotics Competition High Stakes
Número de identificación |
Clasificación de IA |
|---|---|
0 |
|
1 |
|
2 |
|
VEX V5 Robotics Competition Push Back
Número de identificación |
Clasificación de IA |
|---|---|
0 |
|
1 |
|
VEX V5 Robotics Competition Override
Número de identificación |
Clasificación de IA |
|---|---|
0 |
|
1 |
|
2 |
|
3 |
|
4 |
|
Ejemplos#
// 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
Funciones de los miembros#
La aivision clase aivision incluye las siguientes funciones de miembro:
takeSnapshot: captura datos para una firma de color, un código de color, un grupo de clasificación de IA o un grupo de ID de AprilTag específicos.installed— Devuelve si el sensor de visión AI está conectado al cerebro EXP.
Para acceder a los datos del objeto detectado después de llamar a takeSnapshot, utilice las Properties disponibles.
Antes de llamar a cualquier aivision miembro de aivision, aivision instancia de aivision, como se muestra a continuación:
/* 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#
Captura una imagen del sensor de visión de IA, la procesa utilizando el modelo de IA seleccionado o las firmas de color configuradas y actualiza la matriz de objects.
Cada llamada actualiza el array objects con los resultados de detección más recientes. Los objetos se ordenan de mayor a menor (por ancho), comenzando en el índice 0. Si no se detectan objetos objectCount será 0 y objects[i].exists será false.
1 — Toma una instantánea con un ID de objeto y un tipo de objeto.
int32_t takeSnapshot( uint32_t id, objectType type, uint32_t count );
2 — Toma una instantánea con una Firma de color.
int32_t takeSnapshot( const colordesc &desc, int32_t count = 8 );
3 — Toma una instantánea con un Código de color.
int32_t takeSnapshot( const codedesc &desc, int32_t count = 8 );
4 — Toma una instantánea con un AprilTag ID.
int32_t takeSnapshot( const tagdesc &desc, int32_t count = 8 );
5 — Toma una instantánea usando una Clasificación de IA.
int32_t takeSnapshot( const aiobjdesc &desc, int32_t count = 8 );
Parameters6 — Toma una instantánea con un descriptor de objetos.
int32_t takeSnapshot( const objdesc &desc, int32_t count = 8 );
Parámetro |
Tipo |
Descripción |
|---|---|---|
|
|
El identificador del objeto a detectar cuando se utiliza la función
Nota: En VEXcode, los nombres de clasificación de IA (como blueBall) se pueden usar directamente. En VS Code, se debe usar el ID numérico. |
|
|
Especifica la categoría de objeto asociada con
|
|
|
Descriptor utilizado para detectar un objeto específico. Pasó directamente a
|
|
|
Número máximo de objetos almacenados de la instantánea. El valor predeterminado es 8. |
Valores de devolución
Devuelve un int32_t que representa el número de objetos detectados que coinciden con la firma o el tipo de detección especificado.
Observaciones
El sensor de visión de IA debe tomar una instantánea antes de poder acceder a los datos del objeto.
El array
objectselemento se actualiza en cada llamada.Cuando se especifica
count, solo se almacenan los objetos detectados de mayor tamaño (hasta la cantidad especificada).
Las clasificaciones de IA dependen del modelo seleccionado en AI Vision Utility en VEXcode.
Ejemplos
// 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#
Devuelve si el sensor de visión AI está conectado al cerebro EXP.
Funciones disponibles
bool installed();
Parámetros
Esta función no toma ningún parámetro.
Valores de devolución
Devuelve un booleano que indica si el sensor de visión AI está conectado:
true— El sensor de visión AI está conectado.false— El sensor de visión AI no está conectado.
// Display a message if the AI Vision Sensor is connected
if (AIVision1.installed()){
Brain.Screen.print("Installed!");
}
Propiedades#
Llamar a takeSnapshot actualiza los resultados de detección del sensor de visión de IA. Cada instantánea actualiza la matriz de objects , que contiene los objetos detectados para la clasificación de IA, la firma de color, el código de color o el ID de AprilTag solicitados.
Se accede a los datos de AI Vision a través de las propiedades de los AIVisionSensor.objects[index], donde el index comienza en 0.
Los objetos se ordenan de mayor a menor (por área).
La resolución de la imagen del sensor de visión AI es de 320 × 240 píxeles. Los valores de posición y tamaño del objeto se informan en unidades de píxeles en relación con la vista actual del sensor.
Las siguientes propiedades están disponibles:
objectCount— Devuelve el número de objetos detectados de la instantánea más reciente.largestObject— Selecciona el objeto detectado más grande de la instantánea más reciente.objects— Matriz que contiene objetos detectados actualizada portakeSnapshot..exists— Si la entrada del objeto contiene datos válidos..width— Ancho del objeto detectado en píxeles..height— Altura del objeto detectado en píxeles..centerX— Posición X del centro del objeto en píxeles..centerY— Posición Y del centro del objeto en píxeles..originX— Posición X de la esquina superior izquierda del objeto en píxeles..originY— Posición Y de la esquina superior izquierda del objeto en píxeles..angle— Orientación de un código de color o ID de AprilTag en grados..id— ID de clasificación o ID de AprilTag..score— Puntuación de confianza para las clasificaciones de IA.
objectCount#
objectCount devuelve el número de elementos dentro del array objects como un entero.
AIVisionSensor.objectCount
Componente |
Descripción |
|---|---|
|
El nombre de su instancia del sensor de visión de IA. |
Ejemplos
// 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 recupera el objeto más grande detectado del array de objects.
Este método se puede utilizar para obtener siempre el objeto más grande de objects sin especificar un índice.
AIVisionSensor.largestObject
Componente |
Descripción |
|---|---|
|
El nombre de su instancia del sensor de visión de IA. |
Ejemplos
// 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 devuelve una matriz de propiedades de objeto detectadas. Utilice la matriz para acceder a valores específicos de propiedad de objetos individuales.
Hay diez propiedades que se incluyen con cada objeto almacenado en el array objects después de que se utiliza takeSnapshot.
Todos los valores de propiedad, excepto id y score describen la posición y el tamaño del objeto detectado en la vista del sensor de visión AI en el momento en takeSnapshot se utilizó takeSnapshot. Estos valores se miden en píxeles, en función de la resolución de 320 por 240 píxeles del sensor.
AIVisionSensor.objects[index].property
Componente |
Descripción |
|---|---|
|
El nombre de su instancia del sensor de visión de IA. |
|
El índice de objeto en la matriz. El índice comienza en |
|
Una de las propiedades del objeto disponibles. |
.existe#
.exists devuelve si el índice de objeto especificado contiene un objeto detectado válido.
Acceso
SensorName.objects[index].exists
Valores de devolución
Devuelve un booleano que indica si el índice de objeto especificado contiene un objeto detectado válido:
-
true— A valid object exists at the specified index. -
false— No object exists at the specified index.
Ejemplos
// 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);
}
.width#
.width devuelve el ancho del objeto detectado.
Acceso
SensorName.objects[index].width
Valores de devolución
Devuelve un int16_t que representa el ancho del objeto detectado en píxeles. El valor varía de 1 a 320.
Ejemplos
// 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);
}
.height#
.height devuelve la altura del objeto detectado.
Acceso
SensorName.objects[index].height
Valores de devolución
Devuelve un int16_t que representa la altura del objeto detectado en píxeles. El valor varía de 1 a 240.
Ejemplos
// 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);
}
.centerX#
.centerX devuelve la coordenada x del centro del objeto detectado.
Acceso
SensorName.objects[index].centerX
Valores de devolución
Devuelve un int16_t que representa la coordenada x del centro del objeto en píxeles. El valor varía de 0 a 320.
Ejemplos
// 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);
}
.centerY#
.centerY devuelve la coordenada y del centro del objeto detectado.
Acceso
SensorName.objects[index].centerY
Valores de devolución
Devuelve un int16_t que representa la coordenada y del centro del objeto en píxeles. El valor varía de 0 a 240.
Ejemplos
// 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 devuelve la orientación del código de color detectado o el ID de AprilTag.
Acceso
SensorName.objects[index].angle
Valores de devolución
Devuelve un valor float que representa la rotación del código de color detectado o el ID de AprilTag en grados. El valor varía de 0 a 359.9.
Ejemplos
// 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);
}
.originX#
.originX devuelve la coordenada x de la esquina superior izquierda del cuadro delimitador del objeto detectado.
Acceso
SensorName.objects[index].originX
Valores de devolución
Devuelve un int16_t que representa la coordenada x del origen del cuadro delimitador del objeto en píxeles. El valor varía de 0 a 320.
Ejemplos
// 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);
}
.originY#
.originY devuelve la coordenada y de la esquina superior izquierda del cuadro delimitador del objeto detectado.
Acceso
SensorName.objects[index].originY
Valores de devolución
Devuelve un int16_t que representa la coordenada y del origen del cuadro delimitador del objeto en píxeles. El valor varía de 0 a 240.
Ejemplos
// 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);
}
.id#
.id devuelve el ID de AprilTag o el ID de clasificación de IA detectados.
Acceso
SensorName.objects[index].id
Valores de devolución
Devuelve un int32_t que representa el ID del objeto detectado:
Para las Clasificaciones de IA, esto corresponde al ID definido por el modelo de IA seleccionado.
Para los ID de AprilTag, esto representa el número de ID de AprilTag detectado (0–36).
Ejemplos
// 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 devuelve la puntuación de confianza de la Clasificación de IA detectada.
Acceso
SensorName.objects[index].score
Valores de devolución
Devuelve un int16_t que indica la puntuación de confianza de la clasificación de IA detectada entre 1 y 100.
Una puntuación más baja significa que el sensor tiene menos confianza en el objeto detectado, mientras que una puntuación más alta significa que el sensor tiene más confianza.
Ejemplos
// 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);
}
