Suivi des balises AprilTag

Tutoriel vidéo 11 - Suivi des balises AprilTag : https://singtown.com/learn/49590/
Tutoriel vidéo 21 - Une voiture poursuivant d'autres objets : https://singtown.com/learn/50041/

Introduction à AprilTag

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

AprilTag est un système de référence visuelle qui peut être utilisé pour diverses tâches, notamment la RA, la robotique et l'étalonnage des caméras. L'étiquette peut être imprimée directement avec une imprimante et le programme de détection AprilTag peut calculer la position 3D précise, l'orientation et l'identification par rapport à la caméra. Pour OpenMV, c'est particulièrement utile ! Cela ressemble probablement à ceci :

Pour faire simple, tant que la balise est attachée à la cible, la position 3D et l'identifiant de la balise peuvent être identifiés sur OpenMV.

Types d'AprilTag

Le type d’AprilTag est appelé famille et il existe les types suivants :

TAG16H5 → 0 to 29\ TAG25H7 → 0 to 241\ TAG25H9 → 0 to 34\ TAG36H10 → 0 to 2319\ TAG36H11 → 0 to 586\ ARTOOLKIT → 0 to 511\ En d’autres termes, il existe 30 familles de TAG16H5, chacune ayant un identifiant correspondant, allant de 0 à 29.

Alors, quelles sont les différences entre les différentes familles ?

Par exemple, la surface effective du TAG16H5 est de 4 x 4 carrés, il peut donc voir plus loin que le TAG36H11 (car il comporte 6 x 6 carrés). Cependant, le taux d'erreur de TAG16H5 est beaucoup plus élevé que celui de TAG36H11, car TAG36H11 contient plus d'informations de vérification. Par conséquent, s'il n'y a pas d'autre raison, il est recommandé d'utiliser TAG36H11**.

faire AprilTag

C'est très simple. Vous pouvez le télécharger depuis Internet ou le générer directement depuis l'IDE OpenMV. Sélectionnez la famille dans Outils-Machine Vision-AprilTag Generate. Il est recommandé d'utiliser TAG36H11.

Ensuite, remplissez le numéro qui doit être généré. Par exemple, si vous avez besoin de 10, générez des images avec les ID 0 à 9.

Sélectionnez ensuite le dossier dans lequel les images sont stockées et c'est tout.

Ensuite, des images seront générées dans ce dossier.

Enfin, imprimez l'image avec une imprimante (bien sûr, vous pouvez également utiliser directement l'écran, mais il peut être réfléchissant).

programme

# 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 sensor, image, time, math

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA) # we run out of memory if the resolution is much bigger...
sensor.skip_frames(30)
sensor.set_auto_gain(False)  # must turn this off to prevent image washout...
sensor.set_auto_whitebal(False)  # must turn this off to prevent image washout...
clock = time.clock()

while(True):
    clock.tick()
    img = sensor.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)

Comme vous pouvez le voir, vous pouvez identifier l'identifiant comme 0, l'angle de rotation et la position.\

Positionnement 3D

La chose la plus étonnante d'AprilTag est la fonction de positionnement 3D. Il permet de connaître la position spatiale du Tag. Il y a un total de 6 degrés de liberté, trois positions et trois angles.

# 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 sensor, image, time, math

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA) # we run out of memory if the resolution is much bigger...
sensor.skip_frames(30)
sensor.set_auto_gain(False)  # must turn this off to prevent image washout...
sensor.set_auto_whitebal(False)  # must turn this off to prevent image washout...
clock = time.clock()

# 注意!与find_qrcodes不同,find_apriltags 不需要软件矫正畸变就可以工作。

# 注意,输出的姿态的单位是弧度,可以转换成角度,但是位置的单位是和你的大小有关,需要等比例换算

# f_x 是x的像素为单位的焦距。对于标准的OpenMV,应该等于2.8/3.984*656,这个值是用毫米为单位的焦距除以x方向的感光元件的长度,乘以x方向的感光元件的像素(OV7725)
# f_y 是y的像素为单位的焦距。对于标准的OpenMV,应该等于2.8/2.952*488,这个值是用毫米为单位的焦距除以y方向的感光元件的长度,乘以y方向的感光元件的像素(OV7725)

# c_x 是图像的x中心位置
# c_y 是图像的y中心位置

f_x = (2.8 / 3.984) * 160 # 默认值
f_y = (2.8 / 2.952) * 120 # 默认值
c_x = 160 * 0.5 # 默认值(image.w * 0.5)
c_y = 120 * 0.5 # 默认值(image.h * 0.5)

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

while(True):
    clock.tick()
    img = sensor.snapshot()
    for tag in img.find_apriltags(fx=f_x, fy=f_y, cx=c_x, cy=c_y): # 默认为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()))
        # 位置的单位是未知的,旋转的单位是角度
        print("Tx: %f, Ty %f, Tz %f, Rx %f, Ry %f, Rz %f" % print_args)
    print(clock.fps())

La sortie du port série est composée de 6 variables, Tx, Ty et Tz sont trois quantités de position dans l'espace, et Rx, Ry et Rz sont trois quantités de rotation.

Lectures complémentaires :

  • Depuis l'application Singtown Lab : Comment localiser/déplacer Apriltag pendant la reconnaissance ? Quelle est l’unité de sortie tx ty tz ? Comment obtenir la distance réelle ? https://forum.singtown.com/topic/52

results matching ""

    No results matching ""