なんとなく

誰得感満載な記事が多いかも。Mono関係とLinuxのサーバ関係、レビューとか。

#アベノマスク にARマーカーをつけて視点移動してみた

はじめに

早々とゴールデンウィークにアベノマスクが届いたのだけど、マスクとしては使えないので、なにか他の用途を模索していた。 世帯単位で考えれば微々たるものとはいえ税金使われているわけだから。

そこで、最近Opentrackを使用した視点移動をしていて、普段はLEDマーカーを使っているのだけど、OpentrackはマーカーとしてARマーカーも使用できる。 ネットで検索するとARマーカーを印刷したものをダンボール貼り付けてカチューシャや帽子にとめる方法がどうやら多数派のようだ。

ただ、ARマーカーをつけるのが頭じゃなくてもいいなら、平面ぽいアベノマスクでも可能なのではないかと思い始め、実際に写真用紙程度の強度の紙に印刷し、アベノマスクをうまい具合に使って視点移動できた。

f:id:takeshich:20200523211513p:plain

youtu.be

ARマーカーの作成について

ARマーカーは、

chev.me

から、Original ArUcoを選択し、MarkerIDは5にした。SVGで保存し、PNGに変換後、写真用紙のL版に印刷した。

アベノマスクはL版と洗う前の大きさはほぼ同じ

届いたアベノマスク。

f:id:takeshich:20200512152513j:plain

アベノマスクのサイズは、L版とほぼ同じ大きさだった。ただし、洗っていない状態。ティッシュをマスクと同じサイズにして顔とマスクの間に挟んで使用している。

アベノマスクはガーゼが複数層をなしているので、その間にクリップを差し込んでARマーカーを留めている。

なお、クリップは黒を使用する場合は、マーカーと重ならないように印刷にさいして、ある程度の余白を設けて、そこで押さえるようにする。カメラとの位置関係もあってあまりマーカーが小さくなりすぎると検出時に数値が揺れるという問題も出てくるので微調整が必要だ。

また、アベノマスクは白地であるからマーカーの白い部分はカッターで切り取って見たが、切り取ると変な影ができて検出に影響するので、切り取らないほうが良いだろう。

もともとアベノマスクは他のマスクに比べて通気性がよく、ARマーカーを留めた状態での装着時でもあまり息苦しさを感じなかった。

もし息苦しいのであれば、鼻を出した麻生スタイルでマスクをつければいいだけだ。

クリップを写真のようにしてしまうと検出はできるものの値の揺れが大きく使えたものではない。クリップは白が良いし、余白大事。

f:id:takeshich:20200518134158j:plain

Raspberry PiでのArUcoライブラリのビルトとOpentrack向けのビルド設定

takeshich.hatenablog.com

にも書いたように私の環境ではRaspberry PiでOpentrackを使う必要があるので、ArUcoライブラリのビルドとOpentrack向けのビルド設定について触れていきたい。Windowsなら配布されているバイナリでデフォルトでArUcoライブラリを使った検出はできるから読み飛ばしてほしい。

カメラについてはAmazonで安く売っていた旧型のRaspberryPi用のカメラ

を取り付けた。320x240 で90fpsでのキャプチャが可能だ。

ArUcoライブラリのビルド

cd ~
git clone https://github.com/opentrack/aruco
cd aruco
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local -DOpenCV_DIR=/usr/local/lib/cmake/opencv4 -DQT_NO_DEBUG_OUTPUT
cmake --build .
sudo make install

ArUcoライブラリを組み込んだOpentrackのビルド

cd ~
cd opentrack/build
cmake .. -DCMAKE_BUILD_TYPE=Release -DSDK_ARUCO_LIBPATH=/usr/local/lib/libaruco.a 
time cmake --build . --config Release -- -j 4
cmake --build .
sudo make install

Releaseビルドでもデバッグメッセージが出力されるのを回避する

ArUcoライブラリを組み込んだOpentrackを実行すると

DEBUG [/home/takeshich/opentrack/tracker-aruco/ftnoir_tracker_aruco.cpp:358]: aruco: switched thresholding params otsu: false size: 7
DEBUG [/home/takeshich/opentrack/tracker-aruco/ftnoir_tracker_aruco.cpp:358]: aruco: switched thresholding params otsu: true size: 7
DEBUG [/home/takeshich/opentrack/tracker-aruco/ftnoir_tracker_aruco.cpp:358]: aruco: switched thresholding params otsu: false size: 9
DEBUG [/home/takeshich/opentrack/tracker-aruco/ftnoir_tracker_aruco.cpp:358]: aruco: switched thresholding params otsu: true size: 9
DEBUG [/home/takeshich/opentrack/tracker-aruco/ftnoir_tracker_aruco.cpp:358]: aruco: switched thresholding params otsu: false size: 11
DEBUG [/home/takeshich/opentrack/tracker-aruco/ftnoir_tracker_aruco.cpp:358]: aruco: switched thresholding params otsu: true size: 11
DEBUG [/home/takeshich/opentrack/tracker-aruco/ftnoir_tracker_aruco.cpp:358]: aruco: switched thresholding params otsu: false size: 5
DEBUG [/home/takeshich/opentrack/tracker-aruco/ftnoir_tracker_aruco.cpp:358]: aruco: switched thresholding params otsu: true size: 5
DEBUG [/home/takeshich/opentrack/tracker-aruco/ftnoir_tracker_aruco.cpp:358]: aruco: switched thresholding params otsu: false size: 7
DEBUG [/home/takeshich/opentrack/tracker-aruco/ftnoir_tracker_aruco.cpp:358]: aruco: switched thresholding params otsu: true size: 7
DEBUG [/home/takeshich/opentrack/tracker-aruco/ftnoir_tracker_aruco.cpp:358]: aruco: switched thresholding params otsu: false size: 9

というメッセージが大量に出る。

ソース*1を見るとデバッグメッセージが原因のようだ。

-DCMAKE_BUILD_TYPE=Release

として明確にDebugではなく、Releaseとしているので、デバッグメッセージが出るのが不思議であったが、 Qtのドキュメント*2を見ると

The Qt implementation of these macros prints to the stderr output under Unix/X11 and macOS. With Windows, if it is a console application, the text is sent to console; otherwise, it is sent to the debugger.

By default, only the message is printed. 

とあり、LinuxX11の環境で使用される方が少なく、作りからしWindowsで出力されないから気にしている方は少ないのだろうなと思う。

ただ、リポジトリを見るとログレベルのカテゴリがError,Warn,Info,Debugなどに分かれておらず、上記のようにデバッグメッセージでも、またエラーメッセージでさえもqDebug()を使っている場合も多いので、これは変更するべきだと思われるが、気になるのはUnix/X11 and macOSの人であり、使用者が少ないように思えるし、Windows版のは配布されているが、それらのバイナリが標準で配布されていないので、使う人が適宜対応しているのだと思われる。。。

調べたところ、cmakeを使用しているQtの場合は、

add_definitions(-DQT_NO_DEBUG_OUTPUT)

を任意の場所に追加し、コンパイルすることで出力しないようにできるようだった。

実際に opentrack/cmake/opentrack-platform.cmake に add_definitions(-DQT_NO_DEBUG_OUTPUT) を追加したが、

マクロ*3にqDebug仕込んであり、qDebug()がないことにより、コンパイルエラー出てmakeが通らなかった。

In file included from /home/takeshich/opentrack/compat/macros.hpp:3,
                 from /home/takeshich/opentrack/compat/math.hpp:3,
                 from /home/takeshich/opentrack/compat/correlation-calibrator.cp                                                               p:3:
/home/takeshich/opentrack/compat/correlation-calibrator.cpp: In lambda function:
/home/takeshich/opentrack/compat/correlation-calibrator.cpp:57:23: error: expect                                                               ed primary-expression before ‘while’
             eval_once(qDebug() << "idx" << k
                       ^~~~~~
/home/takeshich/opentrack/compat/macros1.h:40:99: note: in definition of macro                                                                 eval_once3’
 #   define eval_once3(expr, ctr) ([&] { [[maybe_unused]] static const char init                                                               _ ## ctr = ((void)(expr), 0); }())
                                                                                                                                                                  ^~~~
/home/takeshich/opentrack/compat/macros1.h:41:28: note: in expansion of macro ‘e                                                               val_once2’
 #   define eval_once(expr) eval_once2(expr, __COUNTER__)
                            ^~~~~~~~~~
/home/takeshich/opentrack/compat/correlation-calibrator.cpp:57:13: note: in expa                                                               nsion of macro ‘eval_once’
             eval_once(qDebug() << "idx" << k
             ^~~~~~~~~
/home/takeshich/opentrack/compat/correlation-calibrator.cpp:57:23: error: expect                                                               ed ‘)’ before ‘while’
             eval_once(qDebug() << "idx" << k
                       ^~~~~~
/home/takeshich/opentrack/compat/macros1.h:40:99: note: in definition of macro                                                                 eval_once3’
 #   define eval_once3(expr, ctr) ([&] { [[maybe_unused]] static const char init                                                               _ ## ctr = ((void)(expr), 0); }())
                                                                                                                                                                  ^~~~
/home/takeshich/opentrack/compat/macros1.h:41:28: note: in expansion of macro ‘e                                                               val_once2’
 #   define eval_once(expr) eval_once2(expr, __COUNTER__)
                            ^~~~~~~~~~
/home/takeshich/opentrack/compat/correlation-calibrator.cpp:57:13: note: in expa                                                               nsion of macro ‘eval_once’
             eval_once(qDebug() << "idx" << k
             ^~~~~~~~~
/home/takeshich/opentrack/compat/macros1.h:40:98: note: to match this ‘(’
 #   define eval_once3(expr, ctr) ([&] { [[maybe_unused]] static const char init                                                               _ ## ctr = ((void)(expr), 0); }())
                                                                                                                                                                 ^
/home/takeshich/opentrack/compat/macros1.h:39:34: note: in expansion of macro ‘e                                                               val_once3’
 #   define eval_once2(expr, ctr) eval_once3(expr, ctr)
                                  ^~~~~~~~~~
/home/takeshich/opentrack/compat/macros1.h:41:28: note: in expansion of macro ‘e                                                               val_once2’
 #   define eval_once(expr) eval_once2(expr, __COUNTER__)
                            ^~~~~~~~~~
/home/takeshich/opentrack/compat/correlation-calibrator.cpp:57:13: note: in expa                                                               nsion of macro ‘eval_once’
             eval_once(qDebug() << "idx" << k
             ^~~~~~~~~
/home/takeshich/opentrack/compat/macros1.h:40:108: error: expected ‘)’ before ‘                                                                ’ token
 #   define eval_once3(expr, ctr) ([&] { [[maybe_unused]] static const char init                                                               _ ## ctr = ((void)(expr), 0); }())
                                                                                                                                                          ~                ^
/home/takeshich/opentrack/compat/macros1.h:39:34: note: in expansion of macro ‘e                                                               val_once3’
 #   define eval_once2(expr, ctr) eval_once3(expr, ctr)
                                  ^~~~~~~~~~
/home/takeshich/opentrack/compat/macros1.h:41:28: note: in expansion of macro ‘e                                                               val_once2’
 #   define eval_once(expr) eval_once2(expr, __COUNTER__)
                            ^~~~~~~~~~
/home/takeshich/opentrack/compat/correlation-calibrator.cpp:57:13: note: in expa                                                               nsion of macro ‘eval_once’
             eval_once(qDebug() << "idx" << k
             ^~~~~~~~~
make[2]: *** [compat/CMakeFiles/opentrack-compat.dir/build.make:243: compat/CMak                                                               eFiles/opentrack-compat.dir/correlation-calibrator.cpp.o] エラー 1
make[2]: *** 未完了のジョブを待っています....

そこで、詳しく解析するのは諦めて、対象の部分*4コメントアウトし、再度コンパイルし、大量のデバッグメッセージが出ないようにした。

Opentrackの設定

閑話休題

ArUcoを使ったOpentrackの設定の注意点については、

github.com

にざっくりではあるものの要点はほぼ記述してある。

特に注意する点は、

  • 対応する軸の入れ替えと反転
  • カメラの位置

だろう。

対応する軸の入れ替えと反転

対応する軸の入れ替えと反転については、OptionsのOutputで対応した。

f:id:takeshich:20200523213102p:plain

YawとPitchを入れ替えることと、Yawについては反転させている。

カメラの位置

Please keep in mind that marker has to be waved at the camera at a neutral pitch angle of at least 15-25 degrees -- since it's planar, solver gets confused when pose approaches identity. When mounting it on a hat, ensure a relatively oblique angle that keeps the raw pitch value positive at all times. Otherwise, sudden spikes in pitch value ensue.

とあるように、 カメラの位置には注意が必要で、検出時に数値が揺れる場合がある。 頭をゆっくりと左右に振りながら検出を続け、値が荒ぶらないようにカメラ位置を調節する必要がある。

私の場合は、マーカーとカメラがちょうど正面を向いた状態になるとひどい状態になったので、それを避けるようにカメラを設置した。

まとめ

Webcamを用意し、ARマーカーをL版の写真用紙に印刷し、アベノマスクにクリップで留めるだけで、視点移動ができるようになるのは、他のLEDをマーカに使った方法などに比べるとお手軽だ。

税金で配られたマスクとしては効果が期待できない使えないマスクであるアベノマスクを有効に使う方法として、是非試してほしい。

ただ、スムーズに視点移動できるなるまでには、Mappingの設定やカメラの位置の試行錯誤が待っている。今回提案したアベノマスクを利用した方法の他の視点移動でも同様なのでこれは仕方のないことで、楽しむようにすると幸せになるかもしれない。