Sensor de visão de IA#

Introdução#

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

Nos exemplos abaixo, o sensor de visão IQ AI configurado será nomeado ai_vision_1e os objetos de assinatura de cor configurados, como RED_BOX, serão utilizados em todos os exemplos subsequentes ao longo desta documentação da API ao referir os métodos da classe AiVision.

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

Getters — Obtém dados do sensor de visão de IA IQ.

  • take_snapshot — Captura os dados para uma assinatura específica.

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

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 cor ou ID AprilTag.

  • .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 — Inicialize e configure os sensores manualmente.

  • AiVision — Cria um sensor de visão de IA de QI.

  • Colordesc — Cria uma assinatura de cor.

  • Codedesc — Cria um código de cores.

Getters#

take_snapshot#

take_snapshot filtra os dados do quadro do sensor de visão IQ AI 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 IQ, 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 - Todas as Classificações de IA detectadas, dependendo do modelo configurado no Utilitário de Visão de IA.
  • 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 (padrão: 8).

# Move 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 IQ 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:

Objetos da sala de aula

Número de identificação

Classificação por IA

0

ClassroomElements.BLUE_BALL

1

ClassroomElements.GREEN_BALL

2

ClassroomElements.RED_BALL

3

ClassroomElements.BLUE_RING

4

ClassroomElements.GREEN_RING

5

ClassroomElements.RED_RING

6

ClassroomElements.BLUE_CUBE

7

ClassroomElements.GREEN_CUBE

8

ClassroomElements.RED_CUBE

Competição de Robótica VEX IQ: Misture e Combine

Número de identificação

Classificação por IA

0

GameElementsMixAndMatch.BEAM

1

GameElementsMixAndMatch.BLUE_PIN

2

GameElementsMixAndMatch.RED_PIN

3

GameElementsMixAndMatch.ORANGE_PIN

Aprimore o seu nível na competição de robótica VEX IQ

Número de identificação

Classificação por IA

0

GameElementsLevelUp.BLUE_BEANBAG

1

GameElementsLevelUp.RED_BEANBAG

2

GameElementsLevelUp.YELLOW_BEANBAG

Assinaturas de cores#

Uma assinatura de cor é uma cor única que o sensor de visão IQ AI consegue reconhecer. Estas assinaturas permitem que o sensor de visão IQ AI detete e rastreie objetos com base na sua cor. Uma vez configurada, a assinatura de cor permite que o sensor identifique 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 IA da IQ 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 IQ AI está atualmente ligado ao cérebro IQ (2ª geração).

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

  • False — O sensor de visão de IA IQ não está ligado ao cérebro IQ (2. ª geração).

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 IQ AI Vision 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 IA ou ID AprilTag detectado como um número inteiro. As Classificações de IA dependem do modelo que está configurado no Utilitário de Visão de IA.

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.

# Display if a score is confident
while True:
    objects = ai_vision_1.take_snapshot(AiVision.ALL_AIOBJS)
    brain.screen.clear_screen()
    brain.screen.set_cursor(1, 1)
    if objects[0].exists:
        if objects[0].score > 95:
            brain.screen.print("Confident")
    else:
        brain.screen.print("Not confident")

    wait(50, MSEC)

Construtores#

Os construtores são utilizados para criar manualmente os objetos AiVision, Colordesc, e Codedesc , que são necessários para configurar o sensor de visão IQ AI fora do VEXcode.

AI Vision Sensor#

AiVision cria um sensor de visão de IA para QI.

Utilização

Vision(port, sigs)

Parâmetros

Descrição

port

Em que Smart Port está ligado o sensor de visão IQ AI, de 1 a 12?

sigs

Opcional. O nome de uma ou mais assinaturas:

Exemplo

ai_vision_1 = AiVision(Ports.PORT1, AiVision.ALL_AIOBJS)

# Move 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)

Color Signature#

O comando Colordesc cria uma assinatura de cor. É possível armazenar até sete assinaturas de cor diferentes em simultâneo num sensor de visão IQ AI.

Utilização:

Colordesc(index, uMin, uMax, uMean, vMin, vMax, vMean, rgb, type)

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.

uMin

O valor de uMin no Vision Utility.

uMax

O valor de uMax no Vision Utility.

uMean

O valor de uMean no Vision Utility.

vMin

O valor de vMin no Vision Utility.

vMax

O valor de vMax no Vision Utility.

vMean

O valor de vMean no Vision Utility.

rgb

O valor varia de rgb no Vision Utility.

type

O valor de type no Utilitário de Visão.

Para obter os valores para criar uma Assinatura de Cor, vá para o Utilitário de Visão. Depois de configurar uma Assinatura de Cor, copie os valores dos parâmetros da janela de Configuração.

Exemplo

# Create a new Signature RED_BOX with the Colordesc class
RED_BOX = Colordesc(1, 10121, 10757, 10439,-1657, -1223, -1440,2.5, 1)
# Create a new AI Vision Sensor "ai_vision_1" with the AiVision
# class, with the RED_BOX Signature.
ai_vision_1 = AiVision(Ports.PORT1, 100, RED_BOX)

# Move forward if a red object is detected
while True:
    red_object = ai_vision_1.take_snapshot(RED_BOX)
    if red_object[0].exists:
        drivetrain.drive_for(FORWARD, 10, MM)
    wait(5, MSEC)

Color Code#

O comando Codedesc cria um código de cor. Requer pelo menos duas assinaturas de cor já definidas para ser utilizado. É possível armazenar até oito códigos de cor diferentes num sensor de visão em simultâneo.

Utilização:

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.

Exemplo

# Create two new Signatures for a red and blue box
RED_BOX = Colordesc(1, 10121, 10757, 10439,-1657, -1223, -1440, 2.5, 1)
BLUE_BOX = Colordesc(2, -4443, -3373, -3908,6253, 7741, 6997, 2.5, 1)
# Create a Color Code for a red box to the left of a blue box
RED_BLUE = Codedesc(RED_BOX, BLUE_BOX)
# Create a new AI Vision Sensor "ai_vision_1" with the AiVision
# class, with the RED_BOX and BLUE_BOX Signatures.
ai_vision_1 = AiVision(Ports.PORT1, RED_BOX, BLUE_BOX)

# Display a message if Color Code is detected
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(RED_BLUE)
    if box_code[0].exists:
        brain.screen.print("Code detected!")
        wait(100, MSEC)