ゼロからはじめるWindows Phone、Kinect連携

53
ゼロから始める Windows PhoneKinect連携 2011/09/17 62CLR/H勉強会 素敵なおひげ

description

第62回CLR/H勉強会で発表した資料です。

Transcript of ゼロからはじめるWindows Phone、Kinect連携

Page 1: ゼロからはじめるWindows Phone、Kinect連携

ゼロから始める

Windows Phone、Kinect連携

2011/09/17 第62回 CLR/H勉強会

素敵なおひげ

Page 2: ゼロからはじめるWindows Phone、Kinect連携

自己紹介

H/N:シバタ(素敵なおひげ)

Twitter: @stknohg

Blog : http://d.hatena.ne.jp/stknohg/

札幌で働くSIerです。

2010年よりCLR/Hスタッフとして活動しています。

Windows Phoneを現在進行形で勉強中。

WPArchにも一応登録してます

Page 3: ゼロからはじめるWindows Phone、Kinect連携

はじめに

Page 4: ゼロからはじめるWindows Phone、Kinect連携

ゼロから始めるって?

本セッションのタイトルは

「ゼロから始めるWindows Phone、Kinect連携」 ですが、これはスピーカーである私自身が予備

知識ゼロから始めて今日ここで発表しています。

なので、難しいことはやりません。

Windows Phone、Kinect開発の敷居の低さを知ってもらいつつ基本を学んでもらうのが今日の目的です。

Kinect2割、Windows Phone8割程度の内容です。

Page 5: ゼロからはじめるWindows Phone、Kinect連携

今日のお題

Page 6: ゼロからはじめるWindows Phone、Kinect連携

Kinectで電話をかけよう!

Kinect Call

Page 7: ゼロからはじめるWindows Phone、Kinect連携
Page 8: ゼロからはじめるWindows Phone、Kinect連携

わかります…よね?

Page 9: ゼロからはじめるWindows Phone、Kinect連携

Kinect Call

Kinectで画面のボタンに触れる

Windows Phoneに内容が伝わる!

Page 10: ゼロからはじめるWindows Phone、Kinect連携

デモ

Page 11: ゼロからはじめるWindows Phone、Kinect連携

いかがでしたか?

Page 12: ゼロからはじめるWindows Phone、Kinect連携

Kinect開発の基本

Page 13: ゼロからはじめるWindows Phone、Kinect連携

開発環境の構築

SDKのインストール

Microsoft Research

http://research.microsoft.com/en-

us/um/redmond/projects/kinectsdk/download.aspx

インストーラーの指示に従ってインストールするだけ

Page 14: ゼロからはじめるWindows Phone、Kinect連携

Kinectを接続

KinectはXBOXに付属しているものではなく単体で購入

XBOXに付属しているKinectはUSBポートが独自の形状をしている

Xbox カスタマーサポートに問い合わせればUSB電源ケーブルを追加購入可能

Kinectの電源を入れてからPCのUSBポートに接続

SDK付属のサンプルプログラムで動作確認

一部サンプルは

Microsoft Speech Platform - Server Runtimeが必要

Page 15: ゼロからはじめるWindows Phone、Kinect連携

Kinect開発の基本

参照設定

Microsoft.Research.Kinect (GAC)

アプリケーションの初期化と終了 using Microsoft.Research.Kinect.Nui; private Runtime m_NUI; //ランタイムの初期化 m_NUI = new Runtime(0); //index = 接続されたKinectのインデックス // m_NUI.Initialize(RuntimeOptions.UseDepthAndPlayerIndex | //深度とプレイヤー RuntimeOptions.UseSkeletalTracking | //スケルトントラッキング RuntimeOptions.UseColor); //色情報

//ラインタイムの終了処理

if (m_NUI != null)

{

m_NUI.Uninitialize();

}

Page 16: ゼロからはじめるWindows Phone、Kinect連携

ビデオイメージの取得

VideoStreamのオープン //VideoStreamをオープン m_NUI.VideoStream.Open(ImageStreamType.Video, //ストリームの種類 2, //先読みバッファ数 ImageResolution.Resolution640x480, //解像度 ImageType.Color); //色情報のフォーマット

VideoFrameReadyイベントでイメージを更新

ポーリングする場合はVideoStream.GetNextFrame()

m_NUI.VideoFrameReady += new EventHandler<ImageFrameReadyEventArgs>(Nui_VideoFrameReady); private void Nui_VideoFrameReady(object sender, ImageFrameReadyEventArgs e) { //PlanarImageで画像データを保持 PlanarImage PI = e.ImageFrame.Image; //ImageオブジェクトにBitmap変換して表示 this.imgVideo.Source = BitmapSource.Create(PI.Width,PI.Height, 96,96,PixelFormats.Bgr32, null,PI.Bits,PI.Width * PI.BytesPerPixel); }

Page 17: ゼロからはじめるWindows Phone、Kinect連携

スケルトントラッキング

SkeletonFrameReadyイベントでデータ更新

ポーリングする場合はSkeletonEngine.GetNextFrame()

トラッキングするデータは2人まで同時認識可能

m_NUI.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(Nui_SkeletonFrameReady); private void Nui_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) {

SkeletonData FirstSkelton = null; //トラッキングデータは複数認識可能 foreach (SkeletonData s in e.SkeletonFrame.Skeletons) { if (s.TrackingState == SkeletonTrackingState.Tracked) { …中略… } }

}

Page 18: ゼロからはじめるWindows Phone、Kinect連携

ジョイント情報

20ヶ所のジョイント情報を取得可能

SkeltonData. Jointsプロパティ(JointID列挙型のCollecton)

JointID 位置 JointID 位置

Head 頭 Spine 胴

ShoulderCenter 首元 HipCenter 腰

HandRight 右手 HandLeft 左手

WristRight 右手首 WristLeft 左手首

ElbowRIght 右肘 ElbowLeft 左肘

ShoulderRight 右肩 ShoulderLeft 左肩

HipRight 右尻 HipLeft 左尻

KneeRIght 右膝 KneeLeft 左膝

AnkleRIght 右足首 AnkleLeft 左足首

FootRIght 右足 FootLeft 左足

※図は「 Programming Guide: Getting Started with the Kinect for Windows SDK Beta 」より引用

Page 19: ゼロからはじめるWindows Phone、Kinect連携

Coding4Fun Kinect Toolkit

Coding4Fun TeamによるToolkit

深度データ、SkeltonData計算の拡張メソッド

HoverButtonコントロール

WPF、Windows Form用

CodePlexで公開中

http://c4fkinect.codeplex.com/

Microsoft Public License (Ms-PL)

Page 20: ゼロからはじめるWindows Phone、Kinect連携

Windows Phone 7開発の基本

Page 21: ゼロからはじめるWindows Phone、Kinect連携

開発環境の構築

APP HUB

http://create.msdn.com/ja-JP

Windows Phone SDK 7.1 RC

インストーラの指示に従いインストールするだけ

Page 22: ゼロからはじめるWindows Phone、Kinect連携

Windows Phone開発の基本

Microsoft Visual Studio 2010 Express for Windows Phone

Windows Phone開発用のVisual Studio

Visual Studio Professional以上がすでにインストールされている場合は統合インストールとなる

SilverlightまたはXNAベースのアプリケーションを作成

Page 23: ゼロからはじめるWindows Phone、Kinect連携

デザイン

Microsoft Expression Blend 4

XAMLのデザインツール

VisualStudioとの連携

Blendでデザイン、VisualStudioでコーディング

Page 24: ゼロからはじめるWindows Phone、Kinect連携

デバッグ、デプロイ

Windows Phone Emulator(JA)

加速度計

GPSエミュレータ

スクリーンショット

Windows Phone Developer Registration

デバイスをアンロックし実機デバックを可能にする

開発者登録(後述)が必要

Page 25: ゼロからはじめるWindows Phone、Kinect連携

開発者登録

実機へのデプロイには開発者登録が必要

¥9800/年

個人はクレジットカード認証のみ

以前はGeoTrustによる本人認証が必要だった

法人の場合は現在もGeoTrustによる認証が必要

APP HUBに詳しい手順あり http://create.msdn.com/ja-jp/home/about/registration_walkthrough

Page 26: ゼロからはじめるWindows Phone、Kinect連携

LauncherとChooser

OSの標準機能(ビルトインアプリケーション) を呼び出す機能

Microsoft.Phone.Tasks 名前空間

LauncherとChooserの違い

Launcher

プリケーションを呼び出して終了

Chooser

アプリケーションを呼び出してアプリケーションの終了/キャンセルイベントを取得できる

注意点

アプリケーションを呼び出した時点で呼び出し元はDeactivateされる

Chooserを呼び出した場合は状態復帰のコードが必要になる

Page 27: ゼロからはじめるWindows Phone、Kinect連携

PhoneCallTask

電話をかける

PhoneNumberプロパティ

DisplayNameプロパティ

Showメソッドで電話をかける

必ず確認ダイアログが出現する

サンプルコード

PhoneCallTask phoneCallTask = new PhoneCallTask(); //電話番号をセット phoneCallTask.PhoneNumber = "1234567890123"; //表示名をセット phoneCallTask.DisplayName = "素敵なおひげ"; //電話をかける phoneCallTask.Show();

Page 28: ゼロからはじめるWindows Phone、Kinect連携

EmailComposeTask

Emailを送信する

Toプロパティ

Subjectプロパティ

Bodyプロパティ

Showメソッドでメールを送信する

実際にはメーラーが起動される

サンプルコード EmailComposeTask emailComposeTask = new EmailComposeTask(); //送信先アドレス emailComposeTask.To = "[email protected]"; //件名 emailComposeTask.Subject = "件名"; //本文 emailComposeTask.Body = "本文"; //メーラーを起動 emailComposeTask.Show();

Page 29: ゼロからはじめるWindows Phone、Kinect連携

その他のLauncher

クラス名 機能

BingmapTask Bingマップを起動

BingmapDicrectionsTask Bingマップを起動(経路検索)

ConnectionSettingsTask 接続設定を起動

MarketplaceHubTask Marketplaceを起動(ハブ)

MarketplaceDetailTask Marketplaceを起動(詳細)

MarketplaceReviewTask Marketplaceを起動(レビュー)

MarketplaceSearchTask Marketplaceを起動(検索)

MediaPlayerLauncher MediaPlayerを起動

SearchTask Bing検索を起動

ShareLinkTask リンクの共有を起動

ShareStatusTask ステータスの共有を起動

SmsComposeTask SMSを起動

WebBrowserTask WEBブラウザを起動

Page 30: ゼロからはじめるWindows Phone、Kinect連携

その他のChooser

クラス名 機能

AddressChooserTask アドレス帳を取得する

CameraCaputureTask カメラを起動し撮った写真を取得する

EmailAddressChooserTask メールアドレスを取得する

GameInviteTask ゲームへ招待する

PhoneNumberChooserTask 電話番号を取得する

PhotoChooserTask 画像を取得する

SaveContactTask 連絡先を登録する

SaveEmailTask Emailアドレスを登録する

SavePhoneNumberTask 電話番号を登録する

SaveRingtoneTask 着信音を登録する

Launcher/Chooserの詳細はMSDNで

http://msdn.microsoft.com/en-us/library/ff769556(v=VS.92).aspx

Page 31: ゼロからはじめるWindows Phone、Kinect連携

Push Notification概要

Page 32: ゼロからはじめるWindows Phone、Kinect連携

Push Notificationとは

登録したサービスからWindows Phoneへ対する

プッシュ配信による通知機能

通知方法は3種類

Toast Notification

Tile Notification

Raw Notification

Microsoft Push Notification Service(MPNS)を介して

通知を行う

MSDN

http://msdn.microsoft.com/en-us/library/ff402558(v=vs.92).aspx

Page 33: ゼロからはじめるWindows Phone、Kinect連携

処理シーケンス

Windows Phone MPNS

Service Application(Kinect)

1. MPNSに対してPushChannelの

登録

2. 通知URIを返す

3. サービスに通知URIを登録 4. 通知URIに対して

通知メッセージを送信

5. 通知メッセージに応じた

通知を実行

Page 34: ゼロからはじめるWindows Phone、Kinect連携

PushChannelについて

Push Notificationを使用するアプリはMPNSに対してチャネルを登録する必要がある

チャネルは1アプリケーション1つのみ登録可能でデバイス内で重複しない名前を付ける必要がある

1つのチャネルで3種類全ての通知が利用可能

1デバイスに対して30チャネルまで登録可能

30チャネルを超えた場合は例外発生

Page 35: ゼロからはじめるWindows Phone、Kinect連携

PushChannelの登録方法

HttpNotificationChannelクラス

Microsoft.Phone.Notification名前空間

コードサンプル

HttpNotificationChannel PushChannel;

//登録済みチャネルがないか検索

PushChannel = HttpNotificationChannel.Find("KinectCall");

//

if (PushChannel == null)

{

//チャネルが見つからない場合は新規登録する

PushChannel = new HttpNotificationChannel("KinectCall");

//通知URIが更新された時に発生するイベント PushChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(PushChannel_ChannelUriUpdated); //チャネル登録時やプッシュ通知時にエラーが発生した時に発生するイベント

PushChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(PushChannel_ErrorOccurred);

//チャネルをオープン

PushChannel.Open();

//Toastをバインドする ※Toast Notificatonを使う場合のみ PushChannel.BindToShellToast();

//Tileをバインドする ※Tile Notificatonを使う場合のみ

PushChannel.BindToShellTile();

}

Page 36: ゼロからはじめるWindows Phone、Kinect連携

通知URIについて

PushChannelを登録したアプリケーションに対して専用のURIが発行される

このURIをプッシュ通知を行うサービスに登録する

通常はクラウドサービスなどを想定

このURIは丌定期に更新される

ChannelUriUpdatedイベント

更新頻度に関するドキュメントは無い?

Page 37: ゼロからはじめるWindows Phone、Kinect連携

通知メッセージの送信方法

通知URIに対してHTTPでPOSTするだけ

メッセージの形式は通知方法によって異なる

詳細は後述

送信結果はレスポンスのヘッダから取得

X-NotificationStatus - 通知結果

X-SubscriptionStatus - チャネルの購読状態

X-DeviceConnectionStatus - デバイスの接続状態

詳細はMSDNで http://msdn.microsoft.com/en-us/library/ff941100(v=vs.92).aspx

Page 38: ゼロからはじめるWindows Phone、Kinect連携

通知メッセージの送信方法 //通知URIに対するHTTPリクエストを発行 HttpWebRequest NotificationRequest = (HttpWebRequest)WebRequest.Create("http://sn1.notify.live.net/throttledthirdparty/01.00/xxxxxx...xxxxxxx" ); //POST NotificationRequest.Method = "POST"; //メッセージの作成(Tile Notificationの場合) string Message = "<?xml version=¥"1.0¥" encoding=¥"utf-8¥"?>" + "<wp:Notification xmlns:wp=¥"WPNotification¥">" + "<wp:Tile>" + "<wp:BackgroundImage>Background.png</wp:BackgroundImage>" + "<wp:Count>0</wp:Count>" + "<wp:Title >KinectCall</wp:Title>" + "<wp:BackBackgroundImage action=¥"clear¥"></wp:BackBackgroundImage>" + "<wp:BackTitle action=¥"clear¥"></wp:BackTitle>" + "<wp:BackContent action=¥"clear¥"></wp:BackContent>" + "</wp:Tile> " + "</wp:Notification>"; //バイト配列にエンコード byte[] notificationMessage = Encoding.UTF8.GetBytes(Message); //Content設定 NotificationRequest.ContentLength = notificationMessage.Length; NotificationRequest.ContentType = "text/xml"; NotificationRequest.Headers.Add("X-WindowsPhone-Target", "token"); NotificationRequest.Headers.Add("X-NotificationClass", "1"); //メッセージ送信 using (Stream requestStream = NotificationRequest.GetRequestStream()) { requestStream.Write(notificationMessage, 0, notificationMessage.Length); }

Page 39: ゼロからはじめるWindows Phone、Kinect連携

Toast Notification

画面上部にメッセージ(Toast)を表示する通知

アプリケーションが終了している時に有効

HttpNotificationChannel.BindToShellToast()

クリックするとアプリケーションを起動

遷移先のページ指定も可能

Page 40: ゼロからはじめるWindows Phone、Kinect連携

設定可能な項目

Title

太字のタイトル。約40文字表示可能

Sub Title

細字のサブタイトル。約47文字表示可能

Parameter

クリック時に遷移するページを指定

未指定の場合はMainPageが起動

Page 41: ゼロからはじめるWindows Phone、Kinect連携

Toast Notificationの注意点

アプリケーションの初回起動時にToast通知を行う旨の確認メッセージを出す必要がある

他の通知では丌要

Application Certification Requirements

6.2.2 – Toast Notification Opt-In http://msdn.microsoft.com/en-us/library/hh184838(v=vs.92).aspx

Page 42: ゼロからはじめるWindows Phone、Kinect連携

メッセージ形式

Header

Payload

X-WindowsPhone-Target toast

X-NotificationClass 2 – ただちに通知

12 – 450秒以内に通知

22 – 900秒以内に通知

<?xml version="1.0" encoding="utf-8"?> <wp:Notification xmlns:wp="WPNotification">

<wp:Toast> <wp:Text1>たいとる</wp:Text1> <wp:Text2>さぶたいとる</wp:Text2> <wp:Param>/MainPage.xaml</wp:Param> </wp:Toast>

</wp:Notification>

Page 43: ゼロからはじめるWindows Phone、Kinect連携

Tile Notification

ホーム画面のTileを変更する通知

アプリケーション実行中、終了時に有効

HttpNotificationChannel.BindToShellTile()

クリックするとアプリケーションを起動

遷移先のページは指定できない

Page 44: ゼロからはじめるWindows Phone、Kinect連携

設定可能な項目(表面)

Title

Tile左下に表示するタイトル。約15文字表示可能

BackGroundImage

背景画像。JPEGまたはPNGファイルを指定

画像サイズは173*173ピクセル固定

ファイルはXAP内のリソースかWEB上のイメージを使用可能 (HTTPのみHTTPSは未サポート)

WEB上のイメージを使用する場合、サイズは80KB以下にする 必要があり、30秒でタイムアウトする。

Count

Tile右上に表示する数値。いわゆるBadge

1~99まで設定可能

Page 45: ゼロからはじめるWindows Phone、Kinect連携

設定可能な項目(裏面)

BackTitle

Tile左下のタイトル約15文字表示可能

BackBackGroundImage

背景画像

画像の仕様はBackgroundImageと同様

BackContent

Tile上部に表示する文字列。約40文字表示可能

Page 46: ゼロからはじめるWindows Phone、Kinect連携

Tile Notificationで出来ないこと

表裏の切り替えタイミングの設定

アニメーションする画像

People、Gamesの様なTileは作れない

Page 47: ゼロからはじめるWindows Phone、Kinect連携

メッセージ形式

Header

Payload

X-WindowsPhone-Target token

X-NotificationClass 1 – ただちに通知

11 – 450秒以内に通知

21 – 900秒以内に通知

<?xml version="1.0" encoding="utf-8"?> <wp:Notification xmlns:wp="WPNotification"> <wp:Tile> <wp:BackgroundImage>Red.Jpg</wp:BackgroundImage> <wp:Count>1</wp:Count> <wp:Title>おもて</wp:Title> <wp:BackBackgroundImage>Blue.jpg</wp:BackBackgroundImage> <wp:BackTitle>うら</wp:BackTitle> <wp:BackContent>こんてんつ</wp:BackContent> </wp:Tile> </wp:Notification>

Page 48: ゼロからはじめるWindows Phone、Kinect連携

Tileを元に戻すには?

Clear属性を付けたメッセージを通知

<?xml version="1.0" encoding="utf-8"?> <wp:Notification xmlns:wp="WPNotification"> <wp:Tile> <wp:BackgroundImage>Background.png</wp:BackgroundImage> <wp:Count action="clear"></wp:Count> <wp:Title >KinectCall</wp:Title> <wp:BackBackgroundImage action="clear"></wp:BackBackgroundImage> <wp:BackTitle action="clear"></wp:BackTitle> <wp:BackContent action="clear"></wp:BackContent> </wp:Tile> </wp:Notification>

ShellTile.Update()メソッドを実行

StandardTileData

Page 49: ゼロからはじめるWindows Phone、Kinect連携

Raw Notification

ユーザー定義のデータ(Raw Data)を通知

定義内容は自由

アプリケーション実行中のみ有効

HttpNotificationChannel.HttpNotificationReceived

イベントで通知データを受信

HttpNotificationEventArgs.Notification.Body

Page 50: ゼロからはじめるWindows Phone、Kinect連携

メッセージ形式

Header

Payload

ユーザーが独自に定義

XMLである必要もない

通知の受信側でメッセージの解析が必要

X-WindowsPhone-Target 指定丌要

X-NotificationClass 3 – ただちに通知

13 – 450秒以内に通知

23 – 900秒以内に通知

Page 51: ゼロからはじめるWindows Phone、Kinect連携

補足

Page 52: ゼロからはじめるWindows Phone、Kinect連携

Winodows Phone 7→ Kinectへの通信

Push NotificationではKinectからWindows Phone 7

への通信のみ

リアルタイムな処理には当然向かない

Windows Phone OS 7.1からSocket通信がサポートされる様になったので、Windows Phone 7からKinectへの通信が実装可能

よりリアルタイムな処理もできると思われる

誰か試してください…

Page 53: ゼロからはじめるWindows Phone、Kinect連携

ご静聴ありがとうございました