ARsandbox調整 の履歴(No.1)


OUOperatingGrant.png

AR Sandboxの調整、校正法 (2019/11/03作成)

sandbox202108.png

(2021/08/02)等高線が明らかにずれてきているので、再調整した。そのために以下を見ながら実施したが、結構間違いやリンク切れがあったので、できるだけ直した。隣の写真を調整後のものに変えた。

AR Sandboxの調整、校正法

 先日、AR Sandboxを自作しましたが、調整にちょっとてこずったので、方法をまとめておきます。AR Sandbox自体についてはARsandbox作成をご覧ください。基本的には、Oliver Kreylosさんのyoutubeの調整法の解説ビデオ(https://www.youtube.com/watch?v=EW2PtRsQQr0)を見ればいいのですが
 ひとつやりづらいのは、プロジェクターにつないでしまうと、画面が砂の上に表示されて、かつかなり拡大されているので、細かいマウス操作やterminalでの操作が難しくなります。操作が困難な場合は、一時的に液晶ディスプレイにつなぐ必要があります。
 私はKreylosさん推薦のLinuxのMint 19 Mate 64 bit版を使ってます。PCはかなり古いのですが、以前第一原理計算に使っていたもので、i7 6coreでまだ十分使えるものです。グラフィクスボードはGTX 1060 6 GBを使いました。ボードを最初に使ったPC(最新)では、どうやってもNVIDiaのドライバーをインストールできませんでした。この古いPCに変えたら、問題なくインストールできました。ここがAR Sandboxの一番の難所でした。インストラクション通りで、Vrui, Kinect, SARndboxのインストールまでは全く問題なし。KinectカメラはXBOX 360 Kinect Sensor。プロジェクターにはBENQのMW632STを使用してます。
(所々ディレクトリーの指定が間違っているようです。もし実行ファイルがない場合は、/usr/local/binを探してください。findコマンドで探すこともできます)

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

 Kinectカメラを接続して、キャリブレーションをする。以下をterminalから実行。

> sudo /usr/local/bin/KinectUtil getCalib 0

 古いKinectカメラでは、さらに追加の調整が必要だが、多分不要としてスキップ。
ただ、モデル番号がわからなかったので不安ではある。

Kinectカメラの方向調整

 Kinectカメラを接続して、以下をキャリブレーションをする。以下をterminalから実行。

> ~/src/Kinect-xxxx/bin/RawKinectViewer -compress 0

 2つのイメージが出てくる。左側が高さのイメージで、たとえば手を砂の上に置いてみると、手の形が見えるはず。右側には実際のイメージがある。砂箱の全体が見られるように、Kinectカメラの方向を調整する。

base plane equationの決定

 これは砂を平らにした時の表面を基準面として使うようにする校正。しかし、砂面をきれいに平らにするのは結構大変なので、ビデオの例のようにフラットな板を砂箱の上に置くのがいいようだ。私は古い汚い段ボールの大きいのを使ったので少し苦労した。以下を実行。

> ~/src/Kinect-xxxx/bin/RawKinectViewer -compress 0

 「1」キーを押すと、メニューが出てくるので、Extract Planesをマウスカーソルで選んでおいて、「1」キーを離すと、「1」キーがExtract Planes機能にアサインされるので、これを後で使う。前同様に左に高さのイメージが出ているので、zキーを押しながら、マウスを移動させると、イメージが移動する(マウスはクリックしない)。左側イメージを中央に持ってきて、マウスホィールで像を拡大。マウスカーソルをイメージの右上側に持ってきて、そこで「1」キーを押しながら、マウス(クリックはしない!)を左下に移動させて、「1」キーを離す(マウスに沿って、長方形が見えるが、場合によって見辛いことがある)。なぜか長方形が出ない場合がある。カメラでの検出がうまく行っていないのかもしれないので、板を変えたりしてみる。段ボールでは長方形が出なくて設定が出来なかったが、段ボール外して砂の上だとうまく行ったことがあった。
 上記操作で、basic plane equationが求まっているはずなので、Rawkinectviewerを実行したterminalを見る。2つの数値の列が出ているはず。ESCキーでRawkinectviewerは終了。エディタで~/src/SARndbox-2.6/etc/SARndbox-2.6/Boxlayout.txtの最初の行を編集する。それにはterminalに出て来た数字2列の下側の列を使う。注意は最後の数字の前に=があるが、これはカンマに変えて、Boxlayout.txt(実際にはlは大文字、以下同様)を編集する。(0.020, -0.030, 0.9990), -99.5のような感じになる。最後の数字がKinectカメラとフラットな板(または砂上面)との距離(cm単位)になる。実測距離と一致するはず。一部のKinectカメラを使った時に、最後の数字がプラスでterminalに出てくることがあるので、その場合はBoxlayout.txtの方ではマイナスに直す必要がある。
 なお、フラットな板等を砂箱の上面に置いた場合は、今得た値は実際の砂面の高さとは違うので、得られた高さを補正する必要がある。Boxlayout.txtの高さ(最後の数字)のところを、実際の砂面の高さに直す必要がある。terminal出力で-70になっていて、砂面から板が20 cm上にあったなら、-70-20で-90とする。
 なお、キーのアサインは記憶されていないので、Rawkinectviewerを再度起動したら、またアサインする必要がある。

3D box corner positions

 こちらは四隅の位置を測定する。順番があり、左下、右下、左上、右上の順番で測定する。ただ順番間違ってもBoxlayout.txtに書きこむ順番を上記のように直せば済むと思う。測定では、base plane equationの時と同じように、Rawkinectviewerを起動して、「1」キーにMeasure 3D Positionsをアサインする。同じように左側の高さイメージを拡大、Average Framesでイメージを凍結。そして先ほどの順番で、マウスカーソルを4隅に移動させて、「1」キーを押す(マウスはクリックしない)と、その位置がRawkinectviewerを起動したterminalに表示される(terminal出力が見えるようにWindowをずらせておくと良い)。表示されない場合は再度トライ。4隅が済んだら、4つの数字列が出力されているはずなので、それをBoxlayout.txtの先ほどのbase plane equationの後にコピーして、Boxlayout.txtをセーブする。
 私はビデオに倣って、イメージの均一な部分の一番端をクリックして決めたが、後でSARndboxを動かしてみると、端の方にプロジェクター表示がおかしい領域ができてしまう。そこで、均一な部分よりも少し外側を指定するとかなりマシになったが、ちょっと試行錯誤が必要だった。一方、真っ暗なところで押しても拾われないようだ。
 ここまでの設定はLCDモニターを接続したままで出来たが、以降はプロジェクターと接続するか、必要に応じて接続を切り替える必要がある。

プロジェクターの位置調整

 以下を実行すると、グリッドパターンがでる。F11キーを押すとフルスクリーンモードになる。

> XBackground

これを使ってプロジェクターの方向、光学的なズームとフォーカスの調整を行う。これはプロジェクターを使う。少し映写が砂箱からはみ出すのは問題ないらしい。

プロジェクターとカメラの調整

 ここの校正では円盤状のディスクを使うので、まずはそれを作る。直径12 cmの円と、その円の中心を同じにする十字を描いたものをPC上で作って、印刷する。それをハサミ等で切り取り、不要なDVDかCDの表面に中心を合わせて貼る。これの裏面に棒(針金でも良い)をテープで固定する。これは円盤を手で持ってしまうと、円盤として認識されなくなるので、棒を使って円盤が手から離れるようにする必要があるため。校正中に回転するとよくないので、回転しやすい時は棒を2本にする(少し離して固定)。この円盤位置の位置をカメライメージから読んで、それを今の位置と比較することで校正を行うことになる。
 この校正には以下のコマンドを使う。4:3 (100 x 75 cm)の場合は、<width>のところに1024、<height>のところを768にする。F11キーを押して、全画面表示にする。

~/src/SARndbox-2.6/bin/CalibrateProjector -s <width> <height>

 この校正では、先の円盤をプロジェクターが示した十字のところに重ねて、「1」キーを押すことを繰り返す。その機能を割り振るためには、「1」キーを押して、出て来たメニューから、Captureを選択して、「1」キーを離す。さらに、バックグラウンド機能のキーアサインのために、出て来たダイアログで「2」キーを押して離す。「2」キーはこの校正中に穴を掘ったりして、高さ分布が最初と変わった時に、円盤が認識されなくなることが起こる。その場合は「2」キーを押すと(円盤や手は外に出しておく)、今の高さ分布が読み込まれて更新される。(注意:これが最初の調整でない場合、設定ファイルを既に作っているかもしれない。その場合、このアサインは必要ない)
 これを実行すると、白い十字が左下側に出ているはずである。ウェブページの方には書かれてはないが、ビデオでは十字で描かれた部分より内側(右上側)にマウスカーソルを持っていって、そこで一度左マウスボタンをクリックする必要があると言っている(実際うまくいかない時はこれが必要だった)。
 そして作成した円盤の中心とその十字の中心に合わせるが(十字同士の方向を一致させる必要はない)、その時、円盤に相当するものがプロジェクターで示される。それの位置が実際の円盤と最初ずれていても問題はない。また、その色が緑であれば、円盤として認識されているが、黄色の場合は円盤として認識されていない。その場合は、高さや円盤と手の距離(棒の持ち方)を変える。また、円盤より小さいものを下に置いて支えてみるなど、緑色に変わるようにする。なお円盤が周りの砂と同じ高さになると、緑にはならない。緑になったら、円盤の位置を調整して、プロジェクターからの白十字中心と円盤の十字中心がなるべく一致するようにする。まだ緑であることを確認して、「1」キーを押す。うまくいくと、白い十字は次の位置に移動するので、これを繰り返す。なお円盤の高さは色々と変える必要がある。下に何か置いて高くしたり、砂を掘って低い位置で合わせる必要もある。その場合は、砂を掘ったことで周りが変化してしまったため、イメージで黄色いところが出ているはずである。その場合は「2」を押して、バックグラウンドを更新する。そうしないと円盤が認識されない事になる。「2」キーを押すと、一度全面が赤くなって、それからまた元に戻る。12箇所でこの校正を行うと、また最初の位置に戻る。うまくいっていると、2ラウンド目には白い十字に加えて、赤い十字が現れる。これが出ない時は校正がうまくいっていない。赤い十字は、円盤の十字に近いところを追いかけて出るはずである。これがどこでも数mm以内で合っているなら、校正はうまく行っているので、ここで終わっても良い。しかしまだズレている時は同じように校正をもう1ラウンド行う。
 注意する点は、「1」キーは一度押すと、緑円盤になった場合だけキャプチャーする。棒を手持ちで校正している時に、ちょうど緑と黄色の境界で、交互に色が変わっているところで押すと、しばらく認識されず、手を動かしたり、次の場所に移動しようとした時がキャプチャーされることがある。これが起こった時は最初からやり直した方がよい。そのため、確実に緑円盤になっているところで、「1」キーを押すようにする。周りが変化した時は「2」を押してから。
 この校正は自動的には終わらないようなので、適当なところでEscキーを押して、終了する。そして、起動したterminal上の表示を見る。2ラウンド目で赤い十字が出ない時は最初のラウンドでうまく行ってないので、一度終了して、再度始める。
 この校正では我々がファイルに書き込む必要はないので、調整が終わったら、ESCキーを押してプログラムを終了する。この校正では黄色い外枠もでるのだが、これが私の場合は結構小さいが、ビデオでは全く出てない。ちょっと大きめにcorner positionを取ると、黄色い枠も広がるようだ。この辺りの関係がまだよく分かってない。
 この校正が終わると、AR sandboxを動かすことができるようになる。

AR sandboxを以下のコマンドで動かす。

~/src/SARndbox-2.6/bin/SARndbox -uhm -fpv

 最初画面が砂箱全体を覆ってないので、F11で全画面表示にする。ちゃんと砂の高さに対応した等高線が描かれているだろうか、位置がずれていないかをチェック。明らかにずれているときは調整・校正のやり直しが必要。ESCキーで実行を止められる。

追加の設定など

 SARndboxには色々なオプションがあるが、それらはSARndbox -h をterminalで実行することで、表示することができる。
 configuration file(.cfg)を作っておくことで、校正が少し楽になる。webページに書かれているとおりに、Vruiのconfiguration fileを作っておく。これはCalibrationprojectorを使う時にキーを自動的にアサインしてくれるので、少し便利。(しかし後で忘れて、キーボードの[1]アサインしてなくても、なぜか進むことを理解できてなかったり。)
 同様にSARndbox用のconfiguration fileもwebページに書かれている通りに作る。こちらの場合は、そのまま実行すると、「1」キーが雨を降らす、「2」キーが乾燥させる機能を持つようになる。また、起動時に自動的に全画面モードにしてくれる。キーはconfiguration fileを直せば、別のキーにアサインすることができる。私もARsandbox作成に書いたように、外付けの「1」と「2」キーを作ったので、調整の時にはこれらが使える。これは特に円盤を使ったキャリブレーションの時に便利。
 デスクトップにSARndboxの起動用アイコンを作る。これはwebページに記載のそのまま実行することで、可能である。起動用シェルスクリプトを作り、それをデスクトップアイコンと連携させるだけ。私は同様に水から熔岩、熔岩から水に変えるスクリプトを作り、デスクトップアイコンとして置いている。熔岩にする方法については、法政大学社会学部の澤柿ゼミのwiki(https://semi.sawagaki.0j0.jp/)を参考にさせてもらった
 それ以外にもデュアルディスプレイの時に別画面に表示する方法なども書かれているが、私は行なっていない。
 最初、雨をうまく降らせられなかった。よく調べてみると、手をかざす時に指を離す必要があった(パーにする)。私は最初は指を離さないで試していた。離すように変えたら、認識されて、局所的に雨を降らせることができるようになった。