Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

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

Takuya Shibata

September 17, 2011
Tweet

More Decks by Takuya Shibata

Other Decks in Technology

Transcript

  1. 自己紹介  H/N:シバタ(素敵なおひげ)  Twitter: @stknohg  Blog : http://d.hatena.ne.jp/stknohg/

     札幌で働くSIerです。 2010年よりCLR/Hスタッフとして活動しています。 Windows Phoneを現在進行形で勉強中。  WPArchにも一応登録してます
  2. Kinectを接続  KinectはXBOXに付属しているものではなく単体で 購入  XBOXに付属しているKinectはUSBポートが独自の形 状をしている  Xbox カスタマーサポートに問い合わせればUSB電源

    ケーブルを追加購入可能  Kinectの電源を入れてからPCのUSBポートに接続  SDK付属のサンプルプログラムで動作確認  一部サンプルは Microsoft Speech Platform - Server Runtimeが必要
  3. 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(); }
  4. ビデオイメージの取得  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); }
  5. スケルトントラッキング  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) { …中略… } } }
  6. ジョイント情報  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 」より引用
  7. Coding4Fun Kinect Toolkit  Coding4Fun TeamによるToolkit  深度データ、SkeltonData計算の拡張メソッド  HoverButtonコントロール

     WPF、Windows Form用  CodePlexで公開中  http://c4fkinect.codeplex.com/  Microsoft Public License (Ms-PL)
  8. 開発環境の構築  APP HUB  http://create.msdn.com/ja-JP  Windows Phone SDK

    7.1 RC  インストーラの指示に従いインストールするだけ
  9. Windows Phone開発の基本  Microsoft Visual Studio 2010 Express for Windows

    Phone  Windows Phone開発用のVisual Studio  Visual Studio Professional以上がすでにインストールされている 場合は統合インストールとなる  SilverlightまたはXNAベースのアプリケーションを作成
  10. デバッグ、デプロイ  Windows Phone Emulator(JA)  加速度計  GPSエミュレータ 

    スクリーンショット  Windows Phone Developer Registration  デバイスをアンロックし実機デバックを可能にする  開発者登録(後述)が必要
  11. 開発者登録  実機へのデプロイには開発者登録が必要  ¥9800/年  個人はクレジットカード認証のみ  以前はGeoTrustによる本人認証が必要だった 

    法人の場合は現在もGeoTrustによる認証が必要  APP HUBに詳しい手順あり http://create.msdn.com/ja-jp/home/about/registration_walkthrough
  12. LauncherとChooser  OSの標準機能(ビルトインアプリケーション) を呼び出す機能  Microsoft.Phone.Tasks 名前空間  LauncherとChooserの違い 

    Launcher  プリケーションを呼び出して終了  Chooser  アプリケーションを呼び出してアプリケーションの終了/キャンセル イベントを取得できる  注意点  アプリケーションを呼び出した時点で呼び出し元はDeactivateさ れる  Chooserを呼び出した場合は状態復帰のコードが必要になる
  13. PhoneCallTask  電話をかける  PhoneNumberプロパティ  DisplayNameプロパティ  Showメソッドで電話をかける 

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

    Showメソッドでメールを送信する  実際にはメーラーが起動される  サンプルコード EmailComposeTask emailComposeTask = new EmailComposeTask(); //送信先アドレス emailComposeTask.To = "[email protected]"; //件名 emailComposeTask.Subject = "件名"; //本文 emailComposeTask.Body = "本文"; //メーラーを起動 emailComposeTask.Show();
  15. その他のLauncher クラス名 機能 BingmapTask Bingマップを起動 BingmapDicrectionsTask Bingマップを起動(経路検索) ConnectionSettingsTask 接続設定を起動 MarketplaceHubTask

    Marketplaceを起動(ハブ) MarketplaceDetailTask Marketplaceを起動(詳細) MarketplaceReviewTask Marketplaceを起動(レビュー) MarketplaceSearchTask Marketplaceを起動(検索) MediaPlayerLauncher MediaPlayerを起動 SearchTask Bing検索を起動 ShareLinkTask リンクの共有を起動 ShareStatusTask ステータスの共有を起動 SmsComposeTask SMSを起動 WebBrowserTask WEBブラウザを起動
  16. その他の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
  17. 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
  18. 処理シーケンス Windows Phone MPNS Service Application(Kinect) 1. MPNSに対してPushChannelの 登録 2.

    通知URIを返す 3. サービスに通知URIを登録 4. 通知URIに対して 通知メッセージを送信 5. 通知メッセージに応じた 通知を実行
  19. 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(); }
  20. 通知メッセージの送信方法  通知URIに対してHTTPでPOSTするだけ  メッセージの形式は通知方法によって異なる  詳細は後述  送信結果はレスポンスのヘッダから取得 

    X-NotificationStatus - 通知結果  X-SubscriptionStatus - チャネルの購読状態  X-DeviceConnectionStatus - デバイスの接続状態  詳細はMSDNで  http://msdn.microsoft.com/en-us/library/ff941100(v=vs.92).aspx
  21. 通知メッセージの送信方法 //通知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); }
  22. 設定可能な項目  Title  太字のタイトル。約40文字表示可能  Sub Title  細字のサブタイトル。約47文字表示可能

     Parameter  クリック時に遷移するページを指定  未指定の場合はMainPageが起動
  23. メッセージ形式  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>
  24. 設定可能な項目(表面)  Title  Tile左下に表示するタイトル。約15文字表示可能  BackGroundImage  背景画像。JPEGまたはPNGファイルを指定 

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

    画像の仕様はBackgroundImageと同様  BackContent  Tile上部に表示する文字列。約40文字表示可能
  26. メッセージ形式  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>
  27. 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
  28. Raw Notification  ユーザー定義のデータ(Raw Data)を通知  定義内容は自由  アプリケーション実行中のみ有効 

    HttpNotificationChannel.HttpNotificationReceived イベントで通知データを受信  HttpNotificationEventArgs.Notification.Body
  29. メッセージ形式  Header  Payload  ユーザーが独自に定義  XMLである必要もない 

    通知の受信側でメッセージの解析が必要 X-WindowsPhone-Target 指定丌要 X-NotificationClass 3 – ただちに通知 13 – 450秒以内に通知 23 – 900秒以内に通知
  30. Winodows Phone 7→ Kinectへの通信  Push NotificationではKinectからWindows Phone 7 への通信のみ

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