ゼロからはじめるWindows Phone、Kinect連携
-
Upload
- -
Category
Technology
-
view
5.783 -
download
0
description
Transcript of ゼロからはじめるWindows Phone、Kinect連携
ゼロから始める
Windows Phone、Kinect連携
2011/09/17 第62回 CLR/H勉強会
素敵なおひげ
自己紹介
H/N:シバタ(素敵なおひげ)
Twitter: @stknohg
Blog : http://d.hatena.ne.jp/stknohg/
札幌で働くSIerです。
2010年よりCLR/Hスタッフとして活動しています。
Windows Phoneを現在進行形で勉強中。
WPArchにも一応登録してます
はじめに
ゼロから始めるって?
本セッションのタイトルは
「ゼロから始めるWindows Phone、Kinect連携」 ですが、これはスピーカーである私自身が予備
知識ゼロから始めて今日ここで発表しています。
なので、難しいことはやりません。
Windows Phone、Kinect開発の敷居の低さを知ってもらいつつ基本を学んでもらうのが今日の目的です。
Kinect2割、Windows Phone8割程度の内容です。
今日のお題
Kinectで電話をかけよう!
Kinect Call
わかります…よね?
Kinect Call
Kinectで画面のボタンに触れる
Windows Phoneに内容が伝わる!
デモ
いかがでしたか?
Kinect開発の基本
開発環境の構築
SDKのインストール
Microsoft Research
http://research.microsoft.com/en-
us/um/redmond/projects/kinectsdk/download.aspx
インストーラーの指示に従ってインストールするだけ
Kinectを接続
KinectはXBOXに付属しているものではなく単体で購入
XBOXに付属しているKinectはUSBポートが独自の形状をしている
Xbox カスタマーサポートに問い合わせればUSB電源ケーブルを追加購入可能
Kinectの電源を入れてからPCのUSBポートに接続
SDK付属のサンプルプログラムで動作確認
一部サンプルは
Microsoft Speech Platform - Server Runtimeが必要
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();
}
ビデオイメージの取得
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); }
スケルトントラッキング
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) { …中略… } }
}
ジョイント情報
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 」より引用
Coding4Fun Kinect Toolkit
Coding4Fun TeamによるToolkit
深度データ、SkeltonData計算の拡張メソッド
HoverButtonコントロール
WPF、Windows Form用
CodePlexで公開中
http://c4fkinect.codeplex.com/
Microsoft Public License (Ms-PL)
Windows Phone 7開発の基本
開発環境の構築
APP HUB
http://create.msdn.com/ja-JP
Windows Phone SDK 7.1 RC
インストーラの指示に従いインストールするだけ
Windows Phone開発の基本
Microsoft Visual Studio 2010 Express for Windows Phone
Windows Phone開発用のVisual Studio
Visual Studio Professional以上がすでにインストールされている場合は統合インストールとなる
SilverlightまたはXNAベースのアプリケーションを作成
デザイン
Microsoft Expression Blend 4
XAMLのデザインツール
VisualStudioとの連携
Blendでデザイン、VisualStudioでコーディング
デバッグ、デプロイ
Windows Phone Emulator(JA)
加速度計
GPSエミュレータ
スクリーンショット
Windows Phone Developer Registration
デバイスをアンロックし実機デバックを可能にする
開発者登録(後述)が必要
開発者登録
実機へのデプロイには開発者登録が必要
¥9800/年
個人はクレジットカード認証のみ
以前はGeoTrustによる本人認証が必要だった
法人の場合は現在もGeoTrustによる認証が必要
APP HUBに詳しい手順あり http://create.msdn.com/ja-jp/home/about/registration_walkthrough
LauncherとChooser
OSの標準機能(ビルトインアプリケーション) を呼び出す機能
Microsoft.Phone.Tasks 名前空間
LauncherとChooserの違い
Launcher
プリケーションを呼び出して終了
Chooser
アプリケーションを呼び出してアプリケーションの終了/キャンセルイベントを取得できる
注意点
アプリケーションを呼び出した時点で呼び出し元はDeactivateされる
Chooserを呼び出した場合は状態復帰のコードが必要になる
PhoneCallTask
電話をかける
PhoneNumberプロパティ
DisplayNameプロパティ
Showメソッドで電話をかける
必ず確認ダイアログが出現する
サンプルコード
PhoneCallTask phoneCallTask = new PhoneCallTask(); //電話番号をセット phoneCallTask.PhoneNumber = "1234567890123"; //表示名をセット phoneCallTask.DisplayName = "素敵なおひげ"; //電話をかける phoneCallTask.Show();
EmailComposeTask
Emailを送信する
Toプロパティ
Subjectプロパティ
Bodyプロパティ
Showメソッドでメールを送信する
実際にはメーラーが起動される
サンプルコード EmailComposeTask emailComposeTask = new EmailComposeTask(); //送信先アドレス emailComposeTask.To = "[email protected]"; //件名 emailComposeTask.Subject = "件名"; //本文 emailComposeTask.Body = "本文"; //メーラーを起動 emailComposeTask.Show();
その他のLauncher
クラス名 機能
BingmapTask Bingマップを起動
BingmapDicrectionsTask Bingマップを起動(経路検索)
ConnectionSettingsTask 接続設定を起動
MarketplaceHubTask Marketplaceを起動(ハブ)
MarketplaceDetailTask Marketplaceを起動(詳細)
MarketplaceReviewTask Marketplaceを起動(レビュー)
MarketplaceSearchTask Marketplaceを起動(検索)
MediaPlayerLauncher MediaPlayerを起動
SearchTask Bing検索を起動
ShareLinkTask リンクの共有を起動
ShareStatusTask ステータスの共有を起動
SmsComposeTask SMSを起動
WebBrowserTask WEBブラウザを起動
その他の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
Push Notification概要
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
処理シーケンス
Windows Phone MPNS
Service Application(Kinect)
1. MPNSに対してPushChannelの
登録
2. 通知URIを返す
3. サービスに通知URIを登録 4. 通知URIに対して
通知メッセージを送信
5. 通知メッセージに応じた
通知を実行
PushChannelについて
Push Notificationを使用するアプリはMPNSに対してチャネルを登録する必要がある
チャネルは1アプリケーション1つのみ登録可能でデバイス内で重複しない名前を付ける必要がある
1つのチャネルで3種類全ての通知が利用可能
1デバイスに対して30チャネルまで登録可能
30チャネルを超えた場合は例外発生
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();
}
通知URIについて
PushChannelを登録したアプリケーションに対して専用のURIが発行される
このURIをプッシュ通知を行うサービスに登録する
通常はクラウドサービスなどを想定
このURIは丌定期に更新される
ChannelUriUpdatedイベント
更新頻度に関するドキュメントは無い?
通知メッセージの送信方法
通知URIに対してHTTPでPOSTするだけ
メッセージの形式は通知方法によって異なる
詳細は後述
送信結果はレスポンスのヘッダから取得
X-NotificationStatus - 通知結果
X-SubscriptionStatus - チャネルの購読状態
X-DeviceConnectionStatus - デバイスの接続状態
詳細はMSDNで http://msdn.microsoft.com/en-us/library/ff941100(v=vs.92).aspx
通知メッセージの送信方法 //通知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); }
Toast Notification
画面上部にメッセージ(Toast)を表示する通知
アプリケーションが終了している時に有効
HttpNotificationChannel.BindToShellToast()
クリックするとアプリケーションを起動
遷移先のページ指定も可能
設定可能な項目
Title
太字のタイトル。約40文字表示可能
Sub Title
細字のサブタイトル。約47文字表示可能
Parameter
クリック時に遷移するページを指定
未指定の場合はMainPageが起動
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
メッセージ形式
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>
Tile Notification
ホーム画面のTileを変更する通知
アプリケーション実行中、終了時に有効
HttpNotificationChannel.BindToShellTile()
クリックするとアプリケーションを起動
遷移先のページは指定できない
設定可能な項目(表面)
Title
Tile左下に表示するタイトル。約15文字表示可能
BackGroundImage
背景画像。JPEGまたはPNGファイルを指定
画像サイズは173*173ピクセル固定
ファイルはXAP内のリソースかWEB上のイメージを使用可能 (HTTPのみHTTPSは未サポート)
WEB上のイメージを使用する場合、サイズは80KB以下にする 必要があり、30秒でタイムアウトする。
Count
Tile右上に表示する数値。いわゆるBadge
1~99まで設定可能
設定可能な項目(裏面)
BackTitle
Tile左下のタイトル約15文字表示可能
BackBackGroundImage
背景画像
画像の仕様はBackgroundImageと同様
BackContent
Tile上部に表示する文字列。約40文字表示可能
Tile Notificationで出来ないこと
表裏の切り替えタイミングの設定
アニメーションする画像
People、Gamesの様なTileは作れない
メッセージ形式
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>
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
Raw Notification
ユーザー定義のデータ(Raw Data)を通知
定義内容は自由
アプリケーション実行中のみ有効
HttpNotificationChannel.HttpNotificationReceived
イベントで通知データを受信
HttpNotificationEventArgs.Notification.Body
メッセージ形式
Header
Payload
ユーザーが独自に定義
XMLである必要もない
通知の受信側でメッセージの解析が必要
X-WindowsPhone-Target 指定丌要
X-NotificationClass 3 – ただちに通知
13 – 450秒以内に通知
23 – 900秒以内に通知
補足
Winodows Phone 7→ Kinectへの通信
Push NotificationではKinectからWindows Phone 7
への通信のみ
リアルタイムな処理には当然向かない
Windows Phone OS 7.1からSocket通信がサポートされる様になったので、Windows Phone 7からKinectへの通信が実装可能
よりリアルタイムな処理もできると思われる
誰か試してください…
ご静聴ありがとうございました