Visão#
Introdução#
O sensor de visão do VEX EXP deteta e segue assinaturas e códigos de cores. Isto permite que o sensor analise o ambiente à sua volta e reaja com base nos dados visuais detetados.
Esta página utiliza vision_1, RED_BOXe BOX_CODE como exemplos de nomes para o Sensor de Visão, 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 os dados do sensor de visão.
take_snapshot– Captura dados para uma assinatura de cor ou código de cor específico.largest_object– Seleciona o maior objeto do instantâneo.installed– Se o sensor de visão está ligado ao cérebro EXP.
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.
Construtores – Inicialize e configure manualmente o sensor de visão e as suas assinaturas.
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 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 de visão, 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)
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)
installed#
installed devolve um valor booleano indicando se o sensor de visão está atualmente ligado ao EXP Brain.
True– O sensor de visão está ligado ao cérebro EXP.False– O sensor de visão não está ligado ao EXP Brain.
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("Vision Sensor Installed!")
Propriedades#
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.
.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 one red object 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)
.width#
.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)
.height#
.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)
.angle#
.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 70 < box_code[0].angle < 110:
drivetrain.turn_for(RIGHT, 45, DEGREES)
elif 250 < box_code[0].angle < 290:
drivetrain.turn_for(LEFT, 45, DEGREES)
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 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)
.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 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 o sensor de visão fora do VEXcode.
Vision#
Vision cria um sensor de visão.
Utilização
Vision(smartport, brightness, sigs)
Parâmetros |
Descrição |
|---|---|
|
A porta inteligente à qual o sensor de visão está ligado é representada por |
|
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 separados por vírgulas ( |
# Create the Color Signatures
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 the Color Code
BOX_CODE = Code(RED_BOX, BLUE_BOX)
"""
Create a Vision Sensor with the following values:
- Port 1
- brightness: 80
- RED_BOX and BOX_CODE signatures
"""
vision_1 = Vision(Ports.PORT1, 80, RED_BOX, BOX_CODE)
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.
"""
Create a Color Signature with the following values:
- index: 1
- uMin: 10121
- uMax: 10757
- uMean: 10439
- vMin: -1657
- vMax: -1223
- vMean: -1440
- rgb: 2.5
- type: 1
"""
RED_BOX = Signature(1, 10121, 10757, 10439,-1657, -1223, -1440,2.5, 1)
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. |
# Create the Color Signatures
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 with the Color Signatures
BOX_CODE = Code(RED_BOX, BLUE_BOX)