やってみよう!Kinectアプリ開発 - 第8回 初期化・終了処理

2012-07-20 18:01

zigsow 長谷川 勇
 

はじめに

前回までの基本編では、Kinect™ for Windows® SDKの各機能を紹介してきました。今回からは応用編として、それらの機能を使った、より実用的なアプリケーションの開発で必要な要素を説明していきます。

今回は、実際のアプリケーションを開発するうえで必要となる、初期化・終了処理などのトピックを紹介します。

SDKドキュメントのインストール

Kinect for Windows SDKのドキュメントは、ローカルにインストールしVisual Studio®のヘルプビューアーから参照することができます。 すでにインストール済みの方もいるかと思いますが、まずはこの手順を紹介します。 (今さらですが・・・)
※ まだ導入されていない方は、先にVisual StudioのService Packを導入しておいてください。

なお、この手順は、Kinect for Windows SDK固有ではなく、 その他のSDKのドキュメントをインストールする場合も同様です。

  1. Visual C#® 2010 を起動します。(Windowsのスタートメニューから[すべてのプログラム]-[Microsoft Visual Studio 2010 Express]-[Microsoft Visual C# 2010 Express]を選択します)
  2. [ヘルプ(H)]-[ヘルプ設定の管理(S)]を選択します。
  3. [ヘルプ ライブラリ マネージャー]が開くので、[ライブラリの場所:]を指定し(デフォルトのままでも構いません)、[OK]を押します。(すでに指定済みの場合はこの画面は開きません)
  4. [オンラインからコンテンツをインストール(O)]をクリックします。
  5. [Visual Studio 2010]の下にある[Kinect for Windows SDK]の[追加]をクリックし、[更新(U)]を押します。
  6. 以下の画面が出れば更新は完了です。[完了(F)]、[終了(X)]ボタンを押して[ヘルプ ライブラリ マネージャー]を閉じます。
  7. Visual C# 2010 のメニューから[ヘルプ]-[ヘルプの表示(V)]を選択します。
  8. [オンラインヘルプに関する同意]で[いいえ(N)]を押します。 (※ 間違えた場合は、メッセージにある通り、メニューから[ヘルプ]-[ヘルプ設定の管理]を選択し、[ヘルプ ライブラリ マネージャー]で[オンラインまたはローカルヘルプの選択(C)]をクリックすることで変更できます。
  9. Microsoft ヘルプ ビューアー 1.1 が開くので、左下のタブから[コンテンツ]をクリックします。

初期化・終了処理

これまでの連載では「Kinectが1つだけ接続され利用可能なこと」を前提にしていました。実際のアプリケーションを開発する上ではこのような仮定は置けませんので、エラー処理も含めたもう少し正しい初期化処理を考えてみましょう。

まず、起動時に考えないといけないエラーはどのようなものがあるのでしょうか?軽く列挙してみましょう。

  1. Kinectがない場合
  2. Kinectに電源がつながっていない場合
  3. Kinectが正しく認識できない場合
  4. 他のアプリケーションが使用中の場合

さらに実際のアプリケーションでは、以下のケースも考えないといけません。

  • 実行中にKinectが抜かれてしまった場合
  • 実行を開始してからKinectを接続した場合

ここでは、これらのケースを扱う方法を紹介します。

KinectSensorChooserを使った初期化処理

初期化に関するエラー処理を考えると、いろんなケースを想定しないといけないことが分かりました。 しかし、これらたくさんのエラーケースにそれぞれのアプリケーションが個別に対応しないといけないとしたら大変です。 そこでKinect for Windows SDKでは、KinectSensorChooserというコンポーネントを用意し、エラーケースを簡単に扱えるようにしています。 (KinectSensorChooserはKinect Toolkitというプロジェクトに入っています。)

KinectSensorChooserを利用すると、KinectSensorChooserが管理するKinectセンサーの接続/解除時や、状態変更をイベントとして検知することができます。 これを利用し、Kinectの初期化処理をKinectセンサー接続時に行い、終了処理をKinectセンサー解除時に行うことで、アプリケーションの開始・終了とKinectの初期化・終了を切り離すことができます (つまり、Kinectセンサーを接続せずにアプリケーションを起動して、その後Kinectセンサーを接続することで正しく処理を開始する、といったことが可能になります)。 また、Kinectセンサーの状態変更を検知することで、Kinectセンサーに電源が接続されていない場合や、他のアプリケーションで使用中といったケースを検知できます。

なお、1台のPCに複数のKinectセンサーを接続している場合は、KinectSensorChooserがKinectセンサーを1台だけ選択して管理してくれるので、複数台接続の考慮をアプリケーション側で行う必要はありません(つまりイベントハンドラ側で、送られてきたイベントが利用中のKinectのものかの判断や、Kinectが余計に接続された際の処理などは不要です。そもそも、そういったイベントはKinectSensorChooserから送られてきません)。一方、アプリケーションが明示的に複数のKinectセンサーを利用する場合は、必要なKinectセンサーの個数分、KinectSensorChooserのオブジェクトを用意すればよいでしょう。

以降では、Kinect Toolkitをアプリケーションから利用できるように追加する手順と、 アプリケーションの修正を紹介します。

Kinect Toolkitの追加

Kinect Toolkitのプロジェクトを現在作成中のアプリケーションのソリューションに追加し、アプリケーションからKinect Toolkitを参照できるようにします。手順は以下の通りです。

  1. Developer Toolkit Browser v1.5.0 を起動します。(Windowsのスタートメニューから[すべてのプログラム]-[Kinect for Windows SDK v1.5]-[Developer Toolkit Browser v1.5.0]を選択します)
  2. [Microsoft.Kinect.Toolkit]の[Install]をクリックします。
  3. [フォルダーの参照]で、作成中のアプリケーションのプロジェクトの一階層上のフォルダーを選択して、[OK]を押します。 (例えば、作成中のアプリケーションが、"C:\Projects\KinectCameraSample\KinectCameraSample.sln"であれば、"C:\Projects"を選択します)
  4. Visual C# で、作成中のアプリケーションを開きます。(手順は第3回[プロジェクトを開く]など)
  5. [ソリューションエクスプローラー]から、"ソリューション'KinectCameraSample'..."を右クリックし、[追加]-[既存のプロジェクト(E)...]を選択します。
  6. [既存プロジェクトの追加]ダイアログで、Toolkit Browser から追加した"Microsoft.Kinect.Toolkit"フォルダー直下の"Microsoft.Kinect.Toolkit.csproj"を選択して[開く(O)]を押します。
  7. [ソリューションエクスプローラー]のソリューションの下に"Microsoft.Kinect.Toolkit"が追加されたことを確認します。
  8. [ソリューションエクスプローラー]のアプリケーションのプロジェクト("KinectCameraSample")を右クリックして[参照の追加(R)...]を選択します。
  9. [参照の追加]ダイアログで、[プロジェクト]タブをクリックし、"Microsoft.Kinect.Toolkit"を選択し、[OK]を押します。
  10. [参照設定]に"Microsoft.Kinect.Toolkit"が追加されたことを確認します。

以上で、作成中のアプリケーションから、Kinect Toolkit を利用する準備が整いました。

 

2件の質問スレッド
  • ElevationAngleについて mkama 2012-08-29 07:47 >なおSDKのドキュメントによると「Kinectセンサーのモーターは継続した操作を想定していないので、モーターの操作をできるだけ少なくすること」と注意書きがありますので注意しましょう。(目安としては、「1秒間に操作は1回まで」、また「15回操作した後は最低20秒間をあけること」とあります)

    知らなかったので、目一杯モーターを動かしていました。(~_~;)

    モータ保護用の判定ルーチンを作ってみました。
    一つ質問ですが、20秒間隔が空けば、15回の回数制限は解除して良いのですか?

    // モータ保護用の判定ルーチン
    private const int MaxElevation = 15;
    private DateTime dtNextElevation = DateTime.Now;
    private int intCountElevation = MaxElevation;

    private bool CheckElevation()
    {
      if (intCountElevation-- <= 0)
      {
        intCountElevation = MaxElevation;
        dtNextElevation = DateTime.Now.AddSeconds(20);
        return false;
      }
      else
      {
        TimeSpan ts = DateTime.Now - dtNextElevation;
        if (ts.TotalSeconds >= 1)
        {
          if (ts.TotalSeconds >= 20)
            intCountElevation = MaxElevation;

          dtNextElevation = DateTime.Now;
          return true;
        }
        else
          return false;
      }
    }
    1件のコメント
    • kinection.jp管理人 すみません、我々もSDKのドキュメントに書いてあること以上には情報を持っていません。
      ただ、ドキュメントを読む限りでは、20秒間隔が空けば、15回の回数制限は解除して良いと思われます。
      2012-08-29 16:02
  • ヘルプについて kazgb 2012-08-16 22:56
    さぁがんばろう!
    と思って始めたらいきなり挫折しそうになりました><。

    ヘルプ・・・普通に表示された方いらっしゃるでしょうか?
    もしかしたら自分だけかもしれませんが、表示されずに悩んでしまいました。

    一応解決しましたが、同じ人が”もし”いたら役立つかもしれないのでカキカキ。

    色々見比べてみたところ、
    自分の環境には
    「Microsoft ヘルプ ビューアー 1.1」がインストールされていないようでした。
    いや・・・もしかしたら別の理由があったかもしれませんが、
    上記を解消するためにサービスパック1を適用しました。

    http://www.microsoft.com/ja-jp/download/details.aspx?id=23691

    こんなのあったんですね。。。皆さん適応されているのでしょうか?
    (もしかしたら自分が見落としているだけかもしれませんが・・・)
    1件のコメント
    • kinection.jp管理人 ご指摘ありがとうございます。連載第2回では「Service Pack などの更新プログラムを適用しておきましょう」とさらっと書いただけでした。追記しておきます。 2012-08-29 15:53

ジグソープレミアムレビュー

  • やってみようKinect(キネクト)アプリ開発 - ラボクルー集まれ!