Sensor de visão de IA#

Introdução#

A classe aivision é utilizada para controlar e aceder aos dados do Sensor de Visão com IA V5. O Sensor de Visão com IA pode detetar:

  • Classificações de IA (como objetos de jogos)

  • IDs de etiqueta de abril

  • Assinaturas de cores personalizadas

  • Códigos de cores personalizados

Fornece dados do objeto, incluindo posição, tamanho, orientação, ID de classificação e pontuação de confiança.

O sensor processa informações visuais utilizando um modelo de IA integrado selecionado no Utilitário de Visão de IA dentro do VEXcode. O modelo selecionado determina quais as Classificações de IA que o sensor pode detetar. Ao utilizar o VS Code, o modelo de IA deve ser primeiro configurado no VEXcode antes de poder ser utilizado no seu programa. Os objectos detectados são devolvidos através da matriz objects após a chamada de takeSnapshot.

Construtores de Classes#

aivision(
  int32_t index,
  Args&... sigs );

Parâmetros#

Parâmetro

Tipo

Descrição

index

int32_t

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

sigs

colordesc, codedesc, or AI constants

Um ou mais tipos de deteção para registar com o sensor:

  • aivision::ALL_AIOBJS — Todas as Classificações de IA
  • aivision::ALL_TAGS — Todos os IDs do AprilTag
  • aivision::colordesc — Assinatura de Cor Personalizada
  • aivision::codedesc — Código de Cor Personalizado

Modelos e Classificações de IA#

O sensor de visão com IA pode detetar diferentes objetos com determinadas classificações de IA. Dependendo do modelo de classificação de IA selecionado ao configurar o sensor de visão com IA na janela Dispositivos, podem ser detetados diferentes objetos. Os modelos atualmente disponíveis são:

Elementos de Sala de Aula

Número de identificação

Classificação por IA

0

blueBall

1

greenBall

2

redBall

3

blueRing

4

greenRing

5

redRing

6

blueCube

7

greenCube

8

redCube

Competição de Robótica VEX V5: Grandes Apostas

Número de identificação

Classificação por IA

0

mobileGoal

1

redRing

2

blueRing

Contra-ataque à Competição de Robótica VEX V5

Número de identificação

Classificação por IA

0

blueBlock

1

redBlock

VEX V5 Robotics Competition Override

Número de identificação

Classificação por IA

0

redBluePin

1

blueYellowPin

2

redYellowPin

3

yellowPin

4

cup

Exemplos#

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

Funções de membro#

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

  • takeSnapshot — Captura dados para uma assinatura de cor, código de cor, grupo de classificação de IA ou grupo de ID AprilTag específico.

  • installed — Retorna se o sensor de visão de IA está ligado ao V5 Brain.

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

Antes de chamar qualquer função membro de aivision , deve ser criada uma instância aivision , como se mostra abaixo:

/* 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 uma imagem do sensor de visão de IA, processa-a utilizando o modelo de IA selecionado ou as assinaturas de cor configuradas e atualiza a matriz de objects objeto.

Each call refreshes the objects array with the most recent detection results. Objects are ordered from largest to smallest (by width), beginning at index 0. If no objects are detected objectCount will be 0 and objects[i].exists will be false.

1 — Captura um instantâneo utilizando um ID de objeto e um tipo de objeto.

int32_t takeSnapshot(
  uint32_t id,
  objectType type,
  uint32_t count );

2 — Tira uma fotografia utilizando uma Assinatura de Cor.

int32_t takeSnapshot(
  const colordesc &desc,
  int32_t count = 8 );

3 — Tira uma fotografia utilizando um Código de Cor.

int32_t takeSnapshot(
  const codedesc &desc,
  int32_t count = 8 );

4 — Tira uma fotografia utilizando um ID AprilTag.

int32_t takeSnapshot(
  const tagdesc &desc,
  int32_t count = 8 );

5 — Tira uma fotografia utilizando uma Classificação de IA.

int32_t takeSnapshot(
  const aiobjdesc &desc,
  int32_t count = 8 );

6 — Tira uma fotografia instantânea utilizando um descritor de objeto.

int32_t takeSnapshot(
  const objdesc &desc,
  int32_t count = 8 );

Parameters

Parâmetro

Tipo

Descrição

id

uint32_t

O identificador do objeto a detetar quando se utiliza a função (id, type, count) O significado depende do tipo type:

  • colorObject — Índice do Descritor de Cor (1–7)
  • codeObject — Índice do Código de Cor (1–8)
  • modelObject — ID da Classificação de IA
  • tagObject — ID da Etiqueta de Abril (0–36)

Nota: No VEXcode, os nomes de Classificação de IA (como blueBall) podem ser utilizados ​​diretamente. No VS Code, deve ser utilizado o ID numérico.

type

objectType

Especifica a categoria de objeto associada ao id id:

  • objectType::tagObject — Deteta IDs AprilTag
  • objectType::colorObject — Deteta Assinaturas de Cor
  • objectType::codeObject — Deteta Códigos de Cor
  • objectType::modelObject — Deteta Classificações de IA
  • objectType::allObject — Deteta tudo o que o sensor consegue reconhecer

desc

colordesc &, codedesc &, tagdesc &, aiobjdesc &, or objdesc &

Descritor utilizado para detetar um objeto específico. Passado directamente para takeSnapshot, por exemplo:

  • AIVision1.takeSnapshot(AIVision1__greenBox);
  • AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
Constantes descritoras predefinidas:
  • aivision::ALL_TAGS — Detecta todos os IDs AprilTag
  • aivision::ALL_COLORS — Detecta todas as Assinaturas de Cor configuradas
  • aivision::ALL_CODES — Detecta todos os Códigos de Cor configurados
  • aivision::ALL_AIOBJS — Detecta todas as Classificações de IA
  • aivision::ALL_OBJECTS — Detecta tudo o que o sensor consegue reconhecer

count

uint32_t / int32_t

Número máximo de objetos armazenados a partir do instantâneo. O padrão é 8.

Valores de retorno

Retorna um valor do tipo int32_t int32_t que representa o número de objectos detectados que correspondem à assinatura ou ao tipo de detecção especificado.

Notas

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

  • O array de objects objeto é atualizado a cada chamada.

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

As classificações de IA dependem do modelo selecionado no utilitário de visão de IA do VEXcode.

Exemplos

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

Retorna se o sensor de visão de IA está ligado ao V5 Brain.

Funções disponíveis

bool installed();

Parâmetros

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

Valores de retorno

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

  • true — O sensor de visão de IA está ligado.

  • false — O sensor de visão de IA não está ligado.

// Display a message if the AI Vision Sensor is connected
if (AIVision1.installed()){
  Brain.Screen.print("Installed!");
}

Propriedades#

Chamar takeSnapshot atualiza os resultados de deteção do sensor de visão de IA. Cada snapshot atualiza a matriz objects , que contém objetos detetados para a classificação de IA solicitada, assinatura de cor, código de cor ou ID AprilTag.

Os dados de Visão de IA são acedidos através das propriedades dos objetos armazenados em AIVisionSensor.objects[index], onde index começa em 0.

Os objetos estão ordenados do maior para o mais pequeno (por área).

A resolução da imagem do sensor de visão de IA é × 240. Os valores de posição e tamanho do objeto são reportados em unidades de pixel em relação à vista atual do sensor.

As seguintes propriedades estão disponíveis:

  • objectCount — Retorna o número de objetos detetados do snapshot mais recente.

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

  • objects — Matriz contendo 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 de um código de cor ou ID AprilTag em graus.

  • .id — ID de classificação ou ID AprilTag.

  • .score — Pontuação de confiança para as classificações de IA.

objectCount#

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

Syntax
AIVisionSensor.objectCount

Components

Componente

Descrição

AIVisionSensor

O nome da sua instância do sensor de visão com IA.

Exemplos

// 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 o maior objeto detetado do array objects.

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

Syntax
AIVisionSensor.largestObject

Components

Componente

Descrição

AIVisionSensor

O nome da sua instância do sensor de visão com IA.

Exemplos

// 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 devolve uma matriz de propriedades dos objetos detetados. Utilize a matriz para aceder a valores propriedade específicos de objetos individuais.

Existem dez propriedades que são incluídas em cada objeto armazenado na matriz objects após takeSnapshot ser utilizado.

Todos os valores de propriedade, exceto id e score descrevem a posição e o tamanho do objeto detetado no campo de visão do sensor de visão com IA no momento em que foi utilizado takeSnapshot . Estes valores são medidos em pixéis, com base na resolução de 320 por 240 pixéis do sensor.

Syntax
AIVisionSensor.objects[index].property

Components

Componente

Descrição

AIVisionSensor

O nome da sua instância do sensor de visão com IA.

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

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

.largura#

.width devolve a largura do objeto detetado.

Acesso

SensorName.objects[index].width

Valores de retorno

Retorna um int16_t que representa a largura do objeto detetado em pixéis. O valor varia de 1 a 320.

Exemplos

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

.altura#

.height devolve a altura do objeto detetado.

Acesso

SensorName.objects[index].height

Valores de retorno

Retorna um int16_t que representa a altura do objeto detetado em pixéis. O valor varia de 1 a 240.

Exemplos

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

Acesso

SensorName.objects[index].centerX

Valores de retorno

Retorna um int16_t que representa a coordenada x do centro do objeto em pixéis. O valor varia de 0 a 320.

Exemplos

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

Acesso

SensorName.objects[index].centerY

Valores de retorno

Retorna um int16_t que representa a coordenada y do centro do objeto em pixéis. O valor varia de 0 a 240.

Exemplos

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

.ângulo#

.angle devolve a orientação do código de cor detectado ou do ID AprilTag.

Acesso

SensorName.objects[index].angle

Valores de retorno

Retorna um float float que representa a rotação do código de cor detectado ou do ID AprilTag 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) {
  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);
}

. 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 int16_t que representa a coordenada x da origem da caixa delimitadora do objeto em pixéis. O valor varia de 0 a 320.

Exemplos

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

. 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 int16_t que representa a coordenada y da origem da caixa delimitadora do objeto em pixéis. O valor varia de 0 a 240.

Exemplos

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

. ia#

.id devolve o ID AprilTag detectado ou o ID de classificação de IA.

Acesso

SensorName.objects[index].id

Valores de retorno

Retorna um valor int32_t que representa o ID do objeto detetado:

Exemplos

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

.pontuação#

.score devolve a pontuação de confiança da classificação de IA detectada.

Acesso

SensorName.objects[index].score

Valores de retorno

Retorna um valor int16_t indicando a pontuação de confiança da classificação de IA detetada, entre 1 e 100.

Uma pontuação mais baixa significa que o sensor tem menos confiança no objeto detetado, enquanto uma pontuação mais elevada significa que o sensor tem mais confiança.

Exemplos

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