Erprobte AprilTag-Muster, die für industrielle Anwendungen nützlich sind.

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

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

Was ist AprilTag?

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

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

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

Das untere linke Bild ist ziemlich nah an der Kamera, kann aber erkannt werden, wenn sich alle Tags innerhalb der Kamera befinden.
Im unteren rechten Bild haben wir die Erkennung sehr dunkel gemacht, aber Sie können sehen, dass sie richtig erkannt wird.

QR-Codes sind eher auf die Menge der Informationen spezialisiert, während AprilTag nur auf Standort- und Haltungsinformationen spezialisiert ist.
Deshalb wurde es in der Robotik eingesetzt.

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

Ein Typ von TagFamily

Es gibt verschiedene Arten von AprilTag, genannt TagFamily. Jede hat eine andere Spezifikation.
Der Grund dafür ist, dass sie je nach den Bedingungen, unter denen sie eingesetzt werden, unterschiedlich verwendet werden.

Beispiele für verschiedene Elemente in jeder TagFamilie

  • Bits (Datenkapazität)
  • Fehlerkorrekturfähigkeit
  • Tag-Größe (Anzahl der Zellen)
  • Anzahl der Tags (Anzahl der Tags in der gleichen Familie)

Sie müssen sich je nach Einsatzbedingungen entscheiden, z. B. ob die Geschwindigkeit der Tag-Erkennung wichtig ist, ob die Genauigkeit eine Priorität ist oder ob die zu druckenden Tags klein sein müssen.

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

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

FamiliennameFunktionAnzahl von Tag-IDsLeitfaden für die Verwendung
tag36h11Im Allgemeinen der am häufigsten verwendete. Hohe Fehlerkorrekturfähigkeit und einfach zu verwenden. 587Breites Spektrum an Experimenten, Robotersteuerung, AR, SLAM, usw.
TAG25H9Kompakt und geeignet für Hochgeschwindigkeitsverarbeitung. Die Fehlerkorrektur ist eher gering. 35Wenn Sie kleine Marker verwenden möchten
TAG16H5Sehr klein. Fast keine Fehlerkorrektur. 30Nur empfohlen, wenn die Verarbeitungsgeschwindigkeit eine Priorität darstellt und die Entfernung gering ist.
tagCircle21h7Kreisförmiges Design zur einfachen visuellen Identifizierung121Für spezielle Anwendungen (normalerweise nicht empfohlen)
tagStandard41h12Sehr robust. Hohe Fehlerkorrekturfähigkeit, aber auch große Größe. 211Industrielle Anwendungen, die eine hohe Zuverlässigkeit erfordern, usw.

Vier Tags für ganz unterschiedliche Zwecke empfohlen

verwenden SieEmpfohlene Familie
Allgemeine Entwicklung und TestsTAG36H11 (Allgemein)
Kleine Geräte und KleingedrucktesTAG25H9 (größenorientiert)
Pädagogische Nutzung und einfache DemonstrationTAG16H5 (geschwindigkeitsorientiert)
Werksmessungen und FernmessungentagStandard41h12 (für Robustheit)

Für einige Anwendungen gilt dies nicht, da auch der Abstand zwischen der Kamera und dem Objekt relevant ist. Die folgende Klassifizierung ist einfach zu verstehen.

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

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

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

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

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

*Die Kalibrierung ist abgeschlossen, wenn sie tatsächlich ausgeliefert wird.

AprilTagの検出テスト手順

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

Als nächstes starten Sie das vorbereitete Programm mit dem Befehl
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

Die beiden Dinge, die Sie ändern müssen, sind Tag-Größe und Port.
tag-size ist die Länge einer Seite des gedruckten Etiketts. Hier haben wir sie auf 16 cm festgelegt. Wenn Sie die tatsächliche Größe des Etiketts nicht angeben, stimmen Abstand und Ausrichtung möglicherweise nicht mit der Realität überein.
port ist die Nummer des TCP-Ports. Wenn Sie den Roboter für die Kommunikation mit dem Client verwenden, geben Sie die Portnummer an, die für diese Kommunikation verwendet werden soll. Hier ist es die Nummer 12345.

Nach dem Ausführen des Befehls öffnet sich ein weiteres Fenster und wenn Sie den gedruckten AprilTag vor die Kamera halten, erscheint ein 3D-Kasten mit einer gelben Linie.

Sie können die sich ändernden Werte in Echtzeit auf dem Bildschirm sehen.
Versuchen Sie, es zu kippen oder nach links oder rechts zu bewegen.

Dieser 3D-Kasten wird angezeigt, um das intuitive Verständnis der Position und Ausrichtung des Etiketts zu erleichtern.
Dies ist eine zusätzliche Angabe, die der visuellen Klarheit dient und nicht direkt mit dem Objekt zusammenhängt, an dem das Etikett angebracht ist.
Es ist einfacher zu sehen, wie sie sich neigen, als z.B. die Zahlen.

Die Bedeutung der auf dem Bildschirm angezeigten Zahlen ist wie folgt

X = Position in Richtung links/rechts
Y = Position in Richtung oben/unten
Z = Position in Richtung vorne/hinten (= Abstand zur Kamera)
Roll = Drehung um die X-Achse (Kippen nach links/rechts)
Pitch = Drehung um die Y-Achse (Kippen nach oben/unten)
Yaw = Drehung um die Z-Achse (horizontale Drehung um die Vorder-/Rückachse)

カメラ視点

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

Wenn das gedruckte Etikett auf verschiedene Arten bewegt wird, erscheint die 3D-Box-Anzeige ohne Verzögerung, und die Werte ändern sich als tatsächliche Messungen.
Vom Mittelpunkt aus wird eine Linie angezeigt, die den Mittelpunkt des Tags erfasst, als ob man an einer Schnur zieht. Das ist einfach interessant.

AprilTagの識別機能と設計思想

AprilTag unterscheidet sich insofern von QR Code, als es nur eine eindeutige ID für jeden Tag hat; QR Code würde eher Daten enthalten. (URL, Name, Telefonnummer, usw.)
Mit anderen Worten, es ist einfach eine Markierung, die nur eine ID (Nummer) haben kann. Es handelt sich auch um eine visuelle Markierung, die einen 3D-Kasten anzeigt.

Man kann sagen, dass eine ID sofort erkennen kann, welche von mehreren IDs sie ist, oder sie kann alle von mehreren IDs erkennen.
Die mit der ID verbundenen Daten werden extern gespeichert, so dass die Erkennungsgeschwindigkeit (Lesen) schnell ist.

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

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

少し複雑ではありますが、知っておくと理解が深まる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もあるので誤認識しにくいタグです。テストや簡易的な物に利用するのは理解できます。

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

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

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

Durch die Erkennung des physisch installierten AprilTag mit einer Kamera sind genaue 3D-Positions- (X, Y, Z) und Ausrichtungsinformationen (Rotation) bekannt.
So kann zum Beispiel ein Arbeitsroboter mit Arm ausgerichtet werden, um ein Teil zu greifen, oder um die Position eines Inspektionsziels anhand von ID-Informationen zu identifizieren.

Das Schwarz-Weiß-Muster der Tags hat den Vorteil, dass sie nicht so leicht durch Helligkeitsänderungen oder den Hintergrund des Objekts beeinträchtigt werden.
Selbst wenn der AprilTag schattiert oder leicht verschmiert ist, hat er Merkmale, die ihn leicht erkennbar machen.

Es kann auch mehrere Tags auf einmal erkennen, was die Verwaltung und Verfolgung mehrerer Objekte ermöglicht.

Objekte, die z. B. auf einem Förderband laufen, eignen sich besonders gut für diese Funktion, da sie bei hoher Geschwindigkeit in Echtzeit erkannt werden können, solange sie sich in der Reichweite der Kamera befinden. Sie kann auch verwendet werden, um Anomalien in Objekten zu erkennen.

Der Vorteil ist, dass es kostenlos und leichtgewichtig ist, so dass es leicht in eine Vielzahl von Bibliotheken integriert werden kann.
Außerdem erweitert die Möglichkeit, die Größe und den Typ des Tags je nach Anwendung auszuwählen, den Anwendungsbereich.

  1. Echtzeit-Erfassung von hochpräzisen Positions- und Orientierungsinformationen
  2. Die Erkennungsleistung wird nicht leicht von der Umgebung beeinflusst
  3. Gleichzeitige Erkennung von mehreren Tags ist möglich
  4. Geeignet für die Verfolgung und Identifizierung von beweglichen Zielen
  5. Leichte, quelloffene Implementierung verfügbar (BSD)
  6. Flexibilität in Tag-Familien.

Er kann insbesondere für die Kommissionierung mit Robotern, die Bearbeitung in der Montage und die Qualitätsprüfung von Produkten und Komponenten verwendet werden.
Die breite Front, die sowohl feste als auch dynamische Objekte aufnehmen kann, ist attraktiv.

Meiner Meinung nach sind die größten Vorteile des AprilTag seine Einfachheit und seine schnelle Erkennung, da er nur eine Markierung (ID) und keine Informationen im Tag selbst enthält.
Die Integration in bestehende Systeme wäre in einer Vielzahl von industriellen Umgebungen nützlich.

Referenz:
AprilTag ( https://april.eecs.umich.edu/software/apriltag )


記事寄稿:ラズパイダ

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