PR

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

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のWebサイトにログインすることでさまざまな限定特典を入手できるようになります。

Think IT会員サービスの概要とメリットをチェック

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