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

camera

A câmara a partir da qual os dados serão obtidos: a DOWNWARD_CAMERA ou a FORWARD_CAMERA.

signature

Filtra o conjunto de dados para incluir apenas os dados da assinatura fornecida. As subscrições disponíveis são:

  • ALL_TAGS - Todos os IDs AprilTag
  • TAG0 a TAG37 - Um único ID AprilTag de 0 a 37

count

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

drone.vision.TAG_OBJECT

8

IDs de etiqueta de abril

drone.vision.COLOR_OBJECT

1

Assinaturas a cores - Brevemente!

drone.vision.CODE_OBJECT

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)