高精度タグ認識技術AprilTagを用いた距離検知

IXEの大木です。今回、AprilTagを用いた距離検知とその可能性について検証しましたので、その結果を共有します。

AprilTagについて

AprilTagは、二次元バーコードの一種で、一般的にQRコードよりも検出精度がはるかに高いとされています。
さらに、AprilTagはカメラからタグまでの距離、方向や角度なども算出できるように設計されていて、その技術は様々な分野で利用され始めています。
今回の検証では距離検知の算出にフォーカスして検証していきたいと思います。
ちなみにAprilTagに初めて触れる方や基本的なタグ検知能力に興味がある方向けに「高精度タグ認識技術AprilTagの検証とその可能性」という記事を以前書きました。AprilTagの基本的な仕組みや利用方法が気になる方は、こちらの記事を参照してください。

Tagマーカーを用いた距離測定

前述した通り、AprilTagは専用のマーカーを用いることでそのマーカーからカメラまでの相対的な距離を高精度に測定することができます。
このマーカーを物体やロボットに貼り付けることでかなり応用が利く設計になっていますね。
例えば、物流業界では倉庫内でロボットにAprilTagのマーカーを認識させることで、より細かな制御が可能になっているらしいです。
特に、物体の位置や姿勢の情報が必要となる場面での活躍が期待されてますので、自動運転の分野での利用なども考えられますね。
それでは早速、マーカーを用いた距離測定の検証に移っていこうと思います。

下記の手順に沿って、検証を進めていきます。

1. AprilTag認識プログラムの作成(前回の検証で作成済のため省略)
2. カメラキャリブレーションの実施
3. カメラキャリブレーションの精度確認
4. 距離測定の実施


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

距離測定を行う際にはAprilTagを認識するためのプログラムを用意するのはもちろん、その他にカメラのキャリブレーションを行わなくていけません。
キャリブレーションとは較正、校正などを意味していて測定器や計測器を使用する際に、標準通りの値を取得できるように調整する行為のことですね。
例えば、定規で物の長さを図る時に定規の目盛りがずれていては正確な長さが測れません。定規を使う前に目盛りの誤差を修正する行為がこのキャリブレーションということですね。
我々が普段使用しているカメラにも実は歪みが存在しています。これはカメラがレンズを通して撮影しているからです。レンズを介すことで、撮影された画像の中心から離れている箇所が少しだけ歪んで撮影されています。この歪みを修正しないと、AprilTagが示す距離も不正確なものになってしまいます。

カメラキャリブレーションでは一般的にチェスボードの画像が使用されます。
以下は私が今回のカメラキャリブレーションに使用した画像です。

この画像を印刷して、平らなアクリル板などに貼り付けてカメラで様々な角度から撮影します。
キャリブレーションに使用する画像は多いほうが精度が上がるとされています。私は十数枚ほど撮影しました。
以下の点に気を付けて画像を用意しました。
・撮影時にカメラに照明が入り込まないようにする
・撮影した画像をグレースケール化し色合いを均一化する
つまり、キャリブレーションの素材となる画像はできるだけシンプルなほうが良いということですね。
色の情報をなくし、照明の反射や影の影響をなくすことでチェスボードをより正確に読む込ませる目的があります。
以下の画像は私が実際に使用したカメラキャリブレーション用の画像です。

これらの画像が用意できたら、PythonとOpenCVライブラリを利用してカメラキャリブレーションを実施します。
npy形式で取得したパラメータを保存します。このパラメータをAprilTag認識プログラムに読み込ませることで距離検知が可能になります。

カメラキャリブレーションの精度確認

カメラキャリブレーションがうまくいっているかどうかを確認するために再投影誤差を確認します。
カメラキャリブレーションは、実際の3Dの物体(今回の場合はチェスボード)をカメラで撮影したときに、その物体が画像上のどこに映るかを正確に知るための手法です。そして、この精度確認では2Dの画像に3Dオブジェクトを再度投影することで、実際の3Dの物体の位置と再投影されたオブジェクトの位置にどれくらい誤差があるかを検証します。この誤差の値が低いほど、キャリブレーションが正確に行えていると言えます。
実際には以下のような処理をPythonで用意します。

1. キャリブレーションで取得したパラメータを読み込む
2. パラメータを利用して、3Dオブジェクトを2D画像上に再投影する
3. 実際の画像上の物体の位置と、再投影された3Dオブジェクトの位置の誤差を検出する

今回のカメラキャリブレーションの再投影誤差を確認したところ以下のような結果が得られました。
 再投影誤差:0.10372784557614956

0に近いほどキャリブレーションが高精度ということになるので良い結果が得られました。
ちなみに、部屋の照明を付けて素材の画像をグレースケール化しないで結果を確認したところ、0.3・・・・と
再投影誤差が大きくなることも確認できました。

距離測定を実施

実際にAprilTagを使用して距離の測定を行います。先ほどのキャリブレーションで取得したパラメータを使用して、物体とカメラの距離をリアルタイムで計算します。
実際の検証動画を見てみましょう。

約1.8m離れた位置から撮影を開始して、最大で約10cmの距離までマーカーを近づけてみました。
検証動画から分かるように誤差±1cm以内の精度でマーカーまでの距離を検知することができています。
私の撮影環境では太陽光がマーカーに当たってしまっていたのですが、それでもかなりの精度で距離を正確に検知できているようでした。
多少、マーカーが斜めに映り込んだとしても高速・高精度で距離を出してくれるのがすごいですね。
工場オートメーションの分野での活躍が期待されている理由が分かりました。

まとめ

キャリブレーションを行ったカメラとAprilTagを組み合わせることで高精度の距離測定を実現することができました。
実際にこの技術に触れてみて、物流業界や自動運転などの分野で利用されていることは知っていましたが
精度の高さや関連ライブラリの豊富さから、アイデア次第で様々なことに応用できると感じました。

現在、AprilTagを利用して何か社会のお役に立つことはできないか?と弊社メンバー内で可能性を模索中です。
今後も、このような新しい技術の検証を通じて、社内の技術力向上 及び その技術を社会に提供できる組織を目指していきます。
AprilTag以外にも、弊社では様々な技術検証に日々取り組んでおります。
なにかやってみたい!等、ございましたら、遠慮なくご相談ください。

AprilTagはミシガン大学によって開発され、BSDライセンスの下で提供されており、著作権表示およびライセンス条項の遵守が必要です。
弊社の技術記事は、良識のある範囲で断りなくリンクや引用を行っていただいて構いません。