AprilTagタグの追跡

動画チュートリアル11 - AprilTagの追跡: https://singtown.com/learn/49590/
動画チュートリアル21 - 他の物体を追いかける車: https://singtown.com/learn/50041/

AprilTagの紹介

参考情報:https://april.eecs.umich.edu/software/apriltag.html

AprilTagは、AR、ロボティクス、カメラキャリブレーションなど、さまざまな用途に利用できる視覚的な基準(マーカー)システムです。このタグはプリンターで直接印刷でき、AprilTag検出プログラムはカメラを基準とした正確な3D位置、姿勢、そしてIDを計算できます。OpenMVにとって、これは特に有用な機能です!次のような見た目をしています。

簡単に言えば、対象物にこのタグを貼り付けておくだけで、OpenMV上でこのタグの3D位置とIDを識別できるようになります。

AprilTagの種類

AprilTagの種類はファミリーと呼ばれ、以下の種類があります。

TAG16H5 → 0~29\ TAG25H7 → 0~241\ TAG25H9 → 0~34\ TAG36H10 → 0~2319\ TAG36H11 → 0~586\ ARTOOLKIT → 0~511\ つまり、TAG16H5には30種類あり、それぞれに0から29までの対応するIDが割り当てられています。

では、異なるファミリー間にはどのような違いがあるのでしょうか?

例えば、TAG16H5の有効エリアは4×4ブロックであるため、6×6ブロックのTAG36H11よりも遠くまで認識できます。しかし、TAG36H11の方が検証用の情報が多いため、TAG16H5の誤検出率はTAG36H11よりもはるかに高くなります。したがって、特別な理由がない限り、TAG36H11の使用を推奨します

AprilTagの作成

とても簡単です。インターネットからダウンロードすることもできますし、OpenMV IDEから直接生成することもできます。Tools(ツール)- Machine Vision(マシンビジョン)- AprilTag Generate(AprilTag生成)でファミリーを選択します。TAG36H11の使用を推奨します。

次に、生成したい数を入力します。例えば10個必要であれば、ID 0~9の画像が生成されます。

続いて、画像を保存するフォルダを選択すれば完了です。

すると、そのフォルダ内に画像が生成されます。

最後に、プリンターで画像を印刷します(もちろん画面をそのまま使用することも可能ですが、光を反射してしまう場合があります)。

プログラム

# AprilTags Example
#
# この例は、OpenMV CamがOpenMV Cam M7上でApril Tagsを検出できることを示しています。
# M4版ではApril Tagsを検出できません。

import csi, image, time, math
csi0 = csi.CSI()

csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QQVGA) # 解像度がこれより大きいとメモリが不足します…
csi0.snapshot(frames=30)
csi0.auto_gain(False)  # 画像の白飛びを防ぐためオフにする必要があります…
csi0.auto_whitebal(False)  # 画像の白飛びを防ぐためオフにする必要があります…
clock = time.clock()

while(True):
    clock.tick()
    img = csi0.snapshot()
    for tag in img.find_apriltags(): # "families"を指定しない場合、デフォルトはTAG36H11です。
        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)

ご覧のように、IDが0であること、回転角度、そして位置を識別できます。\

3D位置測定

AprilTagの最も優れた点は、タグの空間上の位置を3つの並進成分と3つの回転角度、合計6自由度で把握できる3D位置測定機能です。

# AprilTags Example
#
# この例は、OpenMV CamがOpenMV Cam M7上でApril Tagsを検出できることを示しています。
# M4版ではApril Tagsを検出できません。

import csi, image, time, math
csi0 = csi.CSI()

csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QQVGA) # 解像度がこれより大きいとメモリが不足します…
csi0.snapshot(frames=30)
csi0.auto_gain(False)  # 画像の白飛びを防ぐためオフにする必要があります…
csi0.auto_whitebal(False)  # 画像の白飛びを防ぐためオフにする必要があります…
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 = csi0.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は空間内の3つの位置量、Rx、Ry、Rzは3つの回転量です。

さらに詳しく:

  • Singtown Lab APPより:AprilTag認識で位置・距離を測定するにはどうすればよいですか?出力されるtx、ty、tzの単位は何ですか?実際の距離を求めるにはどうすればよいですか? https://forum.singtown.com/topic/52

results matching ""

    No results matching ""