Visão de IA#

Introdução#

O sensor de visão com IA consegue detetar e rastrear objetos, cores e IDs do AprilTag. Isto permite que o robô analise o ambiente à sua volta, siga objetos e reaja com base nos dados visuais detetados.

Esta página utiliza ai_vision_1, RED_BOXe BOX_CODE como exemplos de nomes para o Sensor de Visão de IA, Assinatura de Cor e Código de Cor, respectivamente. Substitua-os pelos nomes que configurou, conforme necessário.

Segue-se uma lista de todos os métodos:

Getters – Obtêm dados do sensor de visão de IA.

  • take_snapshot – Captura dados para uma assinatura específica.

  • installed – Se o sensor de visão de IA está ligado ao cérebro V5.

Propriedades – Dados do objeto devolvidos de take_snapshot.

  • .exists – Se o objeto existe na deteção atual.

  • .width – Largura do objecto detectado.

  • .height – Altura do objecto detectado.

  • .centerX – Posição X do centro do objecto.

  • .centerY – Posição Y do centro do objecto.

  • .angle – Orientação do código de cores.

  • .originX – Posição X do canto superior esquerdo do objeto.

  • .originY – Posição Y do canto superior esquerdo do objeto.

  • .id – Classificação ou ID da etiqueta do objeto.

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

Construtores – Inicializa e configura manualmente o sensor de visão de IA e as suas assinaturas.

  • AiVision – Cria um sensor de visão de IA.

  • Colordesc – Cria uma assinatura de cor.

  • Codedesc – Cria um código de cores.

  • Tagdesc – Cria um ID AprilTag.

Getters#

take_snapshot#

take_snapshot filtra os dados do quadro do sensor de visão de IA para uma única assinatura — uma descrição guardada de algo que o sensor pode reconhecer, como um objeto pré-treinado, um ID AprilTag ou uma assinatura de cor ou código de cor configurado — e devolve uma tupla.

As Assinaturas de cor e os Códigos de cor devem ser configurados primeiro no Vision Utility antes de poderem ser utilizados com este método.

A tupla 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. Uma tupla vazia é devolvida se nenhum objeto correspondente for detetado.

Usage:
ai_vision_1.take_snapshot(SIGNATURE)

Parâmetros

Descrição

SIGNATURE

Filtra o conjunto de dados para incluir apenas os dados da assinatura fornecida. As assinaturas disponíveis são:

  • Assinaturas de Cor ou Códigos de Cor - O nome do Sensor de Visão de IA, dois sublinhados e, em seguida, o nome da Assinatura de Cor ou do Código de Cor. Por exemplo: ai_vision_1__RED_BOX.
  • AiVision.ALL_AIOBJS - Cubos, anéis e bolas.
  • AiVision.ALL_TAGS - Todos os IDs do AprilTag.

count

Opcional. Define o número máximo de objetos que podem ser devolvidos, de 1 a 24. O predefinido é 8.

# Drive forward if an object is detected
while True:
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)
    if objects[0].exists:
        drivetrain.drive_for(FORWARD, 50, MM)
    wait(50, MSEC)

Nota: A tupla devolvida pode ser ordenada por qualquer propriedade, e não apenas pela largura, utilizando a função sorted do Python. Por exemplo, ordenando pelo ID da etiqueta de abril:

# Print each detected AprilTag ID in ascending order by ID
while True:
    apriltags = sorted(ai_vision_1.take_snapshot(AiVision.ALL_TAGS), key=id)
    for tag in apriltags:
        print(tag.id)
    wait(1, SECONDS)

Ou, em vez disso, ordenar por altura:

# Print each detected AprilTag ID in ascending order by height
while True:
    apriltags_by_height = sorted(ai_vision_1.take_snapshot(AiVision.ALL_TAGS), key=lambda tag: tag.height)
    for tag in apriltags_by_height:
        print(tag.height)
    wait(1, SECONDS)

Classificações de IA#

O sensor de visão com IA pode detetar diferentes objetos sob 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, serão 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

BLUE_BALL

1

GREEN_BALL

2

RED_BALL

3

BLUE_RING

4

GREEN_RING

5

RED_RING

6

BLUE_CUBE

7

GREEN_CUBE

8

RED_CUBE

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

Número de identificação

Classificação por IA

0

MOBILE_GOAL

1

RED_RING

2

BLUE_RING

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

Número de identificação

Classificação por IA

0

BLUE_BLOCK

1

RED_BLOCK

VEX V5 Robotics Competition Override

Número de identificação

Classificação por IA

0

RED_BLUE_PIN

1

BLUE_YELLOW_PIN

2

RED_YELLOW_PIN

3

YELLOW_PIN

4

CUP

Assinaturas de cores#

Uma assinatura de cor é uma cor única que o sensor de visão de IA pode reconhecer. Estas assinaturas permitem que o sensor de visão de IA detete e rastreie objetos com base na sua cor. Uma vez configurada uma assinatura de cor, o sensor pode identificar objetos com essa cor específica no seu campo de visão. As assinaturas de cor são utilizadas com take_snapshot para processar e detetar objetos coloridos em tempo real.

Para utilizar uma assinatura de cor configurada num projeto, o seu nome deve ser o nome do sensor, dois sublinhados e, em seguida, o nome da assinatura de cor. Por exemplo: ai_vision_1__RED_BOX.

# Display if any objects match the RED_BOX signature
while True:
    brain.screen.set_cursor(1, 1)
    brain.screen.clear_row(1)
    # Change to any configured Color Signature
    red_box = ai_vision_1.take_snapshot(ai_vision_1__RED_BOX)
    if red_box[0].exists:
        brain.screen.print("Color detected!")
        wait(100, MSEC)

Códigos de cores#

Um código de cores é um padrão estruturado composto por assinaturas de cores organizadas numa ordem específica. Estes códigos permitem que o sensor de visão com inteligência artificial reconheça padrões de cor predefinidos. Os códigos de cores são úteis para identificar objetos complexos ou criar marcadores únicos para navegação autónoma.

Para utilizar um código de cor configurado num projeto, o seu nome deve ser o nome do sensor, dois sublinhados e, em seguida, o nome do código de cor. Por exemplo: ai_vision_1__BOX_CODE.

# Display if any objects match the BOX_CODE code
while True:
    brain.screen.set_cursor(1, 1)
    brain.screen.clear_row(1)
    # Change to any configured Color Code
    box_code = ai_vision_1.take_snapshot(ai_vision_1__BOX_CODE)
    if box_code[0].exists:
        brain.screen.print("Code detected!")
        wait(100, MSEC)

installed#

installed devolve um valor booleano indicando se o sensor de visão de IA está atualmente ligado ao V5 Brain.

  • True – O sensor de visão de IA está ligado ao cérebro V5.

  • False – O sensor de visão da IA ​​não está ligado ao cérebro V5.

Usage:
ai_vision_1.installed()

Parâmetros

Descrição

Este método não tem parâmetros.

# Display a message if the AI Vision Sensor is connected
if ai_vision_1.installed():
    brain.screen.print("Installed!")

Propriedades#

Existem dez propriedades que são incluídas em cada objeto armazenado numa tupla após take_snapshot 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 de IA no momento em que foi utilizado take_snapshot . Estes valores são medidos em pixéis, com base na resolução de 320 por 240 pixéis do sensor.

.exists#

.exists devolve um valor booleano indicando se o índice existe na tupla ou não.

  • True – O índice existe.

  • False – O índice não existe.

# Check if at least two objects are detected
while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1, 1)
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if objects[1].exists:
            brain.screen.print("At least 2")

        else:
            brain.screen.print("Less than 2")
    wait(50, MSEC)

.width#

.width devolve a largura do objeto detetado em pixéis, que é um número inteiro entre 1 e 320.

# Approach an object until it's at least 100 pixels wide
while True:
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if objects[0].width < 100:
            drivetrain.drive(FORWARD)
    else:
        drivetrain.stop()
    wait(50, MSEC)

.height#

.height devolve a altura do objeto detetado em pixéis, que é um número inteiro entre 1 e 240.

# Approach an object until it's at least 90 pixels tall
while True:
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if objects[0].height < 90:
            drivetrain.drive(FORWARD)
    else:
        drivetrain.stop()
    wait(50, MSEC)

.centerX#

.centerX devolve a coordenada x do centro do objecto detectado em pixéis, que é um número inteiro entre 0 e 320.

# Turn until an object is directly in front of the sensor
drivetrain.set_turn_velocity(10, PERCENT)
drivetrain.turn(RIGHT)

while True:
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if 140 < objects[0].centerX < 180:
            drivetrain.stop()
    wait(10,MSEC)

.centerY#

.centerY devolve a coordenada y do centro do objecto detectado em pixéis, que é um número inteiro entre 0 e 240.

# Approach an object until the object's center is
# high enough in the field of view
while True:
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if objects[0].centerY < 150:
            drivetrain.drive(FORWARD)
    else:
        drivetrain.stop()
    wait(50, MSEC)

.angle#

.angle devolve a orientação do código de cor ou ID do AprilTag detectado em graus, que é um número inteiro entre 0 e 359.

# Turn left or right depending on how a
# configured Color Code is rotated
while True:
    box_code = ai_vision_1.take_snapshot(ai_vision_1__BOX_CODE)

    if box_code[0].exists:
        if 50 < box_code[0].angle < 100:
            drivetrain.turn(RIGHT)

        elif 270 < box_code[0].angle < 330:
            drivetrain.turn(LEFT)

        else:
            drivetrain.stop()
    else:
        drivetrain.stop()
    wait(50, MSEC)

.originX#

.originX devolve a coordenada x do canto superior esquerdo da caixa delimitadora do objeto detetado em pixéis, que é um número inteiro entre 0 e 320.

# Display if an object is to the left or the right
while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1,1)

    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if 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)

.originY#

.originY devolve a coordenada y do canto superior esquerdo da caixa delimitadora do objeto detetado em pixéis, que é um número inteiro entre 0 e 240.

# Display if an object is close or far
while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1,1)

    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)

    if objects[0].exists:
        if objects[0].originY < 110:
            brain.screen.print("Close")
        else:
            brain.screen.print("Far")

.id#

.id devolve o ID da classificação de IA detectada ou o ID do AprilTag como um número inteiro.

Para um ID AprilTag, a propriedade .id representa o número do ID AprilTag detetado no intervalo de 0 a 36. Para uma Classificação de IA, a propriedade .id corresponde ao ID predefinido na secção Classificações de IA.

# Move forward when AprilTag ID 1 is detected
while True:
    apriltags = ai_vision_1.take_snapshot(AiVision.ALL_TAGS)

    if apriltags[0].exists:
        if apriltags[0].id == 1:
            robot.drive(FORWARD)
    else:
        drivetrain.stop()

    wait(50, MSEC)

.score#

.score devolve a pontuação de confiança da classificação de IA detectada como um número inteiro 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.

Construtores#

Os construtores são utilizados para criar manualmente AiVision, Colordesce Codedesc , que são necessários para configurar o sensor AI Vision fora do VEXcode.

AiVision#

AiVision cria um sensor de visão com IA.

Utilização

Vision(smartport, sigs)

Parâmetros

Descrição

smartport

A porta inteligente à qual o sensor de visão de IA está ligado é representada como Ports.PORTx , onde x é o número da porta.

sigs

Opcional. O nome de uma ou mais assinaturas, separadas por vírgulas (,):

# Create the Color Signatures
RED_BOX = Colordesc(1, 255, 0, 0, 20, 0.9)
BLUE_BOX = Colordesc(0, 26, 255, 0, 20, 0.9)

# Create the Color Code
RED_BLUE = Codedesc(RED_BOX, BLUE_BOX)

"""
Create an AI Vision Sensor with the following signatures:
- RED_BLUE
- AiVision.ALL_TAGS - for AprilTag IDs
"""
ai_vision_1 = AiVision(Ports.PORT1, RED_BLUE, AiVision.ALL_TAGS)

Colordesc#

Colordesc cria uma assinatura de cor. Até sete assinaturas de cor diferentes podem ser armazenadas simultaneamente num sensor de visão com IA.

Usage:
Colordesc(index, red, green, blue, hangle, hdsat)

Parâmetro

Descrição

index

O índice do objeto Colordesc , de 1 a 7.
Nota: A criação de dois objetos Colordesc com o mesmo número de índice fará com que o segundo objeto criado substitua o primeiro.

red

O valor de vermelho da cor varia de 0 a 255.

green

O valor de verde da cor varia de 0 a 255.

blue

O valor de azul da cor varia de 0 a 255.

hangle

A variação de matiz permitida é expressa em graus no círculo cromático (1–40). Valores mais elevados permitem um maior desvio rotacional em relação à tonalidade base.

hdsat

A tolerância de saturação varia de 0,10 a 1,00. Este valor representa a fracção da gama de saturação total dentro da qual a cor pode variar (por exemplo, 0,10 = ±10% de saturação).

Uma roda de cores circular exibindo um espectro completo de tonalidades rotuladas com valores em graus em torno do perímetro, aumentando em incrementos de 30 graus de 0° no topo até 360°.

"""
Create a Color Signature with the following values:
- index: 1
- red: 255
- green: 0
- blue: 0
- hangle: 20
- hdsat: 0.9
"""
# Create a red Color Signature
RED_BOX = Colordesc(1, 255, 0, 0, 20, 0.9)

Codedesc#

Codedesc cria um Código de Cor. Requer pelo menos duas Assinaturas de Cor já definidas para ser utilizado. Até oito Códigos de Cor diferentes podem ser armazenados num Sensor de Visão em simultâneo.

Usage:
Codedesc(sig1, sig2, sig3, sig4, sig5)

Parâmetro

Descrição

sig1

Uma Assinatura de Cor criada anteriormente.

sig2

Uma Assinatura de Cor criada anteriormente.

sig3

Opcional. Uma Assinatura de cor criada anteriormente.

sig4

Opcional. Uma Assinatura de cor criada anteriormente.

sig5

Opcional. Uma Assinatura de cor criada anteriormente.

# Create the Color Signatures
RED_BOX = Colordesc(1, 255, 0, 0, 20, 0.9)
BLUE_BOX = Colordesc(0, 26, 255, 0, 20, 0.9)

# Create a Color Code with the Color Signatures
BOX_CODE = Codedesc(RED_BOX, BLUE_BOX)

Tagdesc#

Tagdesc cria um ID AprilTag. Pode utilizá-lo para definir IDs AprilTag identificáveis, o que torna o seu código mais claro e fácil de ler.

Usage:
Tagdesc(id)

Parâmetro

Descrição

id

O ID AprilTag a utilizar.

# Set AprilTag ID 7 to be the "goal"
goal = Tagdesc(7)