NyARToolkit for UnityでUnityちゃんを動かす

[English]

動画で紹介したNyRToolkitでUnityちゃんを動かすデモの作り方です。


以下の順で説明します。

  • 開発環境の準備
  • 機材とデータの準備
  • プログラムの改造
  • テスト
  • NFTデータセットの作り方

開発環境の準備

NyARToolkitでUnityちゃんを表示するためのプロジェクトを準備します。

  1. 新しいプロジェクトを作る
  2. NyARToolkit for Unityをインポートする
  3. SDUnityChanをインポートする

新しいプロジェクトを作る

Unityを起動して、空のプロジェクトを作成してください。(Unityのバージョンは5.3.4以降を使います)

1

 

NyARToolkit for Unityをインポートする

NyARToolkit for Unityのパッケージをダウンロードして、Unityへドラック&ドロップしてインポートします。
https://github.com/nyatla/NyARToolkitUnity/releases

2

SDUnityChanをインポートする

SDUnityChanのパッケージをダウンロードしてインポートします。
http://unity-chan.com/download/releaseNote.php?id=SDUnityChan&lang=jp

3

 

2つのパッケージを導入すると、projectは以下のようになります。

6

 

機材とデータの準備

デモには、PC以外に以下の機材が必要になります。

  1. ウェブカメラ
  2. Unityライセンスロゴを印刷した紙
  3. UnityライセンスロゴのNFTデータセット

ウェブカメラ

1つ以上のカメラがPCに接続されている必要があります。USBカメラなどを接続しておいてください。カメラ内蔵のPCの場合は必要ありません。

Unityちゃんマークを印刷した紙とNFTデータセット

これらはUnityライセンスのロゴイメージから作ることもできますが、必要なデータをセットにしたzipファイルを用意したのでダウンロードしてください。

unitychan-demodata.zip

zipファイルの中にあるUCLlogo180mm.pdfをA4用紙に印刷してください。このpdfは、Unityライセンスロゴを幅18cmで印刷した用紙です。

NFTターゲットデータは、同じくzipファイルの中にある、unitychan.nftdatasetを使います。

元の画像UCLlogo.pngから自作する場合は、解説の最後にあるNFTデータセットの作り方を参照してください。

 

プログラムの改造

ここから本編です。先ほど準備した開発環境にあるsample/SimpleNftシーンを改造して、Unityちゃんを表示するようにします。

 

オブジェクトツリーの編集

SimpleNftシーンを開いてください。シーンのHierarchyタブにあるMarkerObjectを展開すると、Cubeオブジェクトがあるので削除します。

7

UnityChan/SD_unitychan/Prefabにある、SD_unitychan_humanoidのPrefabをMarkerObjectの子にドラック&ドロップします。MarkerObjectはNFT位置に合わせて姿勢変換行列が更新されるオブジェクトです。この下に配置したオブジェクトがマーカの上に表示されます。

9

NFTデータセットのコピー

unitychan-demodata.zipの中にあるunitychan.nftdatasetを使います。unitychan.nftdatasetは、幅180mmのUnityライセンスロゴ用のNFTデータセットファイルです。自作した場合は置き換えて進めてください。

まず初めに、ファイルの拡張子を.nftdatasetから.bytesに変更します。これはUnityでバイナリファイルを埋め込むために必要な手順です。

次に、unitychan.bytesをAssetのResourceディレクトリにドラッグ&ドロップしてコピーします。これでUnityからリソースファイルを読むことができるようになります。

17

Unityちゃんの設定

NyARToolkit for Unityでは、マーカのスケール値1が1mmとして扱われます。また、中心座標は画像の左下を起点にXY方向で表現されています。Unityちゃんの位置とサイズを調整して、ロゴマークの中央にUnityちゃんが立つように設定します。

また、SpringManagerが有効だとうまく動かないので、チェックを外します。

18

 

コードの編集

最後に、C#コードを2か所書き換えて完成です。SimpleNFTのディレクトリにある、NftCameraBehaviour.csをダブルクリックして、開きます。変更箇所は2か所です。

NFTデータセットの変更

NFTデータセットをinfinitycatから先ほど追加したunitychanに書き換えます。また、画像の横幅を160から180(単位はmm)に書き換えます。

10

Cubeを操作する行の削除

削除したCubeに関わる行を削除します。

11

 

テスト

完成したらUnityのプレイボタンを押してみてください。画面にカメラ映像がでたら、印刷しておいたUnityちゃんロゴを撮影してみましょう。ユニティライセンスのロゴはやや認識しにくいので、ロゴ全体が撮影されるようにカメラを構えてください。

19

 

NFTデータセットの作り方

認識対象にするNFTデータセットは、ツールを使って画像ファイルから作ることができます。

ツールはNyARToolkit for UnityのData/toolディレクトリにあるNftFileGenerator.jarです。エクスプローラなどでNyARToolkit for UnityのAssetsディレクトリを開くと以下のファイルが見つかります。12

Windowsでは.batファイルをダブルクリックして下さい。その他のシステムでは、以下のようにターミナルから実行してください。

java -jar NftFileGenerator.jar

ツールが起動したら、元となる画像を読み込みます。メニューからImportを選択して、LoadImageを選択します。ダイアログが開くので画像をロードして、MakeFeatureSetを押してください。

14

データセットの生成には数分間かかります。しばらくお待ちください。出来上がると特徴点が表示されます。

15

出来上がったら、メニューからExport→Save NyARTK NFT dataset fileを選択してデータセットファイルを保存してください。(Save Feature Set Fileで保存したファイルはUnityでは使用できません。)

 

データセットのパラメタについて

  • SourceDPI – 画像のDPI値を設定します。特に変更する必要はありません。
  • Iset DPIs – ピラミッド画像の解像度セットです。AUTOはSourceDPIから自動で計算します。Customの場合は下段のカンマ区切りの数値の解像度セットを使います。特に変更する必要はありません。
  • FSET parametor – トラッキング特徴点(赤□)を検出するパラメータです。Lvが大きいほど検出する特徴点が多くなります。特徴点が多すぎる/少なすぎる場合に調整してください。

入力できる画像サイズはVGAサイズ以下にしてください。大きな画像を使いたい場合は、事前に縮尺してから使用してください。

Unityロゴのようなコントラストの強い白黒画像はNFTデータセットにあまり向いていません。自然画等のほうが良いデータセットができる確率が高くなります。

 

 

 

実験用ARマーカの作り方

NyARToolkitを使うためにはマーカを印刷する必要があります。
通常はコピー用紙にレーザプリンタなどで印字することが多いと思いますが、実験などで繰り返し使用するためには強度や反射特性が不十分な場合があります。
厚紙に張るなどの工作をしても良いですが、面倒な作業です。
ここでは、出来るだけ工作をせずに、性能の良い名刺サイズの実験用マーカを製造する方法を紹介します。

マーカの仕様

  • カードサイズ – 名刺サイズ(55[mm]x91[mm])
  • マーカサイズ – 40mm
  • マーカタイプ – NyIdマーカ10 種 NyARToolkit/nyar4psg/FLARToolkit対応
  • 用紙マット紙 – (名刺専用用紙)
  • 印刷方式 – インクジェット方式(モノクロ1色)

必要機材と材料

既製の名刺用紙と、モノクロインクジェットプリンターを利用します。プリンタの種類は、印字部(黒色)の部分の反射特性に大きな影響があります。

インクジェットプリンターはカラーのものでも構いませんが、モノクロモードで印刷してください。

  • 名刺用紙 KJ-VHA10LB
    コクヨ インクジェットプリンタ用名刺用紙 クリアカット 両面マット紙 厚口 10 面 10枚入
    クール白
  • プリンタ PX-K150
    EPSON A4モノクロプリンター 無線LAN・有線LAN対応

製造方法

印刷設定

PX-K150の場合、印字設定を以下のように設定します。他のプリンタの場合でも、用紙→「マット
紙」 品質→「きれい」のように、品質は最高位、用紙は普通紙ではなく「マット紙」に設定してくだ
さい。他のプリンタでの設定は、用紙パッケージ裏のプリンタ用紙設定条件を参考にしてください。

PK-K150の詳細設定

用紙設定の説明

印刷設定が適切でないと、擦れや印刷ズレが発生します。

左:正常印刷/右:設定不良

印刷

名刺用紙KJ-VHA10LBに印刷できるIDマーカセットのpdfを準備しました。pdfをダウンロード
し、実サイズで印刷します。
http://sourceforge.jp/projects/nyartoolkit/docs/NyIdMarkerCard_00_09_KJ-VHA10LB/ja/1/NyIdMarkerCard_00_09_KJ-VHA10LB.pdf

プリンタに用紙をセットして印刷をします。印刷実サイズで印刷をしてください。

切り離し

印刷が完了したら、用紙を取り外します。クリアカット用紙なので、折り曲げて外します。

印刷後の名刺用紙
カードの切り離し

評価

強度

名刺サイズにすることで、コピー用紙と比較して十分な曲げ強度を確保できます。

名刺用紙に印刷したマーカ

コピー用紙に印刷したマーカ

認識距離

マーカサイズが40mmのため、正確な姿勢検出が可能な距離は若干小さくなります。
距離は、VGA画像の場合約60cm、QVGAの場合約30cmです。
※NyARToolkitは32x32pixel以上のマーカを識別できます。

反射特性

強力な光源からの反射に対しては、他の印刷方式に対して差はありません。
蛍光灯などのスポット光の反射に対しては、インク面に光沢のあるレーザプリンタ・オンデマンド/オフセット印刷と比較して少なくなります。(インクジェット印刷)

インクジェット印刷図

オンデマンド印刷(上質紙)

オフセット印刷(マットコート)

評価装置全景

製造コスト

一枚当りの単価は以下の通りとなります。

  • 用紙: 約6円
  • インク: 約1円 (3000枚/カートリッジ)
  • プリンタ 約1円 (10000枚印刷時)
  • 計 約8円

まとめ

  • 名刺サイズのマーカ用紙は取り扱いやすく強度があり、短距離での実験に使用するには十分な性能を持ちます。
  • 製造コストは1枚当り8円とやや高価ですが、小ロット多品種製造では妥当な範囲です。
  • マーカのインク面反射の抑制には、インクジェットプリンタのモノクロ印刷が有効です。

テンプレート

名刺サイズマーカ印刷用のテンプレートファイルです。名刺用紙(KJ-VHA10LB)に合わせて編集してありますので、そのまま印刷できます。

この記事のpdfはここからダウンロードできます。

射影変換再び

以前実装した高速射影変換パラメータ計算器に不具合が見つかった。

見つけてくれたのはFLARManagerを作っているericさん。ありがたやー。

不具合の内容は、マーカが0,90,180,270度ぴったりのときに、高速射影変換パラメータ計算器がゼロ除算を起こして、パターン認識ができないとのこと。

原因を調べてみると、これは8元一次方程式の解き方の問題らしく、2.4系の頃からずっとあったらしい。気がつかなかったなぁ。ピボット操作をまともにしないで方程式を解いていたせいで、誤差蓄積の結果、計算に失敗するみたいだった。

というわけで、逆行列を使って誤差蓄積を少なくする方法に変更。でも8×8行列は重いので、4×4行列と2×2行列を組み合わせて解く方法を考えた。

理屈はこのへんにまとめたので、興味のある人は読んでみてね。
http://sourceforge.jp/projects/nyartoolkit/docs/tech_document0001/ja/2/tech_document0001.pdf

結果、パターン認識が失敗しにくくなり、小さいサイズのマーカの認識精度も向上。該当処理にかかる時間が倍になったのは残念だけど、全体への影響は1%以下なのでまあいいか。

実装はNyARToolkit2.5.2系としてリリース予定。既にtrunkにはコミット済みです。2.5.2では、ラスタ処理系の見直しや、静止画対応のサンプルなどをリリースする予定です。