Sensor de visión#

Introducción#

La clase vision se utiliza para controlar y acceder a los datos del sensor de visión V5. 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

index

int32_t

El puerto inteligente al que está conectado el sensor de visión, escrito como PORTx, donde x es el número de puerto (por ejemplo, PORT1).

bright

uint8_t

El nivel de brillo del sensor de visión.

sigs

vision::signature or vision::code objects

Uno o más objetos vision::signature o vision::code para registrar en el sensor.

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 V5.

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.

Available Functions

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::code object.

int32_t takeSnapshot( code &cc );

3 — Toma una instantánea y busca objetos que coincidan con la vision::signature objeto 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::code object.

int32_t takeSnapshot( code &cc, uint32_t count );

6 — Toma una instantánea y almacena solo el mayor número especificado de objetos que coinciden con la vision::signature objeto de firma.

int32_t takeSnapshot( signature &sig, uint32_t count );

Parameters

Parámetro

Tipo

Descripción

id

uint32_t

El número de identificación de la firma a buscar.

cc

code &

Una referencia a un objeto vision::code para buscar.

sig

signature &

Una referencia a una vision::signature objeto de firma para buscar.

count

uint32_t

El número máximo de objetos a detectar.

Return Values

Devuelve un int32_t que representa el número de objetos coincidentes detectados.

Notes
  • 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 V5.

Available Functions
bool installed();

Parameters

Esta función no toma ningún parámetro.

Return Values

Devuelve 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 en objects.

  • objects — Matriz de objetos detectados actualizada por takeSnapshot.

  • .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.

Syntax
VisionSensor.largestObject

Components

Componente

Descripción

VisionSensor

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.

Syntax
VisionSensor.objectCount

Components

Componente

Descripción

VisionSensor

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.

Syntax
VisionSensor.objects[index].property

Components

Componente

Descripción

VisionSensor

El nombre de su instancia del sensor de visión.

index

El índice de objeto en la matriz. El índice comienza en 0.

property

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);
}