Visão de IA#
Introdução#
O sensor de visão com IA do robô de programação VEX AIM deteta e rastreia 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.
O sensor de visão com IA tem uma resolução de 320×240 pixéis. A origem (0, 0) está localizada no canto superior esquerdo, posicionando o centro do sensor em (160, 120), como mostra o esquema abaixo:

Segue-se uma lista de todos os métodos e propriedades:
Ações — Mostrar ou ocultar a transmissão da câmara AI Vision.
show_aivision— Apresenta o feed de Visão de IA no ecrã do robô.hide_aivision— Oculta o feed do AI Vision do ecrã.tag_detection— Activa ou desactiva a detecção de ID do AprilTag.
Getters — Detetam se o robô está a segurar um objeto.
get_data— Retorna uma tupla de objectos detectados para uma assinatura específica.has_sports_ball— Retorna se o robô tem uma bola desportiva.has_any_barrel— Retorna se o robô tem algum tipo de barril.has_blue_barrel— Retorna se o robô tem um barril azul.has_orange_barrel— Retorna se o robô tem um barril laranja.
Propriedades — Dados do objeto devolvidos de get_data.
exists— Indica se o objeto existe na deteção atual como um valor booleano.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.bearing— Ângulo horizontal em relação à frente do robô.rotation— Orientação do objecto.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.type— Retorna o tipo do objecto (AI, Tag, Color ou Code).
Construtores — Definem assinaturas e códigos de cores.
Criar uma assinatura de cor — Cria uma nova assinatura de cor baseada em intervalos RGB e de matiz/saturação.
Criar um código de cor — Combina várias assinaturas de cor num único código de cor.
Ações#
show_aivision#
O comando show_aivision apresenta o fluxo de dados em tempo real do sensor de visão com IA no ecrã do robô. O fluxo de dados em tempo real irá sobrepor quaisquer outras imagens ou textos no ecrã.
Nota: O ecrã não irá apresentar outras imagens ou texto a menos que seja utilizado hide_aivision para ocultar o feed.
Usage:
robot.screen.show_aivision()
Parâmetros |
Descrição |
|---|---|
Este método não tem parâmetros. |
# Watch the AI Vision Sensor detect AI Classifications
# and AprilTag IDs as you move the robot
robot.screen.show_aivision()
hide_aivision#
hide_aivision remove o fluxo de dados em tempo real do sensor de visão com IA do ecrã do robô.
Usage:
robot.screen.hide_aivision()
Parâmetros |
Descrição |
|---|---|
Este método não tem parâmetros. |
# View the AI Vision Sensor's feed for five seconds
robot.screen.show_aivision()
wait(5, SECONDS)
robot.screen.hide_aivision()
tag_detection#
tag_detection ativa ou desativa a deteção do ID do AprilTag, em que o estado é um valor booleano.
O sensor consegue detetar os IDs AprilTag de 0 a 36 da família Circle21h7.
Usage:
robot.vision.tag_detection(state)
Parâmetros |
Descrição |
|---|---|
|
Os valores são: |
robot.screen.set_font(PROP30)
# Cut off AprilTag ID detection after 5 seconds
while True:
if timer.time(SECONDS) > 5:
robot.vision.tag_detection(False)
robot.screen.clear_screen()
robot.screen.set_cursor(3, 1)
apriltags = robot.vision.get_data(ALL_TAGS)
if apriltags[0].exists:
robot.screen.print("AprilTag ID detected!")
else:
robot.screen.print("Nothing detected!")
wait(0.1, SECONDS)
Getters#
get_data#
get_data 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 utilitário AI Vision 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:
robot.vision.get_data(signature, count)
Parâmetros |
Descrição |
|---|---|
|
Filtra o conjunto de dados para incluir apenas os dados com a assinatura especificada. As subscrições disponíveis são:
|
|
Opcional. Define o número máximo de objetos que podem ser devolvidos, de 1 a 24 (padrão: 8). |
Nota: Os IDs AprilTag de 5 a 37 podem ser obtidos utilizando os IDs AprilTag impressos a partir de AIM Printables.
# Move forward if a sports ball is detected
while True:
ball = robot.vision.get_data(SPORTS_BALL)
if ball[0].exists:
robot.move_for(10, 0)
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(robot.vision.get_data(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(robot.vision.get_data(ALL_TAGS), key=lambda tag: tag.height)
for tag in apriltags_by_height:
print(tag.height)
wait(1, SECONDS)
Dados de visualização#
A impressão da tupla devolvida por get_data ( get_data apresenta uma lista de todas as propriedades de todos os objetos detectados:
# Display properties of all detected AprilTag IDs
while True:
vision_data = robot.vision.get_data(ALL_TAGS)
if vision_data[0].exists:
break
wait(0.25, SECONDS)
print(vision_data)

Classificações de IA#
O sensor de visão AIM AI pode detetar estas classificações de IA:
Número de identificação |
Classificação por IA |
Assinatura |
|---|---|---|
0 |
Bola |
|
1 |
Barril Azul |
|
2 |
Barril Laranja |
|
3 |
Robô AIM |
|
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 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 get_data para processar e detetar objetos coloridos em tempo real.

# Display if any objects match the Red_Box signature
while True:
robot.screen.set_cursor(1, 1)
robot.screen.clear_row(1)
# Change to any configured Color Signature
ai_objects = robot.vision.get_data(Red_Box)
if ai_objects[0].exists:
robot.screen.print("Color signature detected!")
Códigos de cores#
Um código de cores é um padrão estruturado composto por 2 a 4 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.

# Display if any objects match the BlueRed code
while True:
robot.screen.set_cursor(1, 1)
robot.screen.clear_row(1)
# Change to any configured Color Code
ai_objects = robot.vision.get_data(BlueRed)
if ai_objects[0].exists:
robot.screen.print("Color code detected!")
has_sports_ball#
has_sports_ball devolve um valor booleano indicando se o robô possui atualmente uma bola desportiva.
True— O robô tem uma bola desportiva.False— O robô não possui uma bola desportiva.
Usage:
robot.has_sports_ball()
Parâmetros |
Descrição |
|---|---|
Este método não tem parâmetros. |
# Kick when the robot has a sports ball
while True:
if robot.has_sports_ball():
robot.kicker.kick(MEDIUM)
wait(50, MSEC)
has_any_barrel#
has_any_barrel devolve um valor booleano indicando se o robô possui atualmente algum tipo de barril.
True— O robô tem um barril.False— O robô não tem um barril.
Usage:
robot.has_any_barrel()
Parâmetros |
Descrição |
|---|---|
Este método não tem parâmetros. |
# Push a barrel away when detected
while True:
if robot.has_any_barrel():
robot.kicker.place()
wait(50, MSEC)
has_blue_barrel#
has_blue_barrel devolve um valor booleano indicando se o robô possui atualmente um barril azul.
True— O robô tem um barril azul.False— O robô não tem um barril azul.
Usage:
robot.has_blue_barrel()
Parâmetros |
Descrição |
|---|---|
Este método não tem parâmetros. |
# Push a blue barrel away when detected
while True:
if robot.has_blue_barrel():
robot.kicker.place()
wait(50, MSEC)
has_orange_barrel#
has_orange_barrel devolve um valor booleano indicando se o robô possui atualmente um barril laranja.
True— O robô tem um barril laranja.False— O robô não tem um barril laranja.
Usage:
robot.has_orange_barrel()
Parâmetros |
Descrição |
|---|---|
Este método não tem parâmetros. |
# Push an orange barrel away when detected
while True:
if robot.has_orange_barrel():
robot.kicker.place()
wait(50, MSEC)
Propriedades#
Existem doze propriedades que são incluídas em cada objeto armazenado numa tupla após a utilização do método robot.vision.get_data.
Todos os valores de propriedade, exceto .id, .scoree .type , descrevem a posição, o tamanho, a orientação ou a direção do objeto detetado no momento em que robot.vision.get_data foi utilizado. Estes valores são medidos em pixéis ou graus, 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:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
ai_objects = robot.vision.get_data(ALL_CARGO)
if ai_objects[0].exists:
if ai_objects[1].exists:
robot.screen.print("At least 2")
else:
robot.screen.print("Less than 2")
wait(0.1, SECONDS)
.width#
.width devolve a largura do objeto detetado em pixéis, que é um número inteiro entre 1 e 320.
Nota: Os valores dos pixéis são relativos ao sistema de coordenadas do sensor. Consulte o diagrama na Introdução para referência.

# Move towards a Blue Barrel until its width is
# larger than 100 pixels
while True:
barrel = robot.vision.get_data(BLUE_BARREL)
if barrel[0].exists:
if barrel[0].width < 100:
robot.move_at(0)
else:
robot.stop_all_movement()
wait(50, MSEC)
.height#
.height devolve a altura do objeto detetado em pixéis, que é um número inteiro entre 1 e 240.
Nota: Os valores dos pixéis são relativos ao sistema de coordenadas do sensor. Consulte o diagrama na Introdução para referência.

# Move towards a Blue Barrel until its height is
# larger than 100 pixels
while True:
barrel = robot.vision.get_data(BLUE_BARREL)
if barrel[0].exists:
if barrel[0].height < 100:
robot.move_at(0)
else:
robot.stop_all_movement()
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.
Nota: Os valores dos pixéis são relativos ao sistema de coordenadas do sensor. Consulte o diagrama na Introdução para referência.

# Turn slowly until a Blue Barrel is centered in
# front of the robot
robot.set_turn_velocity(30)
robot.turn(RIGHT)
while True:
barrel = robot.vision.get_data(BLUE_BARREL)
if barrel[0].exists:
if 140 < barrel[0].centerX < 180:
robot.stop_all_movement()
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.
Nota: Os valores dos pixéis são relativos ao sistema de coordenadas do sensor. Consulte o diagrama na Introdução para referência.

# Move towards a Blue Barrel until its
# center y-coordinate is more than 140 pixels
while True:
barrel = robot.vision.get_data(BLUE_BARREL)
if barrel[0].exists:
if barrel[0].centerY < 140:
robot.move_at(0)
else:
robot.stop_all_movement()
wait(50, MSEC)
.bearing#
.bearing devolve um decimal (float) que representa a distância de um objeto à esquerda ou à direita do centro da visão do sensor de visão de IA em graus. Um valor de 0 significa que está centrado, valores positivos significam que o objeto está à direita e valores negativos significam que o objeto está à esquerda.
# Turn to keep the Blue Barrel directly in front
robot.set_turn_velocity(40)
while True:
vision_data = robot.vision.get_data(BLUE_BARREL)
if vision_data[0].exists:
if vision_data[0].bearing > 5:
robot.turn(RIGHT)
elif vision_data[0].bearing < -5:
robot.turn(LEFT)
else:
robot.stop_all_movement()
else:
robot.stop_all_movement()
wait(0.1, SECONDS)
.rotation#
.rotation devolve a orientação do objeto no plano de visualização do sensor de visão com IA, medida em graus de 0 a 359. Um código de cor é 0° quando as suas cores estão dispostas numa linha horizontal (por exemplo, vermelho-azul). Se as cores forem rodadas, o ângulo muda (por exemplo, dispor azul-vermelho retorna 180°).
No exemplo abaixo, o código de cores foi configurado com vermelho à esquerda e azul à direita.
Nesta imagem, colocar azul sobre vermelho equivale a rodar o código de cor original 270 graus para a direita.

# Slide left or right depending on how a Color Code (BlueRed)
# is rotated on the vertical plane
while True:
# Original Color Code is Red to the left, Blue to the right
code = robot.vision.get_data(BlueRed)
if code[0].exists:
# Check if Color Code is now Red on top of Blue
if 50 < code[0].rotation < 100 :
robot.move_at(90)
# Check if Color Code is now Blue on top of Red
elif 270 < code[0].rotation < 330 :
robot.move_at(270)
else:
robot.stop_all_movement()
else:
robot.stop_all_movement()
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.
Nota: Os valores dos pixéis são relativos ao sistema de coordenadas do sensor. Consulte o diagrama na Introdução para referência.

# Display if an Orange Barrel is to the
# left or the right
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1,1)
orange_barrel = robot.vision.get_data(ORANGE_BARREL)
if orange_barrel[0].exists:
if orange_barrel[0].originX < 160:
robot.screen.print("To the left!")
else:
robot.screen.print("To the right!")
wait(50, 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.
Nota: Os valores dos pixéis são relativos ao sistema de coordenadas do sensor. Consulte o diagrama na Introdução para referência.

# Display if an Orange Barrel is close or far
# from the robot
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
orange_barrel = robot.vision.get_data(ORANGE_BARREL)
if orange_barrel[0].exists:
if orange_barrel[0].originY < 80:
robot.screen.print("Far")
else:
robot.screen.print("Close")
wait(50, MSEC)
.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 37. 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 = robot.vision.get_data(ALL_TAGS)
if apriltags[0].exists:
if apriltags[0].id == 1:
robot.move_at(0)
else:
robot.stop_all_movement()
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.
# Look confident if an Orange Barrel is detected
while True:
barrel = robot.vision.get_data(ORANGE_BARREL)
if barrel[0].exists:
if barrel[0].score > 95:
robot.screen.show_emoji(CONFIDENT)
else:
robot.screen.hide_emoji()
wait(50, MSEC)
.type#
.type devolve um número inteiro que indica o tipo de objeto detetado. Pode comparar este valor utilizando o número do tipo ou a constante nomeada correspondente:
Tipo de objeto |
Objetos incluídos |
|---|---|
|
— Bolas desportivas |
|
— IDs de etiqueta de abril |
|
— Assinaturas a cores |
|
— Códigos de cores |
# Display if an AprilTag ID or AI Classification
# is detected
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
vision_data = robot.vision.get_data(ALL_VISION)
if vision_data[0].exists:
if vision_data[0].type == AiVision.AI_OBJECT:
robot.screen.print("AI Object!")
elif vision_data[0].type == AiVision.TAG_OBJECT:
robot.screen.print("AprilTag ID!")
wait(0.1, SECONDS)
# Display a list of all detected objects
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
vision_data = robot.vision.get_data(ALL_VISION)
if vision_data[0].exists:
for obj in vision_data:
if obj.type == AiVision.AI_OBJECT:
robot.screen.print("- AI Object")
elif obj.type == AiVision.TAG_OBJECT:
robot.screen.print("- AprilTag ID")
robot.screen.next_row()
wait(0.1, SECONDS)
Construtores#
Creating a Color Signature#
Uma nova assinatura de cor é criada utilizando o construtor Colordesc e depois registada com o sensor de visão de IA utilizando o método color_description Um objeto Colordesc define 1 de até 7 assinaturas de cor detetáveis para o sensor, mas deve ser explicitamente definido utilizando color_description para ter efeito.
Utilização de Colordesc:
Colordesc(index, red, green, blue, hangle, hdsat)
Parâmetro |
Descrição |
|---|---|
|
Um número inteiro de 1 a 7 que representa o índice da Assinatura de Cor. Se duas Assinaturas de Cor utilizarem o mesmo índice, a segunda terá precedência sobre a primeira. |
|
Um número inteiro de 0 a 255 para o componente vermelho da cor. |
|
Um número inteiro de 0 a 255 para a componente verde da cor. |
|
Um número inteiro de 0 a 255 para a componente azul da cor. |
|
Um valor de ponto flutuante de 1 a 40 que representa a gama de tonalidades em graus. |
|
Um valor decimal entre 0,10 e 1,00 que representa o intervalo de saturação. |
Utilização de color_description:
robot.vision.color_description(object)
Parâmetro |
Descrição |
|---|---|
|
O objeto |
# Detect a red object
red_box = Colordesc(1, 207, 19, 25, 10.00, 0.20)
robot.vision.color_description(red_box)
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
red_boxes = robot.vision.get_data(red_box)
if red_boxes[0].exists:
robot.screen.print("Red detected!")
else:
robot.screen.print("No red detected.")
wait(0.2, SECONDS)
Creating a Color Code#
Um novo Código de Cor é criado utilizando o construtor Codedesc e depois ativado utilizando o método code_description Um Código de Cor agrupa 2 a 4 objetos Colordesc existentes num único identificador que o Sensor de Visão de IA pode detetar como uma sequência, mas deve ser explicitamente definido utilizando code_description para ter efeito.
Utilização de Codedesc:
Codedesc(index, c1, c2, c3, c4, c5)
Parâmetro |
Descrição |
|---|---|
|
O índice do código de cor, de 1 a 8. Nota: se criar dois objetos Codedesc |
|
O primeiro objeto |
|
O segundo objeto |
|
Opcional. Um terceiro objecto |
|
Opcional. Um quarto objecto |
Utilização de code_description:
robot.vision.code_description(object)
Parâmetro |
Descrição |
|---|---|
|
Um objeto |
# Create Color Signatures
red_box = Colordesc(1, 207, 19, 25, 10.00, 0.20)
purple_box = Colordesc(2, 98, 18, 227, 10.00, 0.20)
robot.vision.color_description(red_box)
robot.vision.color_description(purple_box)
# Detect a red_purple Color Code
red_purple = Codedesc(1, red_box, purple_box)
robot.vision.code_description(red_purple)
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
code_objects = robot.vision.get_data(red_purple)
if code_objects[0].exists:
robot.screen.print("Code detected!")
else:
robot.screen.print("No code detected.")
wait(0.2, SECONDS)