Sensor de visão#
Introdução#
O sensor de visão é um sensor baseado numa câmara que pode detetar e rastrear assinaturas e códigos de cores. Permite que um robô analise o ambiente à sua volta e responda a estímulos visuais.
Nos exemplos abaixo, o sensor de visão configurado será nomeado 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 Vision.
Segue-se uma lista de todos os métodos:
Getters — Obtêm os dados do sensor de visão.
take_snapshot— Captura os dados para uma assinatura específica.installed— Se o sensor de visão está ligado ao cérebro IQ (2. ª geração).
Propriedades — Dados do objeto devolvidos de take_snapshot.
largest_object— Seleciona imediatamente o maior objeto da captura do sensor de visão..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.
Construtores — Inicialize e configure os sensores manualmente.
Getters#
take_snapshot#
take_snapshot filtra os dados do quadro do sensor de visão para uma única assinatura — uma descrição guardada de algo que o sensor pode reconhecer, como 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:
vision_1.take_snapshot(SIGNATURE)
Parâmetros |
Descrição |
|---|---|
|
Filtra o conjunto de dados para incluir apenas os dados da assinatura fornecida. As assinaturas disponíveis são:
|
# Move forward if a red object is detected
while True:
red_box = vision_1.take_snapshot(vision_1__RED_BOX)
if red_box[0].exists:
drivetrain.drive_for(FORWARD, 10, MM)
wait(5, MSEC)
Assinaturas de cores#
Uma assinatura de cor é uma cor única que o sensor de visão pode reconhecer. Estas assinaturas permitem que o sensor de visão 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 de visão, dois sublinhados e, em seguida, o nome da assinatura de cor. Por exemplo: 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 = vision_1.take_snapshot(vision_1__RED_BOX)
if red_box[0].exists:
brain.screen.print("Color signature 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 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: 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 = vision_1.take_snapshot(vision_1__BOX_CODE)
if box_code[0].exists:
brain.screen.print("Color code detected!")
wait(100, MSEC)
installed#
installed devolve um valor booleano indicando se o sensor de visão está atualmente ligado ao cérebro IQ (2ª geração).
True— O sensor de visão está ligado ao cérebro IQ (2. ª geração).False— O sensor de visão não está ligado ao cérebro IQ (2. ª geração).
Usage:
vision_1.installed()
Parâmetros |
Descrição |
|---|---|
Este método não tem parâmetros. |
# Display a message if the Vision Sensor is connected
if vision_1.installed():
brain.screen.print("Installed!")
Propriedades#
largest_object#
largest_object recupera o maior objecto detectado para obter dados na tupla devolvida pela última utilização de take_snapshot.
Este método pode ser utilizado para obter sempre o maior objeto de uma tupla sem especificar um índice.
Usage:
vision_1.largest_object()
# Turn slowly until the largest object is centered in
# front of the Vision Sensor
drivetrain.set_turn_velocity(10, PERCENT)
drivetrain.turn(RIGHT)
while True:
red_box = vision_1.take_snapshot(vision_1__RED_BOX)
if red_box[0].exists:
if 140 < vision_1.largest_object().centerX < 180:
drivetrain.stop()
wait(10,MSEC)
Tuple Properties#
Existem oito propriedades que são incluídas em cada objeto armazenado numa tupla após take_snapshot ser utilizado.
Todos os valores das propriedades descrevem a posição e o tamanho do objecto detectado no campo de visão do sensor de visão no momento em que foi utilizado o parâmetro take_snapshot . Estes valores são medidos em pixéis, com base na resolução de 316 por 212 pixéis do sensor.
. existe#
.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 one red objects is detected
# You will receive an error if no objects are detected
while True:
brain.screen.clear_screen()
brain.screen.set_cursor(1, 1)
red_objects = vision_1.take_snapshot(vision_1__RED_BOX)
if red_objects[0].exists:
brain.screen.print("At least 1")
else:
brain.screen.print("No red objects")
wait(0.5, SECONDS)
.largura#
.width devolve a largura do objeto detetado em pixéis, que é um número inteiro entre 1 e 316.
# Move towards a blue object until its width is
# larger than 100 pixels
while True:
blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)
if blue_box[0].exists:
if blue_box[0].width < 100:
drivetrain.drive_for(FORWARD, 10, MM)
else:
drivetrain.stop()
wait(50, MSEC)
.altura#
.height devolve a altura do objeto detetado em pixéis, que é um número inteiro entre 1 e 212.
# Move towards a blue object until its height is
# larger than 100 pixels
while True:
blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)
if blue_box[0].exists:
if blue_box[0].height < 100:
drivetrain.drive_for(FORWARD, 10, MM)
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 316.
# Turn slowly until the largest blue object is centered
# in front of the Vision Sensor.
drivetrain.set_turn_velocity(10, PERCENT)
drivetrain.turn(RIGHT)
while True:
blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)
if blue_box[0].exists:
if 140 < vision_1.largest_object().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 212.
# Move towards a blue object until its
# center y-coordinate is more than 140 pixels
while True:
blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)
if blue_box[0].exists:
if blue_box[0].centerY < 140:
drivetrain.drive(FORWARD)
else:
drivetrain.stop()
wait(50, MSEC)
.ângulo#
.angle devolve a orientação do objecto detectado em graus, que é um número inteiro entre 0 e 359.
# Turn left or right depending on how a
# configured box code is rotated
while True:
box_code = vision_1.take_snapshot(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)
. origemX#
.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 316.
# Display if a red object is to the
# left or the right
while True:
brain.screen.clear_screen()
brain.screen.set_cursor(1,1)
red_box = vision_1.take_snapshot(vision_1__RED_BOX)
if red_box[0].exists:
if red_box[0].originX < 160:
brain.screen.print("To the left!")
else:
brain.screen.print("To the right!")
wait(50, MSEC)
. origemY#
.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 212.
# Display if a red object is close or far
# from the robot
while True:
brain.screen.clear_screen()
brain.screen.set_cursor(1,1)
red_box = vision_1.take_snapshot(vision_1__RED_BOX)
if red_box[0].exists:
if red_box[0].originY < 80:
brain.screen.print("Far")
else:
brain.screen.print("Close")
wait(50, MSEC)
Construtores#
Os construtores são utilizados para criar manualmente objetos Vision, Signature, e Code , que são necessários para configurar os sensores fora do VEXcode.
Vision Sensor#
Vision cria um sensor de visão.
Utilização
Vision(port, brightness, sigs)
Parâmetros |
Descrição |
|---|---|
|
A que porta inteligente está ligado o sensor de visão, de 1 a 12? |
|
Opcional. O valor de brilho do sensor de visão, de 1 a 100. |
|
Opcional. O nome de um ou mais objetos Assinatura de Cor ou Código de Cor. |
Exemplo
# Create a new Signature "RED_BOX" with the Signature class
RED_BOX = Signature(1, -3911, -3435, -3673,10879, 11421, 11150,2.5, 0)
# Create a new Vision Sensor "vision_1" with the Vision
# class, with the "RED_BOX" Signature.
vision_1 = Vision(Ports.PORT1, 100, RED_BOX)
# Move forward if a red object is detected
while True:
red_object = vision_1.take_snapshot(RED_BOX)
if red_object[0].exists:
drivetrain.drive_for(FORWARD, 10, MM)
wait(5, MSEC)
Color Signature#
Signature creates a Color Signature. Up to seven different Color Signatures can be stored on a Vision Sensor at once.
Utilização:
Signature(index, uMin, uMax, uMean, vMin, vMax, vMean, rgb, type)
Parâmetro |
Descrição |
|---|---|
|
O índice do objeto |
|
O valor de |
|
O valor de |
|
O valor de |
|
O valor de |
|
O valor de |
|
O valor de |
|
O valor varia de |
|
O valor de |
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 Signature class
RED_BOX = Signature(1, 10121, 10757, 10439,-1657, -1223, -1440,2.5, 1)
# Create a new Vision Sensor "vision_1" with the Vision
# class, with the RED_BOX Signature.
vision_1 = Vision(Ports.PORT1, 100, RED_BOX)
# Move forward if a red object is detected
while True:
red_object = vision_1.take_snapshot(RED_BOX)
if red_object[0].exists:
drivetrain.drive_for(FORWARD, 10, MM)
wait(5, MSEC)
Color Code#
O código Code 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:
Code(sig1, sig2, sig3, sig4, sig5)
Parâmetro |
Descrição |
|---|---|
|
Uma Assinatura de Cor criada anteriormente. |
|
Uma Assinatura de Cor criada anteriormente. |
|
Opcional. Uma Assinatura de cor criada anteriormente. |
|
Opcional. Uma Assinatura de cor criada anteriormente. |
|
Opcional. Uma Assinatura de cor criada anteriormente. |
Exemplo
# Create two new Signatures for a red and blue box
RED_BOX = Signature(1, 10121, 10757, 10439,-1657, -1223, -1440, 2.5, 1)
BLUE_BOX = Signature(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 = Code(RED_BOX, BLUE_BOX)
# Create a new Vision Sensor "vision_1" with the Vision
# class, with the red_box and blue_box Signatures.
vision_1 = Vision(Ports.PORT1, 100, 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 = vision_1.take_snapshot(RED_BLUE)
if box_code[0].exists:
brain.screen.print("Color code detected!")
wait(100, MSEC)