Monitoraggio dei tag AprilTag
Tutorial video 11 - Monitoraggio dei tag AprilTag: https://singtown.com/learn/49590/
Tutorial video 21 - Auto che insegue altri oggetti: https://singtown.com/learn/50041/
Introduzione ad AprilTag
Informazioni: https://april.eecs.umich.edu/software/apriltag.html
AprilTag è un sistema di benchmark visivo che può essere utilizzato per una varietà di attività tra cui AR, robotica e calibrazione della fotocamera.Il tag può essere stampato direttamente con una stampante e il programma di rilevamento AprilTag può calcolare la posizione 3D, l'orientamento e l'ID precisi rispetto alla fotocamera.Per OpenMV, questo è particolarmente utile!Probabilmente assomiglia a questo:
Per dirla semplicemente, finché il tag è collegato al target, la posizione 3D e l'ID del tag possono essere identificati su OpenMV.
Tipi di AprilTag
Il tipo di AprilTag si chiama famiglia e sono disponibili i seguenti tipi:
TAG16H5 → da 0 a 29\ TAG25H7 → da 0 a 241\ TAG25H9 → da 0 a 34\ TAG36H10 → da 0 a 2319\ TAG36H11 → da 0 a 586\ ARTOOLKIT → da 0 a 511\ In altre parole esistono 30 famiglie di TAG16H5, ciascuna delle quali ha un ID corrispondente, che va da 0 a 29.
Allora quali sono le differenze tra le diverse famiglie?
Ad esempio, l'area effettiva di TAG16H5 è 4 x 4 quadrati, quindi può vedere più lontano di TAG36H11 (perché ha 6 x 6 quadrati). Tuttavia, il tasso di errore di TAG16H5 è molto più elevato di quello di TAG36H11, poiché TAG36H11 dispone di più informazioni di verifica. Pertanto, se non vi sono altri motivi, si consiglia di utilizzare TAG36H11**.
Crea AprilTag
È molto semplice. Puoi scaricarlo da Internet o generarlo direttamente dall'IDE OpenMV. Seleziona la famiglia in Strumenti-Machine Vision-AprilTag Generate. Si consiglia di utilizzare TAG36H11.
Quindi, inserisci il numero che deve essere generato. Ad esempio, se hai bisogno di 10, genera immagini con ID da 0 a 9.
Quindi seleziona la cartella in cui sono archiviate le immagini e il gioco è fatto.
Quindi, le immagini verranno generate in questa cartella.
Infine, stampa l'immagine con una stampante (ovviamente puoi anche utilizzare direttamente lo schermo, ma potrebbe essere riflettente).
programma
# 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)
Come puoi vedere, puoi identificare l'id come 0, l'angolo di rotazione e la posizione.\
Posizionamento 3D
La cosa più sorprendente di AprilTag è la funzione di posizionamento 3D che può conoscere la posizione spaziale del Tag. Ci sono un totale di 6 gradi di libertà, tre posizioni e tre angoli.
# 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())
L'output della porta seriale è di 6 variabili, Tx, Ty e Tz sono tre quantità di posizione nello spazio e Rx, Ry e Rz sono tre quantità di rotazione.
Ulteriori letture:
- Dall'APP Singtown Lab: come individuare/intervallo Apriltag durante l'identificazione?Qual è l'unità dell'output tx ty tz?Come si ottiene la distanza effettiva?https://forum.singtown.com/topic/52