Sensor de visão#

Introdução#

A classe vision é utilizada para controlar e aceder aos dados do sensor de visão IQ (2ª geração). Este sensor deteta e rastreia assinaturas de cores dentro do seu campo de visão, permitindo que o seu robô identifique alvos e responda a informações visuais em tempo real.

O sensor de visão pode detetar vários objetos em simultâneo e fornece informações como a posição, largura, altura e coordenadas do centro do objeto.

Construtores de Classes#

vision(
  int32_t  index,
  uint8_t  bright,
  Args&... sigs );

Destrutor de classes#

Destroys the vision object and releases associated resources.

~vision();

Parâmetros#

Parâmetro

Tipo

Descrição

index

int32_t

A porta inteligente à qual o sensor de visão está ligado é escrita como PORTx, em que x é o número da porta (por exemplo, PORT1).

bright

uint8_t

Nível de brilho do sensor de visão.

sigs

vision::signature or vision::code objects

Um ou mais objetos vision::signature ou vision::code para registar junto do sensor.

Exemplos#

// 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

Funções de membro#

A classe vision inclui as seguintes funções membro:

  • takeSnapshot — Captura os dados para uma assinatura de cor ou código de cor específico.

  • installed — Se o sensor de visão está ligado ao cérebro IQ (2. ª geração).

Para aceder aos dados do objeto detetado após a chamada takeSnapshot, utilize as Propriedades disponíveis.

Before calling any vision member functions, a vision instance must be created, as shown below:

/* 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 uma imagem do sensor de visão, processa-a com base na assinatura e atualiza a matriz de objects objeto. Este método pode também limitar a quantidade de objetos captados na imagem.

O array objects armazena os objetos ordenados do maior para o menor por largura, começando no índice 0. As propriedades de cada objeto podem ser acedidas utilizando o seu índice. Se não for detetado nenhum objeto correspondente, objectCount será 0 e objects[i].exists será falso.

Available Functions

1 — Tira uma fotografia instantânea e procura objetos que correspondam ao ID de assinatura especificado.

int32_t takeSnapshot( uint32_t id );

2 — Tira uma fotografia e procura objetos que correspondam ao objeto especificado vision::code.

int32_t takeSnapshot( code &cc );

3 — Tira uma fotografia e procura objetos que correspondam ao objeto vision::signature especificado.

int32_t takeSnapshot( signature &sig );

4 — Captura um instantâneo e armazena apenas o maior número especificado de objetos que correspondam ao ID da assinatura.

int32_t takeSnapshot( uint32_t id, uint32_t count );

5 — Tira um instantâneo e armazena apenas o maior número especificado de objetos que correspondam ao objeto vision::code especificado.

int32_t takeSnapshot( code &cc, uint32_t count );

6 — Tira um instantâneo e armazena apenas o maior número especificado de objetos que correspondam ao objeto vision::signature especificado.

int32_t takeSnapshot( signature &sig, uint32_t count );

Parameters

Parâmetro

Tipo

Descrição

id

uint32_t

O número de identificação da assinatura a pesquisar.

cc

code &

Uma referência a um objeto vision::code a pesquisar.

sig

signature &

Uma referência a um objeto vision::signature para pesquisar.

count

uint32_t

Número máximo de objetos a detetar.

Return Values

Retorna um valor do tipo int32_t int32_t que representa o número de objetos correspondentes detetados.

Notes
  • O sensor de visão precisa de tirar uma fotografia antes que os dados do objeto possam ser acedidos.

  • Quando a contagem count é especificada, apenas os maiores objetos detetados (até à quantidade especificada) são armazenados.

Exemplos

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#

Retorna se o sensor de visão está ligado ao cérebro IQ (2ª geração).

Available Functions
bool installed();

Parameters

Esta função não recebe qualquer parâmetro.

Return Values

Retorna um valor booleano indicando se o sensor de visão está ligado:

  • true — The Vision Sensor is connected.
  • false — The Vision Sensor is not connected.

Propriedades#

Chamar takeSnapshot actualiza os resultados de detecção do sensor de visão. Cada snapshot atualiza o array objects , que contém os objetos detetados para a assinatura de cor ou código de cor solicitado.

Os dados do sensor de visão são acedidos através das propriedades dos objetos armazenados em Vision1.objects[index], onde index começa em 0.

A resolução da imagem do sensor de visão é de 316 por 212 pixéis. As propriedades de posição e tamanho do objeto são reportadas em unidades de pixel em relação à vista atual do sensor.

As seguintes propriedades estão disponíveis:

  • largestObject — Seleciona o maior objeto detetado no instantâneo mais recente.

  • objectCount — Retorna o número de objetos válidos armazenados em objects.

  • objects — Matriz de objetos detetados atualizada por takeSnapshot.

  • .exists — Se a entrada do objeto contém dados válidos.

  • .width — Largura do objeto detetado em pixéis.

  • .height — Altura do objeto detetado em pixéis.

  • .centerX — Posição X do centro do objecto em pixéis.

  • .centerY — Posição Y do centro do objecto em pixéis.

  • .originX — Posição X do canto superior esquerdo do objeto em pixéis.

  • .originY — Posição Y do canto superior esquerdo do objeto em pixéis.

  • .angle — Orientação do código de cor detectado em graus (quando aplicável).

largestObject#

Recupera o maior objeto detetado da matriz de objects objeto.

Este método pode ser utilizado para obter sempre o maior objeto de entre objects sem especificar um índice.

Syntax
VisionSensor.largestObject

Components

Componente

Descrição

VisionSensor

O nome da sua instância do Sensor de Visão.

Exemplos

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#

Retorna o número de itens dentro do array de objects como um número inteiro.

Syntax
VisionSensor.objectCount

Components

Componente

Descrição

VisionSensor

O nome da sua instância do Sensor de Visão.

Exemplos

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 é um array contendo os objetos detetados da chamada mais recente para takeSnapshot.

Cada elemento da matriz representa um objeto detetado e fornece acesso às suas propriedades, tais como width, height, centerX, e mais.

Os objetos estão ordenados do maior para o mais pequeno (por largura), começando no índice 0.

Syntax
VisionSensor.objects[index].property

Components

Componente

Descrição

VisionSensor

O nome da sua instância do Sensor de Visão.

index

O índice do objeto na matriz. O índice começa em 0.

property

Uma das propriedades do objeto disponíveis.

. existe#

.exists retorna se o índice de objeto especificado contém um objeto válido detetado.

Acesso

SensorName.objects[index].exists

Valores de retorno

Retorna um valor booleano indicando se o índice do objeto especificado contém um objeto detetado válido:

  • true — A valid object exists at the specified index.
  • false — No object exists at the specified index.

Exemplos

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

.largura#

.width devolve a largura do objeto detetado.

Acesso

SensorName.objects[index].width

Valores de retorno

Retorna um número inteiro int que representa a largura do objeto detetado em pixéis. O valor varia de 1 a 316.

Exemplos

// 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 devolve a altura do objeto detetado.

Acesso

SensorName.objects[index].height

Valores de retorno

Retorna um número inteiro int que representa a altura do objeto detetado em pixéis. O valor varia de 1 a 212.

Exemplos

// 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 devolve a coordenada x do centro do objecto detectado.

Acesso

SensorName.objects[index].centerX

Valores de retorno

Retorna um número inteiro int que representa a coordenada x do centro do objeto em pixéis. O valor varia de 0 a 316.

Exemplos

// 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 devolve a coordenada y do centro do objecto detectado.

Acesso

SensorName.objects[index].centerY

Valores de retorno

Retorna um número inteiro int que representa a coordenada y do centro do objeto em pixéis. O valor varia de 0 a 212.

Exemplos

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

. origemX#

.originX devolve a coordenada x do canto superior esquerdo da caixa delimitadora do objecto detectado.

Acesso

SensorName.objects[index].originX

Valores de retorno

Retorna um número inteiro int que representa a coordenada x do canto superior esquerdo da caixa delimitadora do objeto em pixéis. O valor varia de 0 a 316.

Exemplos

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

. origemY#

.originY devolve a coordenada y do canto superior esquerdo da caixa delimitadora do objecto detectado.

Acesso

SensorName.objects[index].originY

Valores de retorno

Retorna um número inteiro int que representa a coordenada y do canto superior esquerdo da caixa delimitadora do objeto em pixéis. O valor varia de 0 a 212.

Exemplos

// 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 devolve a orientação do código de cor detectado.

Acesso

SensorName.objects[index].angle

Valores de retorno

Retorna um valor double que representa a orientação do código de cor detectado em graus. O valor varia de 0 a 359.9.

Exemplos

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