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
https://store.google.com/product/project_tango_tablet_development_kit
(*日本では買えません)
追記:わざわざセッションで言及してたので new かと勘違いしてしまいました。new じゃなかった。残念...
@muo_jp @yanzm 正確じゃなかった。元々2014年の6月に発表された端末で同12月に発送開始したもの(この時は$1,024だった)。2015年5月下旬に$512へ改訂され、8月に販売地域が増えた。ソフトウェア更新は頻繁に行われているけどハードは変わってない
— Kei Nakazawa (@muo_jp) 2016年5月23日
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 チームは速く効率的になるようにコードを最適化している。