Sensor de visión#
Introducción#
El sensor de visión permite a los robots detectar y rastrear información visual de su entorno. Al identificar colores y patrones, el sensor de visión permite a los robots analizar su entorno y responder a lo que ven.
For the examples below, the configured AI Vision Sensor will be named Vision1
, and the configured Color Signature objects, such as BLUEBOX
, will be used in all subsequent examples throughout this API documentation when referring to vision
class methods.
A continuación se muestra una lista de todos los métodos:
Conseguidores
takeSnapshot – Captura datos para una firma de color o un código de color específico.
instalado – Si el sensor de visión está conectado al cerebro IQ (2.ª generación).
Propiedades: datos del objeto devueltos desde takeSnapshot.
largestObject – Selecciona inmediatamente el objeto más grande de la instantánea.
objectCount – Devuelve la cantidad de objetos detectados como un entero.
objects – Devuelve una matriz que contiene las propiedades de los objetos detectados.
.exists – Si el objeto existe en la detección actual como un valor booleano.
.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 en grados.
Constructores: inicializan y configuran manualmente los sensores.
visión – Crea un sensor de visión.
vision::signature – Crea una firma de color.
vision::code – Crea un código de color.
takeSnapshot#
takeSnapshot
captures an image from the Vision Sensor, processes it based on the signature, and updates the objects
array. This method can also limit the amount of objects captured in the snapshot.
Las Firmas de color y los Códigos de color deben configurarse primero en Vision Utility antes de poder usarse con este método.
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. objects
is an empty array if no matching objects are detected.
Default Usage:
Vision1.takeSnapshot(signature)
Overload Usages:
Vision1.takeSnapshot(signature, count)
Parámetros |
Descripción |
---|---|
|
What signature to get data of. The name of the AI Vision Sensor, two underscores, and then the Color Signature’s or Color Code’s name. For example: |
|
Optional. The number of objects to return as a |
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
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);
}
}
Firmas de color#
Una firma de color es un color único que el sensor de visión puede reconocer. Estas firmas permiten al sensor detectar y rastrear objetos según su color. Una vez configurada una firma de color, el sensor puede identificar objetos con ese color específico en su campo de visión. Las firmas de color se utilizan con takeSnapshot para procesar y detectar objetos de color en tiempo real.
To use a configured Color Signature in a project, its name must be passed as a string in the format: the Vision Sensor’s name, followed by two underscores, and then the Color Signature’s name. For example: vision_1__BLUEBOX
.
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
// 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);
}
}
Códigos de color#
Un código de color es un patrón estructurado compuesto por firmas de color dispuestas en un orden específico. Estos códigos permiten al sensor de visión reconocer patrones de color predefinidos. Los códigos de color son útiles para identificar objetos complejos o crear marcadores únicos para la navegación autónoma.
To use a configured Color Code in a project, its name must be passed as a string in the format: the Vision Sensor’s name, followed by two underscores, and then the Color Code’s name. For example: vision_1__BOXCODE
.
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
// 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!");
}
}
}
Propiedades#
There are eight properties that are included with each object stored in the objects
array after takeSnapshot
is used.
Some property values are based off of the detected object’s position in the Vision Sensor’s view at the time that takeSnapshot
was used. The Vision Sensor has a resolution of 316 by 212 pixels.
largestObject#
largestObject
retrieves the largest detected object from the objects
array.
This method can be used to always get the largest object from objects
without specifying an index.
Default Usage:
Vision1.largestObject
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#
objectCount
returns the number of items inside the objects
array as an integer.
Default Usage:
Vision1.objectCount
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);
}
}
installed#
installed
returns an integer indicating whether the Vision Sensor is currently connected to the IQ (2nd gen) Brain.
1
– The Vision Sensor is connected to the IQ (2nd gen) Brain.0
– The Vision Sensor is not connected to the IQ (2nd gen) Brain.
Parámetros |
Descripción |
---|---|
Este método no tiene parámetros. |
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
// Display a message if the Vision Sensor is connected
if (Vision1.installed()) {
Brain.Screen.print("Connected");
}
}
objects#
objects
returns an array of detected object properties. Use the array to access specific property values of individual objects.
Default Usage:
Vision1.objects
.existe#
.exists
returns an integer indicating if the index exists in the objects
array or not.
1
: The index exists.0
: The index does not exist.
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
// 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);
}
}
.ancho#
.width
returns the width of the detected object in pixels, which is an integer between 1 and 316.
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
// 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);
}
}
.altura#
.height
returns the height of the detected object in pixels, which is an integer between 1 and 212.
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
// 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
}
}
.centroX#
.centerX
returns the x-coordinate of the detected object’s center in pixels, which is an integer between 0 and 316.
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
// 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
returns the y-coordinate of the detected object’s center in pixels, which is an integer between 0 and 212.
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
// 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);
}
}
.origenX#
.originX
returns the x-coordinate of the top-left corner of the detected object’s bounding box in pixels, which is an integer between 0 and 316.
#include "vex.h"
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
// 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); // Short delay to reduce flicker
}
}
.origenY#
.originY
returns the y-coordinate of the top-left corner of the detected object’s bounding box in pixels, which is an integer between 0 and 212.
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
// 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);
}
}
.ángulo#
.angle
returns the orientation of the detected object in degrees, which is a double between 0 and 316.
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
// Turn left or right depending on how a configured
// Color Code is rotated
while (true) {
Vision1.takeSnapshot(Vision1__BOXCODE);
if (Vision1.objects[0].exists) {
int 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);
}
}
Constructores#
Constructors are used to manually create vision
, signature
, and code
objects, which are necessary for configuring the sensors outside of VEXcode. If fewer arguments are provided, default arguments or function overloading should be used in the constructor definition.
Vision Sensor#
vision
creates a Vision Sensor.
Default Usage:
vision( int32_t index, uint8_t bright, Args &… sigs )
Parámetros |
Descripción |
---|---|
|
Un Puerto inteligente válido al que está conectado el sensor de visión. |
|
El valor de brillo del sensor de visión, de 10 a 150. |
|
El nombre de uno o más objetos Firma de color o Código de color creados previamente. |
vision::signature Vision1__BLUEBOX = vision::signature (1, 10121, 10757, 10439, -1657, -1223, -1440, 2.5, 1);
vision Vision1 = vision(PORT1, 50, Vision1__BLUEBOX);
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
// Display the CenterX coordinate of a blue object
while (true) {
Vision1.takeSnapshot(Vision1__BLUEBOX);
Brain.Screen.clearScreen();
Brain.Screen.setCursor(1, 1);
if (Vision1.objects[0].exists) {
Brain.Screen.print("Center X: %d", Vision1.largestObject.centerX);
} else {
Brain.Screen.print("no object");
}
wait(0.5, seconds);
}
}
Color Signature#
signature
creates a Color Signature. Up to seven different Color Signatures can be stored on a Vision Sensor at once.
Default Usage:
signature(index, uMin, uMax, uMean, vMin, vMax, vMean, rgb, type)
Parámetro |
Descripción |
---|---|
|
The |
|
The value from |
|
The value from |
|
The value from |
|
The value from |
|
The value from |
|
The value from |
|
The value from |
|
The value from |
Para obtener los valores necesarios para crear una Firma de Color, acceda a la Utilidad de Visión. Una vez configurada la Firma de Color, copie los valores de los parámetros desde la ventana de Configuración.
vision::signature Vision1__BLUEBOX = vision::signature (2, -4479, -3277, -3878,5869, 7509, 6689,2.5, 1);
vision Vision1 = vision (PORT1, 50, Vision1__BLUEBOX);
while (true) {
// Display the CenterX coordinate of a blue object
Vision1.takeSnapshot(Vision1__BLUEBOX);
Brain.Screen.clearScreen();
Brain.Screen.setCursor(1, 1);
if (Vision1.objects[0].exists) {
Brain.Screen.print("Center X: %d", Vision1.largestObject.centerX);
} else {
Brain.Screen.print("no object");
}
wait(0.5, seconds);
}
Color Code#
Code
creates a Color Code. It requires at least two already defined Color Signatures in order to be used. Up to eight different Color Codes can be stored on a Vision Sensor at once.
Default Usage:
code(sig1, sig2)
Sobrecargas:
code(sig1, sig2, sig3)
code(sig1, sig2, sig3, sig4)
code(sig1, sig2, sig3, sig4, sig5)
Parámetros |
Descripción |
---|---|
|
A previously created |
|
A previously created |
|
A previously created |
|
A previously created |
|
A previously created |
vision::signature Vision1__REDBOX = vision::signature(1, 10121, 10757, 10439, -1657, -1223, -1440, 2.5, 1);
vision::signature Vision1__BLUEBOX = vision::signature(2, -4479, -3277, -3878, 5869, 7509, 6689, 2.5, 1);
vision::code Vision1__boxCode = vision::code(Vision1__REDBOX, Vision1__BLUEBOX);
vision Vision1 = vision(PORT1, 50, Vision1__REDBOX, Vision1__BLUEBOX);
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
// Turn right or left depending on how the
// configured box code is rotated
while (true) {
Vision1.takeSnapshot(Vision1__BOXCODE);
if (Vision1.objects[0].exists) {
int angle = Vision1.objects[0].angle;
if (angle > 70 && angle < 110) {
Drivetrain.turnFor(right, 45, degrees);
}
else if (angle > 250 && angle < 290) {
Drivetrain.turnFor(left, 45, degrees);
}
else {
Drivetrain.stop();
}
}
wait(0.5, seconds);
}
}