Отслеживание тегов AprilTag

Видеоурок 11. Отслеживание тегов AprilTag: https://singtown.com/learn/49590/
Видеоурок 21. Автомобиль преследует другие объекты: https://singtown.com/learn/50041/

Знакомство с AprilTag

Информация: https://april.eecs.umich.edu/software/apriltag.html

AprilTag — это система визуального тестирования, которую можно использовать для решения различных задач, включая дополненную реальность, робототехнику и калибровку камеры. Метку можно распечатать непосредственно на принтере, а программа обнаружения AprilTag может рассчитать точное трехмерное положение, ориентацию и идентификатор относительно камеры. Для OpenMV это особенно полезно! Вероятно, это выглядит так:

Проще говоря, пока тег прикреплен к цели, трехмерное положение и идентификатор тега можно определить в OpenMV.

Виды AprilTag

Тип AprilTag называется семейным, и существуют следующие типы:

TAG16H5 → от 0 до 29\ TAG25H7 → от 0 до 241\ TAG25H9 → от 0 до 34\ TAG36H10 → от 0 до 2319\ TAG36H11 → от 0 до 586\ АРТУНКИТ → от 0 до 511\ Другими словами, существует 30 семейств TAG16H5, каждое из которых имеет соответствующий идентификатор в диапазоне от 0 до 29.

Так в чем же различия между разными семьями?

Например, эффективная площадь TAG16H5 составляет 4 x 4 квадрата, поэтому он может видеть дальше, чем TAG36H11 (потому что у него квадраты 6 x 6). Однако частота ошибок TAG16H5 намного выше, чем у TAG36H11, поскольку TAG36H11 имеет больше проверочной информации. Поэтому, если нет другой причины, рекомендуется использовать TAG36H11**.

Сделать AprilTag

Это очень просто. Вы можете скачать его из Интернета или сгенерировать непосредственно из OpenMV IDE. Выберите семейство в меню «Инструменты-Machine Vision-AprilTag Generate». Рекомендуется использовать TAG36H11.

Затем введите число, которое необходимо сгенерировать. Например, если вам нужно 10, сгенерируйте изображения с идентификаторами 0–9.

Затем выберите папку, в которой хранятся картинки и все.

Затем в этой папке будут созданы изображения.

Наконец, распечатайте изображение на принтере (конечно, вы также можете использовать непосредственно экран, но он может быть отражающим).

программа

# 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)

Как видите, вы можете определить идентификатор как 0, угол поворота и позицию.\

3D-позиционирование

Самое удивительное в AprilTag — это функция 3D-позиционирования. Она может определять пространственное положение тега. Всего имеется 6 степеней свободы, три положения и три угла.

# 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())

Выход последовательного порта представляет собой 6 переменных: Tx, Ty и Tz — три величины положения в пространстве, а Rx, Ry и Rz — три величины вращения.

Дальнейшее чтение:

  • Из приложения Xingtong Lab: Как найти/ранжировать Apriltag во время идентификации? Какова единица выходного сигнала tx ty tz? Как узнать фактическое расстояние? https://forum.singtown.com/topic/52

results matching ""

    No results matching ""