Sensor de visión#
Introducción#
La clase vision se utiliza para controlar y acceder a los datos del sensor EXP Vision. Este sensor detecta y rastrea firmas de color dentro de su campo de visión, lo que permite que su robot identifique objetivos y responda a la información visual en tiempo real.
El sensor de visión puede detectar múltiples objetos distintivos simultáneamente y proporciona información como la posición del objeto, el ancho, la altura y las coordenadas del centro.
Constructores de clase#
vision(
int32_t index,
uint8_t bright,
Args&... sigs );
Destructor de clase#
Destruye el objeto vision y libera los recursos asociados.
~vision();
Parámetros#
Parámetro |
Tipo |
Descripción |
|---|---|---|
|
|
El puerto inteligente al que está conectado el sensor de visión, escrito como |
|
|
El nivel de brillo del sensor de visión. |
|
|
Uno o más objetos |
Ejemplos#
// 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
Funciones de los miembros#
La clase vision incluye las siguientes funciones miembro:
takeSnapshot: captura datos para una firma de color o código de color específico.installed— Si el sensor de visión 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 vision miembro de vision instancia de Vision, como se muestra a continuación:
/* 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#
Captura una imagen del sensor de visión, la procesa según la firma y actualiza la matriz de objects elemento. Este método también permite limitar la cantidad de objetos capturados en la instantánea.
El array objects almacena objetos ordenados de mayor a menor por ancho, comenzando en el índice 0. Se puede acceder a las propiedades de cada objeto usando su índice. Si no se detectan objetos coincidentes, objectCount será 0 y objects[i].exists será falso.
1 — Toma una instantánea y busca objetos que coincidan con el ID de firma especificado.
int32_t takeSnapshot( uint32_t id );
2 — Toma una instantánea y busca objetos que coincidan con la
vision::codeobject.int32_t takeSnapshot( code &cc );
3 — Toma una instantánea y busca objetos que coincidan con la
vision::signatureobjeto de firma.int32_t takeSnapshot( signature &sig );
4 — Toma una instantánea y almacena solo el mayor número especificado de objetos que coincidan con el ID de la firma.
int32_t takeSnapshot( uint32_t id, uint32_t count );
5 — Toma una instantánea y almacena solo el mayor número especificado de objetos que coinciden con la
vision::codeobject.int32_t takeSnapshot( code &cc, uint32_t count );
Parameters6 — Toma una instantánea y almacena solo el mayor número especificado de objetos que coinciden con la
vision::signatureobjeto de firma.int32_t takeSnapshot( signature &sig, uint32_t count );
Parámetro |
Tipo |
Descripción |
|---|---|---|
|
|
El número de identificación de la firma a buscar. |
|
|
Una referencia a un objeto |
|
|
Una referencia a una |
|
|
El número máximo de objetos a detectar. |
Devuelve un int32_t que representa el número de objetos coincidentes detectados.
El sensor de visión debe tomar una instantánea antes de poder acceder a los datos del objeto.
Cuando se especifica
count, solo se almacenan los objetos detectados de mayor tamaño (hasta la cantidad especificada).
Ejemplos
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#
Devuelve si el sensor de visión está conectado al cerebro EXP.
Available Functionsbool installed();
Esta función no toma ningún parámetro.
Return ValuesDevuelve un booleano que indica si el sensor de visión está conectado:
-
true— The Vision Sensor is connected. -
false— The Vision Sensor is not connected.
Propiedades#
Calling takeSnapshot updates the Vision Sensor’s detection results. Each snapshot refreshes the objects array, which contains the detected objects for the requested Color Signature or Color Code.
Se accede a los datos del sensor de visión a través de las propiedades de los Vision1.objects[index], donde el index comienza en 0.
La resolución de la imagen del sensor de visión es de 316 por 212 píxeles. Las propiedades 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:
largestObject— Selecciona el objeto detectado más grande de la instantánea más reciente.objectCount— Devuelve el número de objetos válidos almacenados enobjects.objects— Matriz de 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 del Código de Color detectado en grados (cuando corresponda).
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.
VisionSensor.largestObject
Componente |
Descripción |
|---|---|
|
El nombre de su instancia del sensor de visión. |
Ejemplos
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#
Devuelve el número de elementos dentro del array de objects como un número entero.
VisionSensor.objectCount
Componente |
Descripción |
|---|---|
|
El nombre de su instancia del sensor de visión. |
Ejemplos
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 es una matriz que contiene los objetos detectados de la llamada más reciente a takeSnapshot.
Cada elemento de la matriz representa un objeto detectado y proporciona acceso a sus propiedades, como width, height, centerX, y más.
Los objetos se ordenan de mayor a menor (por ancho), comenzando en el índice 0.
VisionSensor.objects[index].property
Componente |
Descripción |
|---|---|
|
El nombre de su instancia del sensor de visión. |
|
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
// 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);
}
.width#
.width devuelve el ancho del objeto detectado.
Acceso
SensorName.objects[index].width
Valores de devolución
Devuelve un int que representa el ancho del objeto detectado en píxeles. El valor varía de 1 a 316.
Ejemplos
// 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);
}
.height#
.height devuelve la altura del objeto detectado.
Acceso
SensorName.objects[index].height
Valores de devolución
Devuelve un int que representa la altura del objeto detectado en píxeles. El valor varía de 1 a 212.
Ejemplos
// 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 devuelve la coordenada x del centro del objeto detectado.
Acceso
SensorName.objects[index].centerX
Valores de devolución
Devuelve un int que representa la coordenada x del centro del objeto en píxeles. El valor varía de 0 a 316.
Ejemplos
// 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 devuelve la coordenada y del centro del objeto detectado.
Acceso
SensorName.objects[index].centerY
Valores de devolución
Devuelve una int que representa la coordenada y del centro del objeto en píxeles. El valor varía de 0 a 212.
Ejemplos
// 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 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 una int que representa la coordenada x de la esquina superior izquierda del cuadro delimitador del objeto en píxeles. El valor varía de 0 a 316.
Ejemplos
// 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 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 una int que representa la coordenada y de la esquina superior izquierda del cuadro delimitador del objeto en píxeles. El valor varía de 0 a 212.
Ejemplos
// 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 devuelve la orientación del código de color detectado.
Acceso
SensorName.objects[index].angle
Valores de devolución
Devuelve un double que representa la orientación del código de color detectado 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) {
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);
}