Rastreamento de etiquetas AprilTag

Tutorial em vídeo 11 - Rastreamento de AprilTag: https://singtown.com/learn/49590/
Tutorial em vídeo 21 - Um carro perseguindo outros objetos: https://singtown.com/learn/50041/

Introdução ao AprilTag

Recursos:https://april.eecs.umich.edu/software/apriltag.html

O AprilTag é um sistema de referência visual que pode ser usado para uma variedade de tarefas, incluindo AR, robótica e calibração de câmera. Essa etiqueta pode ser impressa diretamente com uma impressora, e o programa de detecção AprilTag pode calcular a posição 3D precisa, a orientação e o id em relação à câmera. Para a OpenMV, isso é particularmente útil! É algo assim:

Em termos simples, basta anexar essa etiqueta ao alvo, e você pode identificar a posição 3D e o id dessa etiqueta na OpenMV.

Tipos de AprilTag

Os tipos de AprilTag são chamados de famílias, e existem os seguintes tipos:

TAG16H5 → 0 a 29\ TAG25H7 → 0 a 241\ TAG25H9 → 0 a 34\ TAG36H10 → 0 a 2319\ TAG36H11 → 0 a 586\ ARTOOLKIT → 0 a 511\ Ou seja, existem 30 famílias de TAG16H5, cada uma com um id correspondente, de 0 a 29.

Então, quais são as diferenças entre as diferentes famílias?

Por exemplo, a área efetiva do TAG16H5 é de 4 x 4 blocos, então ele pode ser visto de mais longe do que o TAG36H11 (porque este tem 6 x 6 blocos). No entanto, a taxa de erro do TAG16H5 é muito mais alta que a do TAG36H11, porque o TAG36H11 tem mais informações de verificação; portanto, se não houver outro motivo, é recomendado usar o TAG36H11.

Criando um AprilTag

É muito simples. Você pode baixar da internet ou gerar diretamente pela OpenMV IDE. Selecione a família em Tools - Machine Vision - AprilTag Generate. Recomenda-se o TAG36H11.

Em seguida, preencha o número que você precisa gerar; por exemplo, se precisar de 10, serão geradas imagens com id de 0 a 9.

Depois, selecione a pasta onde a imagem será armazenada, e pronto.

Em seguida, a imagem será gerada na pasta.

Por fim, imprima a imagem com uma impressora (claro, você também pode usar a tela diretamente, mas ela pode refletir luz).

Programa

# AprilTags Example
#
# This example shows the power of the OpenMV Cam to detect April Tags
# on the OpenMV Cam M7. The M4 versions cannot detect April Tags.

import csi, image, time, math
csi0 = csi.CSI()

csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QQVGA) # we run out of memory if the resolution is much bigger...
csi0.snapshot(frames=30)
csi0.auto_gain(False)  # must turn this off to prevent image washout...
csi0.auto_whitebal(False)  # must turn this off to prevent image washout...
clock = time.clock()

while(True):
    clock.tick()
    img = csi0.snapshot()
    for tag in img.find_apriltags(): # defaults to TAG36H11 without "families".
        img.draw_rectangle(tag.rect, color = (255, 0, 0))
        img.draw_cross((tag.cx, tag.cy), color = (0, 255, 0))
        degress = 180 * tag.rotation / math.pi
        print(tag.id,degress)

Como você pode ver, é possível identificar o id 0, o ângulo de rotação e a posição\

Posicionamento 3D

A coisa mais incrível sobre o AprilTag é a função de posicionamento 3D, que pode conhecer a posição espacial da tag, com um total de 6 graus de liberdade, três posições e três ângulos.

# AprilTags Example
#
# This example shows the power of the OpenMV Cam to detect April Tags
# on the OpenMV Cam M7. The M4 versions cannot detect April Tags.

import csi, image, time, math
csi0 = csi.CSI()

csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QQVGA) # we run out of memory if the resolution is much bigger...
csi0.snapshot(frames=30)
csi0.auto_gain(False)  # must turn this off to prevent image washout...
csi0.auto_whitebal(False)  # must turn this off to prevent image washout...
clock = time.clock()

# Nota! Ao contrário de find_qrcodes, o find_apriltags não precisa de correção de distorção por software para funcionar.

# Nota: a unidade da postura de saída é radianos, que pode ser convertida em graus, mas a unidade da posição depende do seu tamanho e precisa de uma conversão proporcional.

# f_x é a distância focal em x, em pixels. Para uma OpenMV padrão, deve ser igual a 2.8/3.984*656; esse valor é a distância focal em milímetros dividida pelo comprimento do sensor na direção x, multiplicada pelos pixels do sensor na direção x (OV7725)
# f_y é a distância focal em y, em pixels. Para uma OpenMV padrão, deve ser igual a 2.8/2.952*488; esse valor é a distância focal em milímetros dividida pelo comprimento do sensor na direção y, multiplicada pelos pixels do sensor na direção y (OV7725)

# c_x é a posição central em x da imagem
# c_y é a posição central em y da imagem

f_x = (2.8 / 3.984) * 160 # valor padrão
f_y = (2.8 / 2.952) * 120 # valor padrão
c_x = 160 * 0.5 # valor padrão (image.w * 0.5)
c_y = 120 * 0.5 # valor padrão (image.h * 0.5)

def degrees(radians):
    return (180 * radians) / math.pi

while(True):
    clock.tick()
    img = csi0.snapshot()
    for tag in img.find_apriltags(fx=f_x, fy=f_y, cx=c_x, cy=c_y): # padrão TAG36H11
        img.draw_rectangle(tag.rect, color = (255, 0, 0))
        img.draw_cross((tag.cx, tag.cy), color = (0, 255, 0))
        print_args = (tag.x_translation, tag.y_translation, tag.z_translation, \
            degrees(tag.x_rotation), degrees(tag.y_rotation), degrees(tag.z_rotation))
        # a unidade de posição é desconhecida, a unidade de rotação é graus
        print("Tx: %f, Ty %f, Tz %f, Rx %f, Ry %f, Rz %f" % print_args)
    print(clock.fps())

A porta serial gera 6 variáveis; Tx, Ty, Tz são as 3 quantidades de posição no espaço, e Rx, Ry, Rz são as três quantidades de rotação.

Leitura adicional:

  • Do app Singtown Lab: Como localizar/medir a distância no reconhecimento de Apriltag? Qual é a unidade de saída de tx ty tz? Como obter a distância real? https://forum.singtown.com/topic/52

results matching ""

    No results matching ""