センサーから取得したデータの利用

2010年10月22日(金)
PROJECT KySS

Windows API Code Packの利用

1)新規ソリューションフォルダの作成

Windows API Code Pack のプロジェクトを追加するために、新規ソリューションフォルダを作成します。

VS2010のソリューションエクスプローラ上で右クリックして、[Add][New Solution Folder]を選択し、フォルダ名を「CodePack」に変更しておきます(図12)。

図12:ソリューション直下に、CodePackサブフォルダを作成する(クリックで拡大)

2)Windows API Code Pack中のプロジェクトの追加

作成したフォルダの上で右クリックし、[Add][Existing Project...]で、先ほど展開したWindows API Code Packの、「Core」「Shell」「Sensors」のサブフォルダの中にある、各プロジェクト(.csprojファイル)を指定して、追加します(図13)。初めて追加した場合は、以前のバージョンから現バージョンへの変換ウィザードが起動することがあります。その場合は、「Next」「Next」と進み、「Finish」して「Close」します。

図13:Windows API Code Packの「Core」「Shell」「Sensors」のプロジェクトファイルを追加する(クリックで拡大)

3)Windows API Code Pack中のプロジェクトの関連付け

プロジェクト名(ここではデフォルトの「WPF_sensor」)の上で右クリックし、ショートカットメニューの「Add Reference」で、3つのプロジェクトをすべて選択して「OK」し、追加します(図14)。
追加した結果を確認したい場合は、[Show All Files]アイコンをクリックして展開します(図15)。

図14:3つのプロジェクトを選択して関連付ける(クリックで拡大)

図15:3つのプロジェクトの追加結果を確認する

4)クラスの追加

先に作成しておいたSensorsプロジェクトのSensorsサブフォルダを右クリックし、[Add][NewFolder]で新しいフォルダを作成します。フォルダの名前は、「Biometric」にしておきます(図16)。

図16:SensorsプロジェクトのSensorsフォルダ内にクラスを作成するためのフォルダを作成する(クリックで拡大)

さらに、作成したフォルダを右クリックし、[Add][Class...]で、Nameに「HumanPresence.cs」を入力して、この名前の新しいクラスを追加します(図17)。

図17:新しいクラス、HumanPresence.csを作成する(クリックで拡大)

これら各クラスのコードはC#になっていますが、本稿では、MainPage.xaml.vbのプログラミングにVisual Basicを使用しています。C#のクラスをVisual Basicから呼び出します。

5)HumanPresence.csの編集

HumanPresence.csをダブルクリックしてコード画面を表示します。

今回は、既存のラッパーを使います。Microsoft社の次のURLで公開されていますので、入手してHumanPresence.csを変更してください(図18)。
 →参照リンク

なお、このMSDNでのAPIおよびドキュメントの使用条件に関しては、同ページ最下部の「使用条件」からリンクして表示されるページを参照してください。

図18:HumanPresence.csが、Microsoft社のMSDNのサイトで公開されている

データ取得プログラムの作成

1)空のXML文書ファイルの作成

HumanPresence.csを編集できたら、センサー情報を使った処理を記述していきます。

今回実装する処理は2つです。1つは、人を感知した時に、アニメーションを実行する処理です。このアニメーションは先ほど作成しました。

もう1つは、感知した年月日日時をXMLデータとして記録していく処理です。そこで、リスト2のような、ルート要素のみの空のXML文書ファイル(sensorCapture.xml)を作成しておきます。

このXML文書ファイルは、プロジェクト(ここではWPF_sensorプロジェクト)のbin/Debugサブフォルダの中に、「data」サブフォルダを作成して追加してください。Windows 7 の「コンピュータ」からフォルダをたどるのではなく、VS2010の中で追加する場合は、[Show All Files]アイコンをクリックすると、Solution Explorerにbin/Debugサブフォルダが表示されます。

リスト2 記録用のXML文書ファイル(sensorCapture.xml)。プロジェクト内のbin/debugサブフォルダ内に、「data」サブフォルダを作成して、その中に置く。

なお、本サンプルでは、XMLファイルのノード数の上限は定めていません。人の出入りの多い場所でデバッグを繰り返すと、XMLファイルが肥大化します。テストを繰り返した後は、XML文書ファイルを開き、リスト2のように、XML宣言とルート要素のみ残して、記録されたデータを削除してください。

2) アニメーションの実行とXMLデータの記録の実装

2つの処理を実行するプログラムを記述していきます。MainWindow.xamlを展開して表示される、MainWindow.xaml.vbをダブルクリックして開き、リスト3のようにロジック・コードを記述します。

まず、Dim humanPresence = SensorManager.GetSensorsByTypeId(Of HumanPresence)().First()で、IdによってHuman Presenceセンサーを識別して取り出し、AddHandler humanPresence.DataReportChanged, AddressOf Me.myDataReportChangedのように記述して、センサーの検知状態が変化した時に発生するDataReportChangedイベントで、myDataReportChangedプロシジャを実行します。

myDataReportChangedプロシジャでは、センサーからの情報をキャストして、変数humanPresenceに格納し、Delegatorを呼び出します。Delegator を呼び出すことで、UIControl クラスのディスパッチスレッドに処理を委譲します。人感センサーでは、変化を感知した時に非同期で値を取得するので、Dispatcher.BeginInvoke メソッドを使って、デリゲートを非同期的に実行します。

人の存在を感知した場合、新規ストーリーボードを生成し、ストーリーボード名を指定してアニメーションを実行します。また、XML文書ファイルを指定して読み込み、子要素capture、year、date、timeを生成して、データを追加し、保存します。

リスト3 人が感された時にアニメーションを実行してXMLデータを記録するロジック・コード(MainWindow.xaml.vb)

3)動作確認と、記録されたXMLデータの確認

サンプルが作成できたらデバッグしましょう。その際、センサーは人がいない方向に向けて机の上に固定し、手をかざすことによって確認します。PCの設置場所の状態によって反応に違いがある場合は、「コントロールパネル」から前述の「I-O DATA SENSOR-HMオプション」を開いておき、表示される「在籍中」あるいは「離籍中」のメッセージと比較してみるとよいでしょう。

デバッグしたら、XML文書ファイルを開いてみてください。リスト4のような構造で、データが記録されています。

リスト4 記録されたXML文書ファイルの例(sensorCapture.xml)

4) 他のセンサーを使う場合

今回は、人感センサーを使いましたが、他のセンサーを使いたい時は、センサーのタイプとデータのタイプを確認して、コードを書き換える必要があります。それらの情報は、c:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\sensors.hにあります。センサーの分類とタイプは、表1のとおりです。

表1:sensors.hファイル中にある、センサータイプの一覧

SENSOR_CATEGORY_
LOCATION
SENSOR_TYPE_LOCATION_GPS
SENSOR_TYPE_LOCATION_STATIC
SENSOR_TYPE_LOCATION_LOOKUP
SENSOR_TYPE_LOCATION_TRIANGULATION
SENSOR_TYPE_LOCATION_OTHER
SENSOR_TYPE_LOCATION_BROADCAST
SENSOR_TYPE_LOCATION_DEAD_RECKONING
SENSOR_CATEGORY_
ENVIRONMENTAL
SENSOR_TYPE_ENVIRONMENTAL_TEMPERATURE
SENSOR_TYPE_ENVIRONMENTAL_ATMOSPHERIC_PRESSURE
SENSOR_TYPE_ENVIRONMENTAL_HUMIDITY
SENSOR_TYPE_ENVIRONMENTAL_WIND_SPEED
SENSOR_TYPE_ENVIRONMENTAL_WIND_DIRECTION
SENSOR_CATEGORY_
MOTION
SENSOR_TYPE_ACCELEROMETER_1D
SENSOR_TYPE_ACCELEROMETER_2D
SENSOR_TYPE_ACCELEROMETER_3D
SENSOR_TYPE_MOTION_DETECTOR
SENSOR_TYPE_GYROMETER_1D
SENSOR_TYPE_GYROMETER_2D
SENSOR_TYPE_GYROMETER_3D
SENSOR_TYPE_SPEEDOMETER
SENSOR_CATEGORY_
ORIENTATION
SENSOR_TYPE_COMPASS_1D
SENSOR_TYPE_COMPASS_2D
SENSOR_TYPE_COMPASS_3D
SENSOR_TYPE_INCLINOMETER_1D
SENSOR_TYPE_INCLINOMETER_2D
SENSOR_TYPE_INCLINOMETER_3D
SENSOR_TYPE_DISTANCE_1D
SENSOR_TYPE_DISTANCE_2D
SENSOR_TYPE_DISTANCE_3D
SENSOR_CATEGORY_
ELECTRICAL
SENSOR_TYPE_VOLTAGE
SENSOR_TYPE_CURRENT
SENSOR_TYPE_CAPACITANCE
SENSOR_TYPE_RESISTANCE
SENSOR_TYPE_INDUCTANCE
SENSOR_TYPE_ELECTRICAL_POWER
SENSOR_TYPE_POTENTIOMETER
SENSOR_CATEGORY_
MECHANICAL
SENSOR_TYPE_BOOLEAN_SWITCH
SENSOR_TYPE_MULTIVALUE_SWITCH
SENSOR_TYPE_FORCE
SENSOR_TYPE_SCALE
SENSOR_TYPE_PRESSURE
SENSOR_TYPE_STRAIN
SENSOR_CATEGORY_
BIOMETRIC
SENSOR_TYPE_HUMAN_PRESENCE
SENSOR_TYPE_HUMAN_PROXIMITY
SENSOR_TYPE_TOUCH
SENSOR_CATEGORY_
LIGHT
SENSOR_TYPE_AMBIENT_LIGHT
SENSOR_CATEGORY_
SCANNER
SENSOR_TYPE_RFID_SCANNER
SENSOR_TYPE_BARCODE_SCANNER

最終回の次回は、Windows 7ならではの、タッチ機能を紹介します。

四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。http://www.PROJECTKySS.NET/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています