WisdomSoft - for your serial experiences.

センサーの状態

アプリケーションが実行されている状態で、新しい Kinect デバイスを接続したり、接続を解除したりされる可能性があります。センサーの状態が変更を通知するイベントを用いて、状態の変更を監視できます。

センサーの変更を感知する

PC に接続された Kinect センサーは、利用可能になるまでにいくつかの状態を持ちます。PC に接続されるとデバイスの初期化が行われ、使用可能な状態になった時点で接続状態となります。接続後も USB が PC から引き抜かれたり、電力の供給を失ったりすると、Kinect センサーは利用できなくなります。

アプリケーションはセンサーの状態を監視し、例えば新しいデバイスが接続されたり、逆にデバイスが失われたりしたときに、合わせて UI を更新する必要があるでしょう。

Kinect センサーの状態は Status プロパティから取得できます。

KinectSensor クラス Status プロパティ
public KinectStatus Status { get; }

Status プロパティは Kinect センサーの現在の状態を表す Microsoft.Kinect.KinectStatus 列挙型の値を返します。

Microsoft.Kinect.KinectStatus 列挙型
[ComVisibleAttribute(false)]
public enum KinectStatus

この列挙型は、Kinect センサーの状態となる表1のようなメンバを宣言しています。

表1 KinectStatus 列挙体のメンバ
メンバ 解説
Connected センサーは完全に接続され、使用準備ができている。
DeviceNotGenuine センサーは適切な Kinect デバイスではない。
DeviceNotSupported このデバイスはサポートされない。
Disconnected センサーは USB コネクタで接続されていない。(接続が解除された)
Error エラーが発生している。
Initializing 初期化中。
InsufficientBandwidth センサーが接続されている USB コネクタは十分なバンド幅を持たない。
NotPowered センサーに電力が供給されていない。
NotReady センサーの準備が整っていない。
Undefined 未定義の状態。

Kinect センサーから各種のデータを読み込むには、Kinect センサーの状態が Connected になっていなければなりません。

コード1
using System;
using Microsoft.Kinect;

class Sample
{
    static void Main(string[] args)
    {
        for(int i = 0 ; i < KinectSensor.KinectSensors.Count ; i++)
        {
            KinectSensor sensor = KinectSensor.KinectSensors[i];
            Console.WriteLine("Kinect" + i + ":" + sensor.Status);
        }
    }
}
実行結果
コード1 実行結果

コード1は接続されている Kinect センサーの状態を出力します。

状態変更の監視

センサーの状態は常に変化する可能性があります。ユーザーは 2 代目の Kinect デバイスを PC に接続するかもしれませんし、逆に接続されている Kinect デバイスの USB を抜くかもしれません。この時、接続されている Kinect センサーの台数が変化するため、必要であればアプリケーションは使用する Kinect を再選択しなければなりません。

接続されている Kinect センサーの変更は KinectSensorCollection クラスの StatusChanged イベントによって通知されます。

KinectSensorCollection クラス StatusChanged イベント
public event EventHandler<StatusChangedEventArgs> StatusChanged

このイベントは KinectSensorCollection オブジェクトが管理している Kinect センサーの状態が変更されると発生します。StatusChanged イベントに登録するイベントハンドラは Microsoft.Kinect.StatusChangedEventArgs クラスのオブジェクトを受け取ります。

Microsoft.Kinect.StatusChangedEventArgs クラス
public sealed class StatusChangedEventArgs : EventArgs

このクラスは状態が変更された Kinect センサーの情報を提供します。状態が変更された Kinect センサーは Sensor プロパティから取得します。

StatusChangedEventArgs クラス Sensor プロパティ
public KinectSensor Sensor { get; }

このプロパティは StatusChanged イベントを発生させる要因となった、状態が変更された KinectSensor オブジェクトを返します。状態が変更されたセンサーの新しい状態は、メソッドに渡された StatusChangedEventArgs オブジェクトの Status プロパティからも得られます。

StatusChangedEventArgs クラス Status プロパティ
public KinectStatus Status { get; }

このプロパティは Kinect センサーの新しい状態を返します。

コード2
using System;
using System.Threading;
using Microsoft.Kinect;

class Sample
{
    static void Main(string[] args)
    {
        KinectSensor.KinectSensors.StatusChanged += KinectSensors_StatusChanged;
        Thread.Sleep(Timeout.Infinite);
    }

    static void KinectSensors_StatusChanged(object sender, StatusChangedEventArgs e)
    {
        Console.WriteLine("--StatusChanged " + e.Status + "--");
        Console.WriteLine("Connection ID=" + e.Sensor.DeviceConnectionId);
        Console.WriteLine("Kinect ID=" + e.Sensor.UniqueKinectId);
    }
}
実行結果
コード2 実行結果

コード2はアプリケーションのスレッドを待機させ、プログラムが終わらない状態にしています。Kinect デバイスを PC に接続したり、接続を解除したりすると状態が変更され KinectSensors_StatusChanged() メソッドが呼び出されます。

一般的な Kinect アプリケーションの実装では、接続されている Kinect の情報などを表示する必要があります。アプリケーションは状態の変更をイベントで受けることで、Kinect センサーの状態変更に合わせて UI を更新できます。