Seguimiento de etiquetas AprilTag
Tutoriel vidéo 11 - Suivi des balises AprilTag : https://singtown.com/learn/49590/
Vídeo tutorial 21 - Coche persiguiendo otros objetos: https://singtown.com/learn/50041/
Introducción a AprilTag
Información: https://april.eecs.umich.edu/software/apriltag.html
AprilTag es un sistema de referencia visual que se puede utilizar para una variedad de tareas que incluyen AR, robótica y calibración de cámaras. La etiqueta se puede imprimir directamente con una impresora y el programa de detección AprilTag puede calcular la posición, orientación e identificación 3D precisas en relación con la cámara. ¡Para OpenMV, esto es especialmente útil! Probablemente se vea así:
En pocas palabras, siempre que la etiqueta esté adjunta al objetivo, la posición 3D y la identificación de la etiqueta se pueden identificar en OpenMV.
AprilTag un poco
El tipo de AprilTag se llama familia y existen los siguientes 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\ En otras palabras, hay 30 familias de TAG16H5, cada una de las cuales tiene un ID correspondiente, que va del 0 al 29.
Entonces, ¿cuáles son las diferencias entre diferentes familias?
Por ejemplo, el área efectiva de TAG16H5 es de 4 x 4 cuadrados, por lo que puede ver más lejos que TAG36H11 (porque tiene 6 x 6 cuadrados). Sin embargo, la tasa de error de TAG16H5 es mucho mayor que la de TAG36H11, porque TAG36H11 tiene más información de verificación. Por lo tanto, si no hay otra razón, se recomienda utilizar TAG36H11.
Hacer AprilTag
Es muy simple. Puedes descargarlo de Internet o generarlo directamente desde el IDE de OpenMV. Seleccione la familia en Herramientas——Machine Vision——AprilTag Generate. Se recomienda utilizar TAG36H11.
Luego, complete el número que debe generarse. Por ejemplo, si necesita 10, genere imágenes con los ID del 0 al 9.
Luego selecciona la carpeta donde se almacenan las imágenes y listo.
Luego, se generarán imágenes en esta carpeta.
Finalmente, imprime la imagen con una impresora (por supuesto, también puedes usar la pantalla directamente, pero puede ser reflectante).
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 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)
Como puede ver, puede identificar la identificación como 0, el ángulo de rotación y la posición.\
posicionamiento 3D
Lo más sorprendente de AprilTag es la función de posicionamiento 3D. Puede conocer la posición espacial de la Etiqueta. Hay un total de 6 grados de libertad, tres posiciones y tres á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 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 salida del puerto serie tiene 6 variables, Tx, Ty y Tz son tres cantidades de posición en el espacio, y Rx, Ry y Rz son tres cantidades de rotación.
Lectures complémentaires :
- Depuis l'application Xingtong 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