Slide 1

Slide 1 text

ゼロから始める Windows Phone、Kinect連携 2011/09/17 第62回 CLR/H勉強会 素敵なおひげ

Slide 2

Slide 2 text

自己紹介  H/N:シバタ(素敵なおひげ)  Twitter: @stknohg  Blog : http://d.hatena.ne.jp/stknohg/  札幌で働くSIerです。 2010年よりCLR/Hスタッフとして活動しています。 Windows Phoneを現在進行形で勉強中。  WPArchにも一応登録してます

Slide 3

Slide 3 text

はじめに

Slide 4

Slide 4 text

ゼロから始めるって?  本セッションのタイトルは 「ゼロから始めるWindows Phone、Kinect連携」 ですが、これはスピーカーである私自身が予備 知識ゼロから始めて今日ここで発表しています。  なので、難しいことはやりません。 Windows Phone、Kinect開発の敷居の低さを知っても らいつつ基本を学んでもらうのが今日の目的です。  Kinect2割、Windows Phone8割程度の内容です。

Slide 5

Slide 5 text

今日のお題

Slide 6

Slide 6 text

Kinectで電話をかけよう! Kinect Call

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

わかります…よね?

Slide 9

Slide 9 text

Kinect Call Kinectで画面のボタンに触れる Windows Phoneに内容が伝わる!

Slide 10

Slide 10 text

デモ

Slide 11

Slide 11 text

いかがでしたか?

Slide 12

Slide 12 text

Kinect開発の基本

Slide 13

Slide 13 text

開発環境の構築  SDKのインストール  Microsoft Research  http://research.microsoft.com/en- us/um/redmond/projects/kinectsdk/download.aspx  インストーラーの指示に従ってインストールするだけ

Slide 14

Slide 14 text

Kinectを接続  KinectはXBOXに付属しているものではなく単体で 購入  XBOXに付属しているKinectはUSBポートが独自の形 状をしている  Xbox カスタマーサポートに問い合わせればUSB電源 ケーブルを追加購入可能  Kinectの電源を入れてからPCのUSBポートに接続  SDK付属のサンプルプログラムで動作確認  一部サンプルは Microsoft Speech Platform - Server Runtimeが必要

Slide 15

Slide 15 text

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(); }

Slide 16

Slide 16 text

ビデオイメージの取得  VideoStreamのオープン //VideoStreamをオープン m_NUI.VideoStream.Open(ImageStreamType.Video, //ストリームの種類 2, //先読みバッファ数 ImageResolution.Resolution640x480, //解像度 ImageType.Color); //色情報のフォーマット  VideoFrameReadyイベントでイメージを更新  ポーリングする場合はVideoStream.GetNextFrame() m_NUI.VideoFrameReady += new EventHandler(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); }

Slide 17

Slide 17 text

スケルトントラッキング  SkeletonFrameReadyイベントでデータ更新  ポーリングする場合はSkeletonEngine.GetNextFrame()  トラッキングするデータは2人まで同時認識可能 m_NUI.SkeletonFrameReady += new EventHandler(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) { …中略… } } }

Slide 18

Slide 18 text

ジョイント情報  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 」より引用

Slide 19

Slide 19 text

Coding4Fun Kinect Toolkit  Coding4Fun TeamによるToolkit  深度データ、SkeltonData計算の拡張メソッド  HoverButtonコントロール  WPF、Windows Form用  CodePlexで公開中  http://c4fkinect.codeplex.com/  Microsoft Public License (Ms-PL)

Slide 20

Slide 20 text

Windows Phone 7開発の基本

Slide 21

Slide 21 text

開発環境の構築  APP HUB  http://create.msdn.com/ja-JP  Windows Phone SDK 7.1 RC  インストーラの指示に従いインストールするだけ

Slide 22

Slide 22 text

Windows Phone開発の基本  Microsoft Visual Studio 2010 Express for Windows Phone  Windows Phone開発用のVisual Studio  Visual Studio Professional以上がすでにインストールされている 場合は統合インストールとなる  SilverlightまたはXNAベースのアプリケーションを作成

Slide 23

Slide 23 text

デザイン  Microsoft Expression Blend 4  XAMLのデザインツール  VisualStudioとの連携  Blendでデザイン、VisualStudioでコーディング

Slide 24

Slide 24 text

デバッグ、デプロイ  Windows Phone Emulator(JA)  加速度計  GPSエミュレータ  スクリーンショット  Windows Phone Developer Registration  デバイスをアンロックし実機デバックを可能にする  開発者登録(後述)が必要

Slide 25

Slide 25 text

開発者登録  実機へのデプロイには開発者登録が必要  ¥9800/年  個人はクレジットカード認証のみ  以前はGeoTrustによる本人認証が必要だった  法人の場合は現在もGeoTrustによる認証が必要  APP HUBに詳しい手順あり http://create.msdn.com/ja-jp/home/about/registration_walkthrough

Slide 26

Slide 26 text

LauncherとChooser  OSの標準機能(ビルトインアプリケーション) を呼び出す機能  Microsoft.Phone.Tasks 名前空間  LauncherとChooserの違い  Launcher  プリケーションを呼び出して終了  Chooser  アプリケーションを呼び出してアプリケーションの終了/キャンセル イベントを取得できる  注意点  アプリケーションを呼び出した時点で呼び出し元はDeactivateさ れる  Chooserを呼び出した場合は状態復帰のコードが必要になる

Slide 27

Slide 27 text

PhoneCallTask  電話をかける  PhoneNumberプロパティ  DisplayNameプロパティ  Showメソッドで電話をかける  必ず確認ダイアログが出現する  サンプルコード PhoneCallTask phoneCallTask = new PhoneCallTask(); //電話番号をセット phoneCallTask.PhoneNumber = "1234567890123"; //表示名をセット phoneCallTask.DisplayName = "素敵なおひげ"; //電話をかける phoneCallTask.Show();

Slide 28

Slide 28 text

EmailComposeTask  Emailを送信する  Toプロパティ  Subjectプロパティ  Bodyプロパティ  Showメソッドでメールを送信する  実際にはメーラーが起動される  サンプルコード EmailComposeTask emailComposeTask = new EmailComposeTask(); //送信先アドレス emailComposeTask.To = "[email protected]"; //件名 emailComposeTask.Subject = "件名"; //本文 emailComposeTask.Body = "本文"; //メーラーを起動 emailComposeTask.Show();

Slide 29

Slide 29 text

その他のLauncher クラス名 機能 BingmapTask Bingマップを起動 BingmapDicrectionsTask Bingマップを起動(経路検索) ConnectionSettingsTask 接続設定を起動 MarketplaceHubTask Marketplaceを起動(ハブ) MarketplaceDetailTask Marketplaceを起動(詳細) MarketplaceReviewTask Marketplaceを起動(レビュー) MarketplaceSearchTask Marketplaceを起動(検索) MediaPlayerLauncher MediaPlayerを起動 SearchTask Bing検索を起動 ShareLinkTask リンクの共有を起動 ShareStatusTask ステータスの共有を起動 SmsComposeTask SMSを起動 WebBrowserTask WEBブラウザを起動

Slide 30

Slide 30 text

その他の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

Slide 31

Slide 31 text

Push Notification概要

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

処理シーケンス Windows Phone MPNS Service Application(Kinect) 1. MPNSに対してPushChannelの 登録 2. 通知URIを返す 3. サービスに通知URIを登録 4. 通知URIに対して 通知メッセージを送信 5. 通知メッセージに応じた 通知を実行

Slide 34

Slide 34 text

PushChannelについて  Push Notificationを使用するアプリはMPNSに対し てチャネルを登録する必要がある  チャネルは1アプリケーション1つのみ登録可能で デバイス内で重複しない名前を付ける必要がある  1つのチャネルで3種類全ての通知が利用可能  1デバイスに対して30チャネルまで登録可能  30チャネルを超えた場合は例外発生

Slide 35

Slide 35 text

PushChannelの登録方法  HttpNotificationChannelクラス  Microsoft.Phone.Notification名前空間  コードサンプル HttpNotificationChannel PushChannel; //登録済みチャネルがないか検索 PushChannel = HttpNotificationChannel.Find("KinectCall"); // if (PushChannel == null) { //チャネルが見つからない場合は新規登録する PushChannel = new HttpNotificationChannel("KinectCall"); //通知URIが更新された時に発生するイベント PushChannel.ChannelUriUpdated += new EventHandler(PushChannel_ChannelUriUpdated); //チャネル登録時やプッシュ通知時にエラーが発生した時に発生するイベント PushChannel.ErrorOccurred += new EventHandler(PushChannel_ErrorOccurred); //チャネルをオープン PushChannel.Open(); //Toastをバインドする ※Toast Notificatonを使う場合のみ PushChannel.BindToShellToast(); //Tileをバインドする ※Tile Notificatonを使う場合のみ PushChannel.BindToShellTile(); }

Slide 36

Slide 36 text

通知URIについて  PushChannelを登録したアプリケーションに対して 専用のURIが発行される  このURIをプッシュ通知を行うサービスに登録する  通常はクラウドサービスなどを想定  このURIは丌定期に更新される  ChannelUriUpdatedイベント  更新頻度に関するドキュメントは無い?

Slide 37

Slide 37 text

通知メッセージの送信方法  通知URIに対してHTTPでPOSTするだけ  メッセージの形式は通知方法によって異なる  詳細は後述  送信結果はレスポンスのヘッダから取得  X-NotificationStatus - 通知結果  X-SubscriptionStatus - チャネルの購読状態  X-DeviceConnectionStatus - デバイスの接続状態  詳細はMSDNで  http://msdn.microsoft.com/en-us/library/ff941100(v=vs.92).aspx

Slide 38

Slide 38 text

通知メッセージの送信方法 //通知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 = "" + "" + "" + "Background.png" + "0" + "KinectCall" + "" + "" + "" + " " + ""; //バイト配列にエンコード 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); }

Slide 39

Slide 39 text

Toast Notification  画面上部にメッセージ(Toast)を表示する通知  アプリケーションが終了している時に有効  HttpNotificationChannel.BindToShellToast()  クリックするとアプリケーションを起動  遷移先のページ指定も可能

Slide 40

Slide 40 text

設定可能な項目  Title  太字のタイトル。約40文字表示可能  Sub Title  細字のサブタイトル。約47文字表示可能  Parameter  クリック時に遷移するページを指定  未指定の場合はMainPageが起動

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

メッセージ形式  Header  Payload X-WindowsPhone-Target toast X-NotificationClass 2 – ただちに通知 12 – 450秒以内に通知 22 – 900秒以内に通知 たいとる さぶたいとる /MainPage.xaml

Slide 43

Slide 43 text

Tile Notification  ホーム画面のTileを変更する通知  アプリケーション実行中、終了時に有効  HttpNotificationChannel.BindToShellTile()  クリックするとアプリケーションを起動  遷移先のページは指定できない

Slide 44

Slide 44 text

設定可能な項目(表面)  Title  Tile左下に表示するタイトル。約15文字表示可能  BackGroundImage  背景画像。JPEGまたはPNGファイルを指定  画像サイズは173*173ピクセル固定  ファイルはXAP内のリソースかWEB上のイメージを使用可能 (HTTPのみHTTPSは未サポート)  WEB上のイメージを使用する場合、サイズは80KB以下にする 必要があり、30秒でタイムアウトする。  Count  Tile右上に表示する数値。いわゆるBadge  1~99まで設定可能

Slide 45

Slide 45 text

設定可能な項目(裏面)  BackTitle  Tile左下のタイトル約15文字表示可能  BackBackGroundImage  背景画像  画像の仕様はBackgroundImageと同様  BackContent  Tile上部に表示する文字列。約40文字表示可能

Slide 46

Slide 46 text

Tile Notificationで出来ないこと  表裏の切り替えタイミングの設定  アニメーションする画像  People、Gamesの様なTileは作れない

Slide 47

Slide 47 text

メッセージ形式  Header  Payload X-WindowsPhone-Target token X-NotificationClass 1 – ただちに通知 11 – 450秒以内に通知 21 – 900秒以内に通知 Red.Jpg 1 おもて Blue.jpg うら こんてんつ

Slide 48

Slide 48 text

Tileを元に戻すには?  Clear属性を付けたメッセージを通知 Background.png KinectCall  ShellTile.Update()メソッドを実行  StandardTileData

Slide 49

Slide 49 text

Raw Notification  ユーザー定義のデータ(Raw Data)を通知  定義内容は自由  アプリケーション実行中のみ有効  HttpNotificationChannel.HttpNotificationReceived イベントで通知データを受信  HttpNotificationEventArgs.Notification.Body

Slide 50

Slide 50 text

メッセージ形式  Header  Payload  ユーザーが独自に定義  XMLである必要もない  通知の受信側でメッセージの解析が必要 X-WindowsPhone-Target 指定丌要 X-NotificationClass 3 – ただちに通知 13 – 450秒以内に通知 23 – 900秒以内に通知

Slide 51

Slide 51 text

補足

Slide 52

Slide 52 text

Winodows Phone 7→ Kinectへの通信  Push NotificationではKinectからWindows Phone 7 への通信のみ  リアルタイムな処理には当然向かない  Windows Phone OS 7.1からSocket通信がサポート される様になったので、Windows Phone 7から Kinectへの通信が実装可能  よりリアルタイムな処理もできると思われる  誰か試してください…

Slide 53

Slide 53 text

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