Visão#
Introdução#
O sensor de visão do drone VEX AIR deteta e rastreia os IDs AprilTag. Isto permite que o drone analise o ambiente à sua volta, siga objetos e reaja com base nos dados visuais detetados. Abaixo está uma lista de todos os métodos e propriedades disponíveis:
Sensores de movimento – Detetam se o drone está a segurar um objeto.
get_data– Retorna uma tupla de objectos detectados para uma assinatura específica.
Propriedades – Dados do objeto devolvidos de get_data.
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.bearing– Ângulo do objeto em relação ao sensor de visão frontal ou os graus necessários para o drone estar de frente para o objeto.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– ID da etiqueta do objeto.type– Retorna o tipo do objeto.
Getters#
get_data#
get_data 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 um ID AprilTag — e devolve uma tupla.
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:
drone.vision.get_data(camera, signature, count)
Parâmetros |
Descrição |
|---|---|
|
A câmara a partir da qual os dados serão obtidos: a |
|
Filtra o conjunto de dados para incluir apenas os dados da assinatura fornecida. 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). |
# Climb upward when an AprilTag ID is detected
drone.take_off(climb_to=500)
while True:
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
drone.climb_for(direction=UP, distance=200)
Propriedades#
Existem várias propriedades que são incluídas em cada objeto armazenado numa tupla após get_data ser utilizado.
Todos os valores das propriedades, exceto .id e .type descrevem a posição, o tamanho, a orientação ou a direção do objeto detetado no momento em que get_data foi utilizado. Estes valores são medidos em pixéis ou graus. Cada sensor de visão tem uma resolução diferente:
Vista frontal: 640 x 480 pixéis
Vista de baixo: 640 x 400 pixéis
.exists#
.exists devolve um valor booleano indicando se o índice existe na tupla. Retorna um erro se não for detetado nenhum objeto.
True– O índice existe.False– O índice não existe.
# Climb upward when an AprilTag ID is detected
drone.take_off(climb_to=500)
while True:
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
drone.climb_for(direction=UP, distance=200)
.width#
.width devolve a largura do objeto detetado em pixéis como um número inteiro de 1 a 640.
# Show if the AprilTag ID appears large or small
while True:
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
clear_console()
if vision_data[0].exists:
if vision_data[0].width > 100:
print("Large")
else:
print("Small")
wait(0.2, SECONDS)
.height#
.height devolve a altura do objeto detetado em pixéis como um número inteiro de 1 a 480.
# Show if the AprilTag ID appears large or small
while True:
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
clear_console()
if vision_data[0].exists:
if vision_data[0].height > 100:
print("Large")
else:
print("Small")
wait(0.2, SECONDS)
.centerX#
.centerX devolve a coordenada x do centro do objecto detectado em pixéis como um número inteiro de 1 a 640.
# Show if an AprilTag ID is to the left or the right of the camera
while True:
clear_console()
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
if vision_data[0].centerX < 320:
print("To the left!")
else:
print("To the right!")
wait(0.2, SECONDS)
.centerY#
.centerY devolve a coordenada y do centro do objecto detectado em pixéis como um número inteiro de 1 a 480.
# Take off and align drone with AprilTag ID on wall
# Change drone.take_off parameter to see different results
drone.take_off(climb_to=800)
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
if vision_data[0].centerY < 240:
print("Below the target!")
else:
print("Above the target!")
else:
print("No target found!")
.bearing#
.bearing devolve um ângulo que indica a posição de um objeto em relação ao drone. O comportamento depende do sensor de visão utilizado.
Um valor de 0° indica que o centro do objeto e o sensor estão alinhados. Valores positivos significam que o objeto está à direita, enquanto valores negativos significam que o objeto está à esquerda.
Sensor |
Devoluções |
|---|---|
Para baixo |
O ângulo de rotação da parte frontal do drone para se alinhar com o centro do objeto varia entre -180º a 180º. |
Encaminhar |
O deslocamento do objeto para a esquerda ou para a direita do centro do sensor de visão varia entre -180º a 180º. |
# Align the front of the drone to an AprilTag ID
drone.set_turn_velocity(15)
drone.take_off(climb_to=500)
while True:
vision_data = drone.vision.get_data(DOWNWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
if -20 < vision_data[0].bearing < 20:
# Hover once sensor is centered on AprilTag ID
drone.hover()
controller.sound.play(SUCCESS)
while controller.sound.is_active():
wait(50, MSEC)
elif vision_data[0].bearing < -21:
drone.turn(LEFT)
else:
drone.turn(RIGHT)
wait(5, MSEC)
.rotation#
.rotation devolve a orientação do AprilTag ID detectado como um número inteiro em graus, de 1 a 359.
# Turn left or right based on the rotation of an AprilTag ID
drone.take_off(climb_to=1000)
while True:
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
if 240 < vision_data[0].rotation < 300:
drone.turn_for(LEFT, 90)
elif 60 < vision_data[0].rotation < 120:
drone.turn_for(RIGHT, 90)
else:
drone.hover()
wait(0.2, SECONDS)
.originX#
.originX devolve a coordenada x do canto superior esquerdo da caixa delimitadora do objecto detectado em pixéis, como um número inteiro de 1 a 640.
# Draw lines to the AprilTag ID origin from all corners
while True:
controller.screen.clear_screen()
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
controller.screen.draw_line(0, 0, vision_data[0].originX, vision_data[0].originY)
controller.screen.draw_line(0, 480, vision_data[0].originX, vision_data[0].originY)
controller.screen.draw_line(640, 0, vision_data[0].originX, vision_data[0].originY)
controller.screen.draw_line(640, 480, vision_data[0].originX, vision_data[0].originY)
wait(0.2, SECONDS)
.originY#
.originY devolve a coordenada y do canto superior esquerdo da caixa delimitadora do objecto detectado em pixéis, como um número inteiro de 1 a 480.
# Draw lines to the AprilTag ID origin from all corners
while True:
controller.screen.clear_screen()
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
controller.screen.draw_line(0, 0, vision_data[0].originX, vision_data[0].originY)
controller.screen.draw_line(0, 480, vision_data[0].originX, vision_data[0].originY)
controller.screen.draw_line(640, 0, vision_data[0].originX, vision_data[0].originY)
controller.screen.draw_line(640, 480, vision_data[0].originX, vision_data[0].originY)
wait(0.2, SECONDS)
.id#
.id devolve o número de identificação do AprilTag ID detectado como um número inteiro de 0 a 37.
# Display the detected AprilTag ID
while True:
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
clear_console()
if vision_data[0].exists:
print(vision_data[0].id)
wait(0.2, SECONDS)
.type#
.type devolve o tipo de objeto detetado. O resultado será o seguinte:
Tipo de objeto |
Valor numérico |
Objetos incluídos |
|---|---|---|
|
8 |
IDs de etiqueta de abril |
|
1 |
Assinaturas a cores - Brevemente! |
|
2 |
Códigos de cores - Brevemente! |
# Display what AprilTag ID is detected
while True:
controller.screen.clear_screen()
controller.screen.set_cursor(1, 1)
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
if vision_data[0].type == drone.vision.TAG_OBJECT:
controller.screen.print("AprilTag ID: ")
controller.screen.print(vision_data[0].id)
wait(0.1, SECONDS)