AIR SHODOUのエンジン - KINECT開発を加速するライブラリ

こんにちは。久しぶりにちょっとテクニカルな記事を書きます。

AIR SHODOUの仕組みから自然発生的に整備されてきた弊社のKINECT開発用ライブラリをご紹介します。

AIR SHODOUですが実は二つのプロセスで構成されています。
ひとつは皆さんの目に最も触れる部分、書道の画面描画を行っている「AIR SHODOU ビュープロセス」。
これはAdobe AIRで開発されています。

そしてもう一つが「AIR SHODOU Engine」。
実際にセンサーと接続し、センサーデータをビュープロセスへ送信する原動力となるプロセスです。
こちらはMicrosoft Kinect SDK+C#での実装となっています。

AIR SHODOUを起動するにはまずエンジンを起動し、センサーとの接続を確立しソケットサーバーを作成しビューからの接続待ち状態とします。
その後ビューが起動すると、ソケット接続が確立しセンサーデータ送信が開始されます。

この疎結合の構成はデザイナーさんが開発するビューへの変更なしにエンジンを変更することが可能になるというメリットを持っています。
実はAIR SHODOU初期バージョンはまだMicrosoft Kinect SDKのリリース前でしたのでエンジンはOpenNIで開発されていました。
また別の機会にご紹介しますが、このエンジンをLEAP MOTION対応した「KOFUDE(小筆)Engine」も最近開発しました。

そしてこのAIR SHODOU Engine開発に伴って自然発生的に出来上がったのが「SfKinectControl」ライブラリです。
大まかなクラス構造はこのようになります。


NUI系の開発では大量にセンサーから流れ込んでくるデータを相手にするのでブレークポイントで止めてステップ実行をするようなスタイルではデバッグが難しく、ある程度データをログ等に蓄積してから解析するようなスタイルの開発シーンが多くなります。

そこでSfKinectControlでは「データの書式化クラス群=Formatter」と「データの出力クラス群=Exporter」を動的に差し替え可能としています。

Formatterでは

  • OpenNI時代から互換性のあるAIR SHODOU独自CSV形式を作成するAirShodowCSVFormatter
  • 関節、フェイストラッキングデータ、関節方向など全骨格データを扱うCSVFormatter
  • 何もしないNullFormatter

などを用意しています。
なぜ何もしないフォーマッターが用意されているかというと、デバッグ時はCSVFormatterでデバッグログをファイルに書き出しますが、リリース時にはNullFormatterに差し替えてパフォーマンスを上げるという用途を想定しています。

ExporterではFormattrで成形されたデータを何らかの媒体に出力します。

  • ソケットサーバーとしてネットワークにデータを送出するSocketExporter
  • テキストファイルにデータを書き出すFileExporter
  • 図にはありませんがWindowsの名前付きパイプに書き出すNamedPipeExporter

といったものを用意しています。

このライブラリのおかげでAIR SHODOU形式でソケットにデータを書き出すソースは下記だけで動作します。

                this.KinectControl = new KinectControl();
                SocketExporter socketExporter = new SocketExporter();  //ソケットExporterを作成
                socketExporter.Formatter = new AirShodouCSVFormatter(); //AIR SHODOU形式のFormatterを作成
                this.KinectControl .Exporters.Add(socketExporter);  //Exporterを追加
                this.KinectControl .Start();

ここでお分かりの方もおられるかもしれませんが、Exporterは無限に追加可能です。
ソケットとファイルと名前付きパイプに同じ内容をすべて書き込む、という設定も数行で実現できるようになっています。

このライブラリのおかげでとりあえずセンサーに繋いで骨格センスをしつつデバッグをする環境であればものの数分で作れるようになっています。