2016年5月23日月曜日

Project Tango - Google I/O 2016

What's New with Project Tango

デモとビデオがたくさんあり、Tango の Keynote っぽいセッション。恐竜のアプリ楽しそう。
  • Standard Android development and publishing
  • C/C++, Java, Unity, Unreal
  • Detect if Tango features are available on device
Googel Store で $512.00 で新しい Project Tango タブレット開発キットが買えるようになった
https://store.google.com/product/project_tango_tablet_development_kit
(*日本では買えません)

追記:わざわざセッションで言及してたので new かと勘違いしてしまいました。new じゃなかった。残念...

Consumer 向けの Tango Phone を Lenovo と開発中。2016年の後半に出る予定。詳しくは 2016年6月9日の Lenovo Tech World で発表される。
http://www.lenovo.com/registerfortechworld/
http://www.lenovo.com/projecttango/


Introducing Project Tango Area Learning



Project Tango の主な3技術として Motion Tracking と Depth Perception と Area Learning がある。 Motion Tracking によってデバイスが最初のいちからどれだけ動いたかがわかる。 Tango 用の Tablet と Phone には特別な3Dカメラがついており、Tango はこのカメラを使って実世界の 3D geometry を検出できる。

Area Learning は Tango デバイスに記憶を与える。 Tango には広域カメラが付いていて、実世界の特徴のあるものをランドマークとして覚える。ランドマークの位置がカメラ内で移動したらデバイスが移動したとして Motion Tracking している。 目を閉じて見た目の全然異なる所に移動すると前にいた場所がわからなくなるのと同じように、これまで Tango には記憶がなかったので Motion Tracking を開始するたびに同じ状況になっていた。 Area Learning ではランドマークがどこに見えたかと、ランドマークの見た目についての mathmatical description の2つを記憶する。

AR でバーチャル椅子をダイニングに配置するとする。Motion Tracking だけだと、椅子の位置が徐々にずれてきてしまう。Area Learning を使うとこの drift がなくなる。椅子の位置を記憶するので Motion Tracking の drift を補正して正しい場所に表示できる。

複数人VRゲームでは、ゲームしている場所を記憶してその記憶をすべてのデバイスで共有することで、それぞれの位置が正しく補正されゲーム体験を改善できる。

Tango は
- 片付いているときと散らかっているときの部屋
- 異なる時間帯(朝・夜)の部屋
- 異なるライティング
- 観客がいるときといないときのスタジアム
- ランドマークの少ない部屋(全部白くてものが何もない部屋とか)
- 異なる季節(木に葉がある/ないなど)
などで同じ場所だと認識するのが難しい。

解決するキーは時間。 実世界には時間をかけてゆっくり変わるものと、短い時間で変わるものがある。地下鉄の駅では人や広告が入れ替わるので、記憶したものは短い間だけ正しくなる。 そこで、短い期間の記憶に頼るようにアプリをつくるのが良い戦略になる。

AR drift correction // Configure drift-free motion tracking mConfig = new TangoConfig(); mConfig = mTango.getConfig(TangoConfig.CONFIG_TYPE_CURRENT); mConfig.putBoolean(TangoConfig.KEY_BOOLEAN_ENABLE_DRIFT_CORRECTION, true); // ← // Query drift-free motion tracking TangoCoordinateFramePair frame_pair; frame_pair.base = TANGO_COORDINATE_FRAME_AREA_DESCRIPTION; // ← frame_pair.target = TANGO_COORDINATE_FRAME_DEVICE; TangoService_getPoseAtTime(timestamp, frame_pair, &area_description_T_device); Multiplayer game

Create Memory → Share Memory → Multi Player

Create Memory // Learning an area description mConfig = new TangoConfig(); mConfig = mTango.getConfig(TangoConfig.CONFIG_TYPE_CURRENT); mConfig.putBoolean(TangoConfig.KEY_BOOLEAN_LEARNINGMODE, true); // ← // Saving an area description mMemory = new String(); mMemory = mTango.saveAreaDescription(); // ← Share Memory between devices // Export an area description Intent mExportIntent = new Intent(); mExportIntent.setClassName("com.projecttango.tango" "com.google.atap.tango.RequestImportExportActivity"); mExportIntent.putExtra(EXTRA_KEY_SOURCEUUID, mMemory); mExportIntent.putExtra(EXTRA_KEY_DESTINATIONFILE, "/sdcard/area_description"); mActivity.startActivityForResult(mExportIntent, Tango.TANGO_INTENT_ACTIVITYCODE); Multi Player // Loading an area description mConfig = new TangoConfig(); mConfig = mTango.getConfig(TangoConfig.CONFIG_TYPE_CURRENT); mConfig.putBoolean(TangoConfig.KEY_STRING_AREADESCRIPTION, mMemory); // ← // Query device pose in are description TangoCoordinateFramePair frame_pair; frame_pair.base = TANGO_COORDINATE_FRAME_AREA_DESCRIPTION; // ← frame_pair.target = TANGO_COORDINATE_FRAME_DEVICE; TangoService_getPoseAtTime(timestamp, frame_pair, &area_description_T_device);


6 Degrees of Freedom Gaming in Android with Project Tango

Tango の3つの technology (Motion Tracking と Depth Perception と Area Learning)を一通り解説。

ARで何ができるか何ができないのかを見せるために猫のアプリを作ることにしたそうだ。virtual cat を実世界に。
このページをチェックすると楽しいらしい。
https://en.wikipedia.org/wiki/Cats_and_the_Internet

フレーム変換 TangoErrorType TangoService_getPoseAtTime( double timestamp, TangoCoordinateFramePair frame, TangoPoseData* pose); TangoCoordinateFramePair frame_pair; frame_pair.base = TANGO_COORDINATE_FRAME_START_OF_SERVICE; frame_pair.target = TANGO_COORDINATE_FRAME_DEVICE; TangoPoseData start_device_T_device; TangoService_getPoseAtTime(timestamp, frame_pair, &start_service_T_device); 猫を実世界の geometry に合わせないと、猫が宙に浮いたりしてしまう。 Tango ならこれを解決できる。 TangoPoseData pose_color_camera_t0_T_depth_camera_t1; TangoSupport_calculateRelativePose( last_color_time_, TANGO_COORDINATE_FRAME_CAMERA_COLOR, last_cloud_->timestamp, TANGO_COORDINATE_FRAME_CAMERA_DEPTH, &pose_color_camera_t0_T_depth_camera_t1); TangoSupport_fitPlaneModelNearClick( last_cloud_, &color_camera_intrinsics_, &pose_color_camera_t0_T_depth_camera_t1, glm::value_ptr(uv), glm::value_ptr(double_depth_position); glm::value_ptr(double_depth_plane_equation)); 猫アプリのデモ必見。

猫が家具の後ろにいったときに透けて見えてしまうのは現実っぽくない。 Tango は実世界の 3D データを作ることができる。ここからメッシュを作ると、実世界の家具の向こうにいった virtual の猫を非表示にしたり半透明にできる。 これのための処理はSDKで抽象化されていて、利用できる messing library もある。

あれこれやってデバイスのパワーを使いすぎると、デバイスがすごく熱くなったりする。Tango チームは速く効率的になるようにコードを最適化している。


Project Tango Developer Panel

3rd party の Tango アプリ開発者による Panel Session


0 件のコメント:

コメントを投稿

'},ClipboardSwf:null,Version:'1.5.1'}};dp.SyntaxHighlighter=dp.sh;dp.sh.Toolbar.Commands={ExpandSource:{label:'+ expand source',check:function(highlighter){return highlighter.collapse;},func:function(sender,highlighter) {sender.parentNode.removeChild(sender);highlighter.div.className=highlighter.div.className.replace('collapsed','');}},ViewSource:{label:'view plain',func:function(sender,highlighter) {var code=dp.sh.Utils.FixForBlogger(highlighter.originalCode).replace(/'+code+'');wnd.document.close();}},CopyToClipboard:{label:'copy to clipboard',check:function(){return window.clipboardData!=null||dp.sh.ClipboardSwf!=null;},func:function(sender,highlighter) {var code=dp.sh.Utils.FixForBlogger(highlighter.originalCode).replace(/</g,'<').replace(/>/g,'>').replace(/&/g,'&');if(window.clipboardData) {window.clipboardData.setData('text',code);} else if(dp.sh.ClipboardSwf!=null) {var flashcopier=highlighter.flashCopier;if(flashcopier==null) {flashcopier=document.createElement('div');highlighter.flashCopier=flashcopier;highlighter.div.appendChild(flashcopier);} flashcopier.innerHTML='';} alert('The code is in your clipboard now');}},PrintSource:{label:'print',func:function(sender,highlighter) {var iframe=document.createElement('IFRAME');var doc=null;iframe.style.cssText='position:absolute;width:0px;height:0px;left:-500px;top:-500px;';document.body.appendChild(iframe);doc=iframe.contentWindow.document;dp.sh.Utils.CopyStyles(doc,window.document);doc.write('

'+highlighter.div.innerHTML+'

');doc.close();iframe.contentWindow.focus();iframe.contentWindow.print();alert('Printing...');document.body.removeChild(iframe);}},About:{label:'?',func:function(highlighter) {var wnd=window.open('','_blank','dialog,width=300,height=150,scrollbars=0');var doc=wnd.document;dp.sh.Utils.CopyStyles(doc,window.document);doc.write(dp.sh.Strings.AboutDialog.replace('{V}',dp.sh.Version));doc.close();wnd.focus();}}};dp.sh.Toolbar.Create=function(highlighter) {var div=document.createElement('DIV');div.className='tools';for(var name in dp.sh.Toolbar.Commands) {var cmd=dp.sh.Toolbar.Commands[name];if(cmd.check!=null&&!cmd.check(highlighter)) continue;div.innerHTML+=''+cmd.label+'';} return div;} dp.sh.Toolbar.Command=function(name,sender) {var n=sender;while(n!=null&&n.className.indexOf('dp-highlighter')==-1) n=n.parentNode;if(n!=null) dp.sh.Toolbar.Commands[name].func(sender,n.highlighter);} dp.sh.Utils.CopyStyles=function(destDoc,sourceDoc) {var links=sourceDoc.getElementsByTagName('link');for(var i=0;i');} dp.sh.Utils.FixForBlogger=function(str) {return(dp.sh.isBloggerMode==true)?str.replace(/
|<br\s*\/?>/gi,''):str;} dp.sh.RegexLib={MultiLineCComments:new RegExp('/\\*[\\s\\S]*?\\*/','gm'),SingleLineCComments:new RegExp('//.*$','gm'),SingleLinePerlComments:new RegExp('#.*$','gm'),DoubleQuotedString:new RegExp('"(?:\\.|(\\\\\\")|[^\\""\\n])*"','g'),SingleQuotedString:new RegExp("'(?:\\.|(\\\\\\')|[^\\''\\n])*'",'g')};dp.sh.Match=function(value,index,css) {this.value=value;this.index=index;this.length=value.length;this.css=css;} dp.sh.Highlighter=function() {this.noGutter=false;this.addControls=true;this.collapse=false;this.tabsToSpaces=true;this.wrapColumn=80;this.showColumns=true;} dp.sh.Highlighter.SortCallback=function(m1,m2) {if(m1.indexm2.index) return 1;else {if(m1.lengthm2.length) return 1;} return 0;} dp.sh.Highlighter.prototype.CreateElement=function(name) {var result=document.createElement(name);result.highlighter=this;return result;} dp.sh.Highlighter.prototype.GetMatches=function(regex,css) {var index=0;var match=null;while((match=regex.exec(this.code))!=null) this.matches[this.matches.length]=new dp.sh.Match(match[0],match.index,css);} dp.sh.Highlighter.prototype.AddBit=function(str,css) {if(str==null||str.length==0) return;var span=this.CreateElement('SPAN');str=str.replace(/ /g,' ');str=str.replace(/');if(css!=null) {if((/br/gi).test(str)) {var lines=str.split(' 
');for(var i=0;ic.index)&&(match.index/gi,'\n');var lines=html.split('\n');if(this.addControls==true) this.bar.appendChild(dp.sh.Toolbar.Create(this));if(this.showColumns) {var div=this.CreateElement('div');var columns=this.CreateElement('div');var showEvery=10;var i=1;while(i<=150) {if(i%showEvery==0) {div.innerHTML+=i;i+=(i+'').length;} else {div.innerHTML+='·';i++;}} columns.className='columns';columns.appendChild(div);this.bar.appendChild(columns);} for(var i=0,lineIndex=this.firstLine;i0;i++) {if(Trim(lines[i]).length==0) continue;var matches=regex.exec(lines[i]);if(matches!=null&&matches.length>0) min=Math.min(matches[0].length,min);} if(min>0) for(var i=0;i

Blogger Syntax Highliter

Version: {V}

http://www.dreamprojections.com/syntaxhighlighter

©2004-2007 Alex Gorbatchev.

'},ClipboardSwf:null,Version:'1.5.1'}};dp.SyntaxHighlighter=dp.sh;dp.sh.Toolbar.Commands={ExpandSource:{label:'+ expand source',check:function(highlighter){return highlighter.collapse;},func:function(sender,highlighter) {sender.parentNode.removeChild(sender);highlighter.div.className=highlighter.div.className.replace('collapsed','');}},ViewSource:{label:'view plain',func:function(sender,highlighter) {var code=dp.sh.Utils.FixForBlogger(highlighter.originalCode).replace(/'+code+'');wnd.document.close();}},CopyToClipboard:{label:'copy to clipboard',check:function(){return window.clipboardData!=null||dp.sh.ClipboardSwf!=null;},func:function(sender,highlighter) {var code=dp.sh.Utils.FixForBlogger(highlighter.originalCode).replace(/</g,'<').replace(/>/g,'>').replace(/&/g,'&');if(window.clipboardData) {window.clipboardData.setData('text',code);} else if(dp.sh.ClipboardSwf!=null) {var flashcopier=highlighter.flashCopier;if(flashcopier==null) {flashcopier=document.createElement('div');highlighter.flashCopier=flashcopier;highlighter.div.appendChild(flashcopier);} flashcopier.innerHTML='';} alert('The code is in your clipboard now');}},PrintSource:{label:'print',func:function(sender,highlighter) {var iframe=document.createElement('IFRAME');var doc=null;iframe.style.cssText='position:absolute;width:0px;height:0px;left:-500px;top:-500px;';document.body.appendChild(iframe);doc=iframe.contentWindow.document;dp.sh.Utils.CopyStyles(doc,window.document);doc.write('

'+highlighter.div.innerHTML+'

');doc.close();iframe.contentWindow.focus();iframe.contentWindow.print();alert('Printing...');document.body.removeChild(iframe);}},About:{label:'?',func:function(highlighter) {var wnd=window.open('','_blank','dialog,width=300,height=150,scrollbars=0');var doc=wnd.document;dp.sh.Utils.CopyStyles(doc,window.document);doc.write(dp.sh.Strings.AboutDialog.replace('{V}',dp.sh.Version));doc.close();wnd.focus();}}};dp.sh.Toolbar.Create=function(highlighter) {var div=document.createElement('DIV');div.className='tools';for(var name in dp.sh.Toolbar.Commands) {var cmd=dp.sh.Toolbar.Commands[name];if(cmd.check!=null&&!cmd.check(highlighter)) continue;div.innerHTML+=''+cmd.label+'';} return div;} dp.sh.Toolbar.Command=function(name,sender) {var n=sender;while(n!=null&&n.className.indexOf('dp-highlighter')==-1) n=n.parentNode;if(n!=null) dp.sh.Toolbar.Commands[name].func(sender,n.highlighter);} dp.sh.Utils.CopyStyles=function(destDoc,sourceDoc) {var links=sourceDoc.getElementsByTagName('link');for(var i=0;i');} dp.sh.Utils.FixForBlogger=function(str) {return(dp.sh.isBloggerMode==true)?str.replace(/
|<br\s*\/?>/gi,'\n'):str;} dp.sh.RegexLib={MultiLineCComments:new RegExp('/\\*[\\s\\S]*?\\*/','gm'),SingleLineCComments:new RegExp('//.*$','gm'),SingleLinePerlComments:new RegExp('#.*$','gm'),DoubleQuotedString:new RegExp('"(?:\\.|(\\\\\\")|[^\\""\\n])*"','g'),SingleQuotedString:new RegExp("'(?:\\.|(\\\\\\')|[^\\''\\n])*'",'g')};dp.sh.Match=function(value,index,css) {this.value=value;this.index=index;this.length=value.length;this.css=css;} dp.sh.Highlighter=function() {this.noGutter=false;this.addControls=true;this.collapse=false;this.tabsToSpaces=true;this.wrapColumn=80;this.showColumns=true;} dp.sh.Highlighter.SortCallback=function(m1,m2) {if(m1.indexm2.index) return 1;else {if(m1.lengthm2.length) return 1;} return 0;} dp.sh.Highlighter.prototype.CreateElement=function(name) {var result=document.createElement(name);result.highlighter=this;return result;} dp.sh.Highlighter.prototype.GetMatches=function(regex,css) {var index=0;var match=null;while((match=regex.exec(this.code))!=null) this.matches[this.matches.length]=new dp.sh.Match(match[0],match.index,css);} dp.sh.Highlighter.prototype.AddBit=function(str,css) {if(str==null||str.length==0) return;var span=this.CreateElement('SPAN');str=str.replace(/ /g,' ');str=str.replace(/');if(css!=null) {if((/br/gi).test(str)) {var lines=str.split(' 
');for(var i=0;ic.index)&&(match.index/gi,'\n');var lines=html.split('\n');if(this.addControls==true) this.bar.appendChild(dp.sh.Toolbar.Create(this));if(this.showColumns) {var div=this.CreateElement('div');var columns=this.CreateElement('div');var showEvery=10;var i=1;while(i<=150) {if(i%showEvery==0) {div.innerHTML+=i;i+=(i+'').length;} else {div.innerHTML+='·';i++;}} columns.className='columns';columns.appendChild(div);this.bar.appendChild(columns);} for(var i=0,lineIndex=this.firstLine;i0;i++) {if(Trim(lines[i]).length==0) continue;var matches=regex.exec(lines[i]);if(matches!=null&&matches.length>0) min=Math.min(matches[0].length,min);} if(min>0) for(var i=0;i

ページビューの合計