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

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ならではの、タッチ機能を紹介します。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- モーションセンサーとShareStatusTask、MediaPlayerLauncherを使う
- ContextMenuコントロールを使う、加速度センサー、GPSでの位置情報取得
- Windows Phone 開発環境の構築と最初のプログラム
- Bing Maps上に地震の震源地を表示するプログラムを作る
- PathListBoxを使った画像の移動
- TabControlでの画像の切り替えとRichTextBoxの利用
- 画像のドラッグ、移動、回転、拡大縮小を行う+1つのサンプル
- 入力された住所の位置をBing Mapsに表示する
- Silverlight 4の概要と、開発環境の構築
- タッチパネルでドラッグ&ドロップを使う汎用的なサンプル