试用过的 AprilTag 样品可用于工业应用。

産業用Raspberry Pi「PL-R4」にカメラを繋ぎ、PiLink株式会社で用意したサンプルプログラムを使い、印刷したAprilTagを検出させてみました。
AprilTagの仕組みは、カメラによる位置情報や姿勢を高精度に検出する単純なものです。一見シンプルな仕組みに見えますが、実際には奥深い設計思想と多彩な用途があります。そのため、すべてをご紹介することはできません。

「AprilTagってなに?」、「自社の現場で取り入れられないかな?」とお考えの方に向けて、試した限りではありますが、基本部分に沿った内容でご紹介します。

AprilTagとは

AprilTagは、2011年頃に米国ミシガン大学の研究チーム(主にEdwin Olson氏の研究グループ)によって開発されました。
名前の「April」は、「4月」の意味ですが、”4月にプロジェクトを始めたから”といった軽い理由で名付けられたとされています。
つまり、名称自体には深い意味はありません。

AprilTagは、一見するとQRコードに似ています。二次元バーコードの種類という意味でも似ています。
どうやらQRコードよりも小さいデータ(4ビットから12ビット)を扱うために設計され、検出の精度が高いことや、計算が速くリアルタイム制であること、遠くからの検出も可能な点が特徴的です。
暗かったり、低コントラストでも読み取ることが可能です。

サンプルプログラムを使うと分かるのですが、AprilTagをカメラで捉えると、カメラに対する正確な3D位置をリアルタイムで計算し表示できます。
かなりの精度だと思いました。
3Dボックスを表示させるわけですけど、Raspberry Piでもかなりスムーズです。
3Dボックスを表示させるわけですけど、Raspberry Piでもかなりスムーズです。

左下の画像はかなりカメラに近いのですが、タグが全てカメラ内に収まっていれば認識できます。
右下の画像は、とても暗くして検出させましたが、きちんと認識されているのが分かります。

QRコードはむしろ情報量に特化しており、AprilTagは位置や姿勢情報だけに特化しています。
そのためロボティクスで利用されてきました。

その意味でも、ミドルウェアのROSを介して利用されるのが一般的です。
ただ、AprilTagのライブラリはC言語で書かれているため、簡単な画面・操作インターフェイスであれば、C++やPythonのスタンドアロンで手軽に利用できます。
今回のようにテスト目的であれば、Pythonプログラムを使ったRaspberry Pi でも手軽に扱うことができます。
産業用Raspberry Piであれば各現場に導入できますね。

TagFamily(タグファミリー)という種類

AprilTagにも種類があります。TagFamilyと呼ばれます。それぞれ仕様が異なります。
使う条件によって使い分けるためです。

各TagFamilyの異なる要素例

  • ビット数(データ容量)
  • 誤り訂正能力
  • タグのサイズ(セル数)
  • タグ数(同じファミリーに含まれるタグの個数)

タグを検出する速度を重視するのか、精度を優先するのか、または印刷するタグは小さくても良いのか、といった利用条件で選ぶ必要が出てきます。

今回使用したのはtag36h11で、一般的な種類です。
処理速度も中程度なので、先ずはこのtag36h11がテストにはうってつけです。

TagFamily(タグファミリー)の種類と特徴

ファミリー名特徴タグID数用途の目安
tag36h11一般的に最もよく使われる。誤り訂正能力が高く、使いやすい。587実験、ロボット制御、AR、SLAMなど幅広く
tag25h9コンパクトで高速処理向き。誤り訂正はやや低め。35小型マーカーを使いたいとき
tag16h5非常に小さい。誤り訂正はほぼなし。30処理速度優先・距離が近いときのみ推奨
tagCircle21h7円形のデザインで、視覚的な識別がしやすい121特殊な用途向け(通常は推奨されない)
tagStandard41h12非常に堅牢。誤り訂正能力が高いがサイズも大きめ。211高信頼性が求められる産業用途など

大まかに用途別で推奨されるタグ4つ

用途推奨ファミリー
開発・テスト全般tag36h11(一般的)
小型機器や小さい印刷物tag25h9(サイズ重視)
教育用途・簡易なデモtag16h5(速度重視)
工場や長距離の読み取りtagStandard41h12(堅牢性重視)

カメラと対象物の距離も関係してくるため、用途によってはこの限りではありません。おおよそ、このように分類して考えると理解しやすいです。

カメラのキャリブレーション

カメラを繋いだ後、早速試してみたいところですが、最初にカメラのキャリブレーションをします。これもAprilTagの特徴の1つで、この機能により正確な3D位置を計算できます。
今回のPiLink株式会社で用意したプログラムでは、以下のコマンドで実行させました。

python /home/pi/Projects/live_calibration.pu --calibration_name calibration

キャリブレーション用にチェッカーフラッグをカメラで捉えると、線と点が表示され、ステータス文字の色も赤から緑になるので分かりやすいです。

この状態でEキーでキャプチャーできます。
0/20と表示されているように20回のキャプチャーが必要です。角度や上下左右の向きを変えながら20回Eキーを押しましょう。
20回が終了すると自動的にプログラムは終了します。
calibration.npzファイルが作成されていれば完了です。

※実際に出荷する際、キャリブレーションは完了した状態です。

AprilTagの検出テスト手順

使用するタグ(tag36h11)のPDFファイルを以下からダウンロードして印刷します。段ボール紙などに貼り付けると安定して検出できます。
https://github.com/shengwen-tw/apriltag/blob/master/tag36h11.pdf

次に、コマンドで用意されたプログラムを起動します。
python3 /home/pi/pi_apriltag/estimation_final.py --source 0 --tag-size 16.0 --calibration_file /home/pi/pi_apriltag/calibration.npz --draw --port 12345

変更するのは、tag-sizeとport です。
tag-sizeは、実際に印刷したタグの一辺の長さです。ここでは16cmにしました。実際のタグサイズを指定しないと、距離・姿勢が現実と合わなくなる可能性があります。
portは、TCPポート番号のことです。もしもクライアントとの通信でロボットを使うなら、その通信で使うポート番号を指定します。ここでは12345番です。

コマンドを実行後、別のウィンドウが立ち上がり、カメラの前に印刷したAprilTagをかざすと黄色い線で3Dボックスが表示されます。

画面内に、リアルタイムで変化する数値が確認できるのが分かります。
傾けたり左右に動かしてみてください。

この3Dボックスは、タグの位置・姿勢を直感的に理解しやすくするために表示されます。
視覚的に分かりやすく示すための補助表示のため、タグが添付された対象物とは直接に関係はありません。
数値よりも傾いている様子などは分かりやすいですね。

画面に表示される数値の意味は次の通りです。

X = 左右方向の位置
Y = 上下方向の位置
Z = 前後方向の位置(=カメラとの距離)
Roll = X軸回りの回転(左右に傾ける)
Pitch = Y軸回りの回転(上下に傾ける)
Yaw = Z軸回りの回転(前後軸回りの水平回転)

カメラ視点

       y (上下)
        ↑
        |
        |     
        +------→ x (左右)
       /
      /
     z (前後) ← カメラの「向いている方向」

印刷されたタグを様々に動かすと、何の遅れもなく3Dボックス表示がされ、数値も実際の計測値として変化していきます。
中心の点から線が表示され、糸を引くようにタグの中心を捉えています。単純に面白いですね。

AprilTagの識別機能と設計思想

AprilTagは、タグごとに 一意のIDを持つだけの点がQRコードと全く異なる点です。QRコードはむしろデータを持たせます。(URL、氏名、電話番号など)
つまり、単にID(数値)を1つだけしか持てないマーカーです。それも3Dボックスを表示する視覚マーカーです。

あるIDが複数の中からどれかを瞬時に判別できるとも言えますし、複数のIDをすべて判別できるとも言えます。
あくまでもIDだけで、それに紐付くデータは外部に持たせているため、検出(読込み)速度が速いわけですね。

外部にもたせるデータを既存システムと捉えれば、後付けする仕組みとして検討できるのではないでしょうか。

データ構成と誤り訂正(ハミング距離)の仕組み

少し複雑ではありますが、知っておくと理解が深まるbit(ビット)のお話を解説しておきます。
ビットは2進数1桁も意味します。

先程のtag36h11を例にすると、36という数字はデータビットが36bit(2進数の36桁分)を表しています。
h11は ハミング距離11bit を表しています。

ハミング距離とは、2つのビット列の「異なるビットの数」 を意味し、h11だと11個のbit(2進数の11桁分)が異なるIDを使っていることになります。

少ない桁数の方が分かりやすいですね。6bitで考えてみます。

例:2つのビット列6個(6bit)で表したハミング距離

101010 ↔ 101110 → ハミング距離 = 1
101010 ↔ 010101 → ハミング距離 = 6

ハミング距離が1だとすると、1ビット(1列)しか異ならないIDのため、万が一ノイズなどでタグが壊れて読まれてしまうと、同じIDと誤認識してしまう恐れが出てきます。確かに、101010101110は似てますよね。

仮に1bitだけ間違えても、似たようなビット列がなければ誤認識しない仕組みです。
ハミング距離が6bitだと、全桁が異なるため、仮にタグがすべて読み取れなくても推測できます。
ハミング距離が11bitもあれば、確かに間違えなさそうですよね。

一般的なグループに入るtag36h11は、データビット数が多いため持てるIDの数も587個と多く、ハミング距離が11bitもあるので誤認識しにくいタグです。テストや簡易的な物に利用するのは理解できます。

データビット数が小さければ、検出の速度が上がると同時に、タグ自体も小さな印刷で済みます。その分だけ誤り訂正が少ないため、あまり速く移動する対象物や、カメラより遠い対象物だと検出できないかもしれません。

タグはどれが優れているというより、用途によって選ぶことになります。

産業利用の活用ポイントと可能性

物理的に設置したAprilTagをカメラで認識することで、正確な3次元位置(X, Y, Z)と姿勢(回転)情報が分かります。
例えば、部品を把持するためにアーム型作業用ロボットの位置合わせを行ったり、ID情報から検査対象の位置を特定する活用法が考えられます。

黒白パターンのタグのため、明るさの変化や対象物の背景に影響されにくい利点もあります。
AprilTagに影がかかったり、多少の汚れがあっても認識しやすい特徴があります。

一度に複数のタグを認識することもでき、複数の対象物の管理や追跡が可能になります。

ベルトコンベアに流れてくるような対象物も、カメラの範囲に収まれば、リアルタイムに高速で検出ができるため、特に向いている特徴があります。対象物の異常検出としても利用できるでしょう。

無料かつ軽量なライブラリが充実しているため、組み込みやすい利点もあります。
さらに、用途に応じてタグの大きさや種類を選択できるのも活用する範囲が広がります。

  1. 高精度な位置・姿勢情報をリアルタイムで取得
  2. 環境に左右されにくい認識性能
  3. 複数タグの同時認識が可能
  4. 動く対象の追跡や識別に向いている
  5. 軽量でオープンソースの実装ができる(BSD)
  6. タグファミリーで柔軟に対応できる

具体的には、ロボット機械でのピッキング、組み立ての工程作業、製品・部材の品質検査などで活用できそうです。
対象物が固定されていても、動的な場合も対応できる間口の広さが魅力的です。

AprilTagは情報をタグ自体に持たせずに、マーカー(ID)のみというシンプルさと高速検出が最大の特徴に感じました。
既存のシステムに組み込むことで、様々な産業現場で役立つでしょう。

参考:
AprilTag(https://april.eecs.umich.edu/software/apriltag


記事寄稿:ラズパイダ

非エンジニアでも楽しく扱えるRaspberry Pi 情報サイト raspida.com を運営。ラズベリーパイに長年触れた経験をもとに、ラズベリーパイを知る人にも、これから始めたいと興味を持つ人にも参考になる情報・トピックを数多く発信。PiLinkのサイトへは産業用ラズベリーパイについて技術ブログ記事を寄稿。