センサーの状態
センサーの変更を感知する
PC に接続された Kinect センサーは、利用可能になるまでにいくつかの状態を持ちます。PC に接続されるとデバイスの初期化が行われ、使用可能な状態になった時点で接続状態となります。接続後も USB が PC から引き抜かれたり、電力の供給を失ったりすると、Kinect センサーは利用できなくなります。
アプリケーションはセンサーの状態を監視し、例えば新しいデバイスが接続されたり、逆にデバイスが失われたりしたときに、合わせて UI を更新する必要があるでしょう。
Kinect センサーの状態は Status プロパティから取得できます。
public KinectStatus Status { get; }
Status プロパティは Kinect センサーの現在の状態を表す Microsoft.Kinect.KinectStatus 列挙型の値を返します。
[ComVisibleAttribute(false)] public enum KinectStatus
この列挙型は、Kinect センサーの状態となる表1のようなメンバを宣言しています。
メンバ | 解説 |
---|---|
Connected | センサーは完全に接続され、使用準備ができている。 |
DeviceNotGenuine | センサーは適切な Kinect デバイスではない。 |
DeviceNotSupported | このデバイスはサポートされない。 |
Disconnected | センサーは USB コネクタで接続されていない。(接続が解除された) |
Error | エラーが発生している。 |
Initializing | 初期化中。 |
InsufficientBandwidth | センサーが接続されている USB コネクタは十分なバンド幅を持たない。 |
NotPowered | センサーに電力が供給されていない。 |
NotReady | センサーの準備が整っていない。 |
Undefined | 未定義の状態。 |
Kinect センサーから各種のデータを読み込むには、Kinect センサーの状態が Connected になっていなければなりません。
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は接続されている Kinect センサーの状態を出力します。
状態変更の監視
センサーの状態は常に変化する可能性があります。ユーザーは 2 代目の Kinect デバイスを PC に接続するかもしれませんし、逆に接続されている Kinect デバイスの USB を抜くかもしれません。この時、接続されている Kinect センサーの台数が変化するため、必要であればアプリケーションは使用する Kinect を再選択しなければなりません。
接続されている Kinect センサーの変更は KinectSensorCollection クラスの StatusChanged イベントによって通知されます。
public event EventHandler<StatusChangedEventArgs> StatusChanged
このイベントは KinectSensorCollection オブジェクトが管理している Kinect センサーの状態が変更されると発生します。StatusChanged イベントに登録するイベントハンドラは Microsoft.Kinect.StatusChangedEventArgs クラスのオブジェクトを受け取ります。
public sealed class StatusChangedEventArgs : EventArgs
このクラスは状態が変更された Kinect センサーの情報を提供します。状態が変更された Kinect センサーは Sensor プロパティから取得します。
public KinectSensor Sensor { get; }
このプロパティは StatusChanged イベントを発生させる要因となった、状態が変更された KinectSensor オブジェクトを返します。状態が変更されたセンサーの新しい状態は、メソッドに渡された StatusChangedEventArgs オブジェクトの Status プロパティからも得られます。
public KinectStatus Status { get; }
このプロパティは Kinect センサーの新しい状態を返します。
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はアプリケーションのスレッドを待機させ、プログラムが終わらない状態にしています。Kinect デバイスを PC に接続したり、接続を解除したりすると状態が変更され KinectSensors_StatusChanged() メソッドが呼び出されます。
一般的な Kinect アプリケーションの実装では、接続されている Kinect の情報などを表示する必要があります。アプリケーションは状態の変更をイベントで受けることで、Kinect センサーの状態変更に合わせて UI を更新できます。