AprilTag-Tag-Tracking
Video-Tutorial 11 – AprilTag-Tag-Tracking:https://singtown.com/learn/49590/
Video-Tutorial 21 – Auto jagt andere Objekte: https://singtown.com/learn/50041/
Einführung in AprilTag
Informationen:https://april.eecs.umich.edu/software/apriltag.html
AprilTag ist ein visuelles Benchmark-System, das für eine Vielzahl von Aufgaben verwendet werden kann, darunter AR, Robotik und Kamerakalibrierung. Der Tag kann direkt mit einem Drucker ausgedruckt werden und das AprilTag-Erkennungsprogramm kann die genaue 3D-Position, Ausrichtung und ID relativ zur Kamera berechnen. Für OpenMV ist das besonders nützlich. Es sieht so aus:
Einfach ausgedrückt: Solange das Tag am Ziel angebracht ist, können die 3D-Position und die ID des Tags in OpenMV identifiziert werden.
Arten von AprilTag
Der AprilTag-Typ heißt Familie und es gibt die folgenden Typen:
TAG16H5 → 0 to 29\ TAG25H7 → 0 to 241\ TAG25H9 → 0 to 34\ TAG36H10 → 0 to 2319\ TAG36H11 → 0 to 586\ ARTOOLKIT → 0 to 511\ Mit anderen Worten: Es gibt 30 Familien von TAG16H5, von denen jede eine entsprechende ID im Bereich von 0 bis 29 hat.
Was sind also die Unterschiede zwischen verschiedenen Familien?
Beispielsweise beträgt die effektive Fläche von TAG16H5 ein 4x4-Quadrat, sodass es weiter sehen kann als TAG36H11 (da es 6x6-Quadrate hat). Allerdings ist die Fehlerrate von TAG16H5 viel höher als die von TAG36H11, da TAG36H11 über mehr Verifizierungsinformationen verfügt. Wenn also kein anderer Grund vorliegt, wird die Verwendung vonTAG36H11 empfohlen .
ProductionAprilTag
Es ist ganz einfach. Sie können es aus dem Internet herunterladen oder direkt aus der OpenMV-IDE generieren. Wählen Sie die Familie unter „Extras – Mac Vision – AprilTag generieren“ aus. Es wird empfohlen, TAG36H11 zu verwenden.
Geben Sie dann die zu generierende Zahl ein. Wenn beispielsweise 10 benötigt werden, werden Bilder mit den IDs 0–9 generiert.
Wählen Sie dann den Ordner aus, in dem die Bilder gespeichert sind, und fertig.
Anschließend werden in diesem Ordner Bilder generiert.
Drucken Sie das Bild abschließend mit einem Drucker aus (Sie können natürlich auch direkt den Bildschirm verwenden, dieser kann jedoch spiegelnd sein).
Programm
# 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)
Wie Sie sehen, können Sie die ID als 0, den Drehwinkel und die Position identifizieren\
3D-Positionierung
Das Erstaunlichste an AprilTag ist die 3D-Positionierungsfunktion. Sie kann die räumliche Position des Tags ermitteln. Es gibt insgesamt 6 Freiheitsgrade, drei Positionen und drei Winkel.
# 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())
Der Ausgang der seriellen Schnittstelle besteht aus 6 Variablen, Tx, Ty und Tz sind drei Positionsgrößen im Raum und Rx, Ry und Rz sind drei Rotationsgrößen.
Weiterführende Literatur:
- Von der Singtown Lab APP: Wie kann man Apriltag während der Identifizierung lokalisieren/einordnen? Was ist die Einheit der Ausgabe tx ty tz? Wie ermittelt man die tatsächliche Entfernung? https://forum.singtown.com/topic/52