The backstage of date with Hatsune Miku――まだデートは大変です

 先月に動画「初音ミクとデートしてみた」を公開してから、その反響に驚きつつも、
気力を使い果たしてしばらくぼーっとすごしていました(^^;; 中身の技術について聞かせてほしい、
という話もちらほらあったので、MOM12が終わり、DIVA fも発売される今、少し書き残しておこうかなと・・・。
前回日記からもう2年近く経っているのに愕然としますねorz

※写真や文章の捕捉などは逐次行っていきます。


技術的に見た場合、今回のシステムを実現するのに手を動かした主な点は以下の部分になります。

  1. 背景とCGを重ね合わせるためのリアルタイムな位置合わせ
  2. 実環境によるCGの遮蔽を実現するための奥行き情報の付加
  3. 障害物(手)の検出によるバーチャル物体への干渉

 MMDモデルのアニメーション表示については、以前の動画と同様ARTK_Alive!を使用させて頂きました。
オリジナル版では物理演算やテクスチャ非対応だったのですが、その後更新が行われたARTK_MMD
アップデートの取り込みや、自前で勢いに任せて色々と手を入れた結果、自分でもどこをどこまで
いじったのか分からないくらい魔改造になってしまいました・・・。

 なお、今回の動画に全く関係ないのですが、OpenNI準拠のスケルトン位置情報を取り込む
ことで、いわゆる「俺がミクだ!」的なモーショントラッキング機能も実装しています(参照)。
このARTK_Alive!の更新分だけでも公開したいと思っているのですが、なかなかデバッグ
ライブラリ化のパワーが足りてなくて実現できていません。ごめんなさいorz

 とりあえず、主に手を動かした部分についてちょっとずつ紹介していきます。


1.リアルタイム位置合わせ


青い点が使用点、黄色い点が外れ点です


動画内でも紹介している通り、位置あわせ技術自体はPTAMとかKinect Fusion(kinfu)等、
非常に高性能な実装が既に存在します。今回敢えて自前で作った理由としては、建前上

  • Xtionで奥行きを取得するので、これベースで動かしたい(=PTAM向けには画角が足りてない)
  • kinfuの様な奥行き情報だけでは屋外は厳しい(場合によっては床面のみしか計測できない)
  • ウォークスルー実現のため、バッテリー動作するノートPCで普通に動かしたい(GPUパワーに頼らない)

 というものです。何だかんだといいつつ、本音では車輪の再発明なのは承知の上で、出来合いの
ライブラリを使うだけでアルゴリズムを知った気になるのはどうなのか?というのが最大の理由でした。


 基本的な動作アルゴリズムはICP(Iterative Closest Point)に準じる手法で、ベースはICPの中でも
古典ともいえるのArunらの手法をまず実装しました。ICPにおける最大の課題として、対応点の誤り
による位置、姿勢の破綻が挙げられますが、これを防ぐために対応点はRGBの画像特徴点から抽出しています。
現バージョンでは固有値でコーナー検出し、LK法でトラッキングした特徴点に対応する奥行き点同士を対応
させています。量より質、というストラテジーですね。その反面、テクスチャレスなシーンへのロバスト性には
限界があります(とはいえ、kinfuも計測領域が少なすぎたり、背景が平坦な場合は破綻します)。この部分は、
高速化も含めて改善の余地がある部分ですね。真面目にやるならば、再初期化の機能も考慮してWasington大学のHenryらの手法
で行われているようなSIFTやSURFで行うことも考えられますが、なにぶん重いのが難点ですね・・・。


 その他、床面検出・補正や、ドリフト防止の簡易的な三次元位置マッピングなど、細かい工夫を加えた上で
組み込んでいます。ポイントとしては、自分とバーチャルキャラクターの相対的な位置関係の表現に位置あわせ
を使う場合は、多少のずれを気にするよりも、ウォークスルーさせて破綻さえしなければ大丈夫、と開き直った
ことです。精密さを要求する場合の位置合わせからすると論外ですが、用途次第ではこういった実装もありなのかな、
と言い訳してみます(^^;;


 なお、動画ではカクカクしているという指摘を多数頂いているのですが、これは動画キャプチャソフトの介在が
最大の問題で、実は現状の最適化していない実装でも30fpsの維持は実現できています(1フレーム25ms程度で処理)。
なお、高速化を頑張る体力的余裕がなかったため、動作環境はマウスコンピュータ製のNEXTGEAR i300(Core i7
3612QM 2.1〜3.1GHz)という軽自動車にV8エンジンを積んだようなモバイルノートPCを使用しています。
一応、Core2Duo世代のノートPCでも2.5GHz位あれば30fpsは出せるはず・・・です(自信無し)。


2.奥行き情報の付加
 これは簡単ですね。OpenNIによるRGB画像、Depth画像の重ね合わせ機能を用いて、Depth値をRGB画像上に重ね描き
した上でCGを描画しています。Xtionの性能に依存している部分ですが、エッジ部分が若干ずれたり、荒れていたり
するのが現状の課題です。


3.バーチャル物体への干渉
 これも、Xtionによる奥行き検出で、一定以内の距離範囲内にある障害物を検出し、この障害物位置を球体と
仮定してBullet Physicsに反映させています。球体の仮定はやや乱暴に過ぎると思いますが、思いのほか自然に
干渉できます。それよりも、Xtionの最小計測距離のほうが課題です。動画では思いっきり手を伸ばしていますが、
ああしないと手を検出できません。YUV変換による肌色抽出も試みたのですが、XtionのRGBカメラの性能の低さに
挫折しました・・・。25000円もしたのに、その辺のWebカメラにも画質で劣るのは凹みますねorz


 以上のように、その道の人から見ればなあんだ、と思われる位に特別な事は何もしていません。この動画の
一番の貢献としては、一人でもこの位のARシステムが作れる位、世の中の技術的素地が出来てきているという事に
気づいてもらえた、という事ではないかと思います。又、MMDの関連ライブラリやモデル、モーションなどの揃い具合は、
正直言って日本が一番恵まれた環境にいるのではないかと感じました。リソースを使用させていただいた皆さん、
改めてありがとうございました!


 まだまだ、どんな環境でも動作するほどロバストではないし、やりたい事とやれる事のギャップは埋まって
いないと感じでいます。ですが、要素技術がいつの間にか進歩するか、あるいは自分で頑張るか、いずれにせよ
この辺は時間の問題だと思います。


 今後の展開についてはまだまだ未定ですが、皆さんに何か感じてもらえるものを作っていければと思っています。
あと最後に、事後報告になって申し訳ありませんが、Make: Ogaki Meeting 2012にて本システムの展示をさせてもらいました。
見に来て頂いた方々、どうもありがとうございました!