AprilTag 技術者向け情報

IXEの古賀です。最近 多方面からAprilTagに関する組み込み相談等ありますので、今回AprilTagの技術情報ポイントをまとめます。技術者向けの情報ですので、開発に活用したい方はご参考にしてみてください。

タグの種類について

タグの種類について、ミシガン大学より公開しているソースコードに標準搭載されているのタグは下記のとおりです。
tag16h5
tag25h9
tag36h11
tagCircle21h7
tagCircle49h12
tagCustom48h12
tagStandard41h12
tagStandard52h13

これらのタグの種類を”TagFamily”と呼びます。これらのタグ以外にもユーザーよりタグを定義・生成することが可能です。標準搭載タグのそれぞれの特徴を示します。

タグの名称特徴タグID数誤検出率検出速度
tag16h5小さいタグサイズで、迅速な検出が可能。30
tag25h9バランスの取れたサイズと検出性能。35
tag36h11高い誤検出耐性と優れた検出性能。587中~低
tagCircle21h7円形のタグで、特定の角度や距離からの視認性が向上。37
tagCircle49h12円形のタグで、tagCircle21h7よりも多くのデータビットを持ちます。65534
tagCustom48h12ユーザー定義のタグファミリーで、柔軟性が高い。ユーザー定義低〜中中〜低
tagStandard41h12標準的なタグファミリーで、一般的な用途に適しています。2114
tagStandard52h13大規模なアプリケーション向けに設計されたタグファミリー。48713

なお、16h5等のタグの意味については、16はデータビット数を指し5はハミングビットを指します。データビットとは、タグそのものの情報を指します。この桁数が多いほど、データの表現の幅が増えます。ハミングビットとは、エラー訂正に使用されるビットです。この桁数が多いほど、誤りを検知し停止することができます。

試しに、「tagCircle49h12」のタグを検知してみました。下記動画を参照ください。他の記事で上げている動画は一番検知力が高いタグがメインですが、それと比較して検知力が弱いことが分かります。目的に応じたタグを選択することがポイントです。

なお、タグについては下記よりダウンロードできます。
https://github.com/AprilRobotics/apriltag-imgs
ソースコードの定義タグ数とGIT上のタグ数が異なる理由は調べていません。


なお、タグの内側と外側では役割が異なります。タグの外側はタグを読み込み検知をしやすくする役割と、タグの姿勢(位置と向き)を把握するために使用されています。タグの内側はデータ領域 タグIDやハミングコードが含まれます。

タグの検知処理について

タグの検知処理は大きく分けて下記のステップを実行しています。

1.画像の前処理
 グレースケール変換:色情報を削除し、白から黒までの灰色の階調を持つ画像へ変換。 ガウシアンブラー: ノイズを減少させ、エッジ検出の精度を向上させます。

2.エッジ検出
 画像からエッジを検出する処理を実行します。

3.セグメンテーション
 エッジ加工した画像を用いて、画像内の異なる部分を特定・分割する処理です。

4.四角形の検出
 検出されたエッジから四角形を見つけます。これは通常、領域の境界を追跡し、角度が直角に近い頂点を持つ閉じたループを探すことで行われます。

5.タグのパターン検出
 四角形の内部パターンを解析し、AprilTagライブラリ内に記述されているパターンとマッチしたタグIDを検索します。パターン検出では、タグを90度に回転させながら、検知処理を実行します。

6.座標の推定
 検出されたタグの四隅・外側の情報を用いて、カメラに対するタグの位置を推定します。なお、距離の測定や角度の測定については、カメラの解像度や歪み等を事前キャリブレーションを行い内部のキャリブレーションデータを用いる必要があります。

7.検知結果の出力
 1~6の処理で得たタグ情報をユーザープログラムへ渡します。

ーーー

照明の明るさの影響を受ける理由は、1・2の前処理の影響を受けやすいからですね。現場環境に応じて、各パラメータを調整しましょう。

パフォーマンスと最適化

ミシガン大学のライブラリではいくつかの調整パラメータを準備されています。しかしながら、カメラの性能も大きく依存しますので、精度を求める場合はカメラをしっかり選定ください。特に動く物体については、カメラの性能によって著しく差が出ます。

ライブラリ内の調整パラメータをポイントを絞って説明します。引用元はミシガン大学のGITコメントです。
https://github.com/AprilRobotics/apriltag

①処理速度改善

 quad_decimateは元の画像を圧縮します。1は未圧縮。2は半分。4は4分の1といったイメージですね。
 処理速度を早くする代わりに、検知距離が短くなります。また、CPUコア数が複数ある場合は、nthreads増やすことで、複数スレッドで動作させることが可能です。

②検出距離を延ばす
 ・quad_decimateを1にする。
 ・カメラの性能を高解像度のものにする。
 等が素早く実現する方法です。
 ただし、細かいレベルでのチューニングを実施する場合は、ライブラリのデバッグモードをONにすることで画像ファイルを出力することができます。その画像ファイルを参照し、タグの検出状況を確認しながらdecode_sharpeningの値やquad_sigmaの値を調整していきましょう。


以上、ざっくりとした技術紹介でしたが、皆様の開発のお役に立てれば幸いです。