Google Tangoで現実世界を感じてみよう

66
Google Tango現実世界を感じてみよう」 Panasonic System Design 大久保

Transcript of Google Tangoで現実世界を感じてみよう

Page 1: Google Tangoで現実世界を感じてみよう

「Google Tangoで現実世界を感じてみよう」

Panasonic System Design

大久保 聡

Page 2: Google Tangoで現実世界を感じてみよう

自己紹介

パナソニックシステムデザイン

大久保 聡

twitter ovjang(@followapp)

技術は浅く広く、剣も魔法も使えるけどどれも中途半端

Page 3: Google Tangoで現実世界を感じてみよう

本日の内容

• SLAMとは

• Visual SLAMとは

• マーカーレスAR

• Google Tangoとは

•Motion Tracking

•Area Learning

•Depth perception

•Visual Positioning Service

Page 4: Google Tangoで現実世界を感じてみよう

SLAMとは

Simultaneous Localization And Mapping

• もともとはロボット分野Localization : 位置・姿勢推定Mapping : マップの推定

車の自動運転、ドローン、ロボット掃除機などで利用される。3Dスキャナとして利用されはじめる。

サ イ モ テ ー ニ ア ス

Page 5: Google Tangoで現実世界を感じてみよう

Ruloにも搭載

Page 6: Google Tangoで現実世界を感じてみよう

価格.com

Page 7: Google Tangoで現実世界を感じてみよう

Page 8: Google Tangoで現実世界を感じてみよう

SLAMの目

• レーザーレンジスキャナー(測域センサ)

• RGBカメラ

• Depth(深度)カメラ

• Stereo(2眼)カメラ

レーザーレンジスキャナーはとても高価なのでカメラ映像をもとに推定を行う、Visual SLAMがスマホなどで使われるようになってきた。

Page 9: Google Tangoで現実世界を感じてみよう

Visual SLAMとは

• カメラの画像をもとに現実世界の特徴を利用して空間認識と、位置推定を行う。

• RGBの単眼カメラ、ステレオカメラ、深度カメラなどで実現するため安価。

Page 10: Google Tangoで現実世界を感じてみよう

Visual SLAMとは

• フレーム間での特徴点を対応づけ、特徴を追跡し、環境Mapを作成

参考 https://goo.gl/uFqQtk

Page 11: Google Tangoで現実世界を感じてみよう

Visual SLAMのデモ

• Outdoor stereo SLAM with RTAB-Map

ミュンヘン工科大学コンピュータビジョングループ

• Real-Time Trajectory Replanning for MAVs using Uniform B-splines and 3D Circular Buffer

• Autonomous Camera-Based Navigation of a Low-Cost Quadrocopter

Page 12: Google Tangoで現実世界を感じてみよう

Visual SLAMの弱点

• 特徴の変わるものは苦手– 動くもの

– 反射する、透明なもの

• 特徴のないものは苦手– 無地の壁

• 同じ特徴の時は同じものとみなす– 病室みたいなものや、ビルの階数の違いなど

Page 13: Google Tangoで現実世界を感じてみよう

SLAMの用語

• Localization

位置同定、Areaの中のどこにいるかを推定すること

Page 14: Google Tangoで現実世界を感じてみよう

SLAMの用語

• Drift correctionループクロージャー(Loop closure)とも呼ばれるドリフト補正を実行できます。デバイスは既に通過した場所に戻ってきたとき、ループの中を移動してきたことを理解し、その経路を補正する。

Page 15: Google Tangoで現実世界を感じてみよう

マーカーレスARが流行る

• Google Tango

• Google ARCore

• Apple ARKit(iOS11)

• Kudan AR

• Grapecity Wikitude

Page 16: Google Tangoで現実世界を感じてみよう

コンピュータビジョン技術

使われている技術の種類SLAM リアルタイムに周囲環境のマッ

ングと自己位置推定を行う。Google TangoWindows Mixed Reality(Hololens)

Visual Odometry(VO)

リアルタイムの自己位置推定ので、グローバルマップを作らな

Apple ARKitGoogle ARCore

Page 17: Google Tangoで現実世界を感じてみよう

Motion Tracking

自分自身の移動と回転を3D空間で追跡できる。前後左右に歩き回ったり、上下の移動や回転などをした際にどの位置にどの向きであるのかを知ることができる。

3軸電子コンパス、3軸加速度センサー、3軸ジャイロスコープと魚眼レンズカメラからの視覚特徴点の情報を利用する。

Page 18: Google Tangoで現実世界を感じてみよう

Depth Perception

周辺の物理構造(形状)を認識することができる。机、いす、パソコンなど3Dとして認識できる。

赤外線ベースのTOF(Time Of Flight、光線

の照射と反射による測距技術)を用いる。計測可能な範囲は4-5m程度。

Page 19: Google Tangoで現実世界を感じてみよう

Area Learning

まわりを見渡して、自分がどこにいるのかを知ることができる。学習したエリアを保存(深度情報と特徴点をマッチングした情報)し読みだすことができる。

学習エリアよりローカライゼーションと呼ばれるプロセスを使用して自己位置を特定することができます。

Page 20: Google Tangoで現実世界を感じてみよう

Visual Positioning Service

Motion Tracking、Area Learningなど組み合

わせ、地図上のどこに自分がいるかを把握できる。

Page 21: Google Tangoで現実世界を感じてみよう

とは

Tango ARCore

• Motion Tracking ○ ○

• Area Learning ○

• Depth perception ○ ○

• Visual Positioning Service ○

• Light estimation ○

Page 22: Google Tangoで現実世界を感じてみよう

Tangoデバイス

• 専用デバイスが2種発売されている。

Depthカメラ、RGBカメラ、魚眼レンズカメラを搭載

Page 23: Google Tangoで現実世界を感じてみよう

ARCoreデバイス

• 現状は、PixelとGalaxy S8のみ、対応機種は拡大中で、Googleはプレビューリリース中に1億台の普及を目指す。

Page 24: Google Tangoで現実世界を感じてみよう

ローリングシャッターはSLAMに向かない

• ローリングシャッター(ライン露光順次読み出し:CMOS素子)

• グローバルシャッター(同時露光一括読み出し:CCD素子)

Page 25: Google Tangoで現実世界を感じてみよう

UNITYでの開発

Page 26: Google Tangoで現実世界を感じてみよう

Tango SDK

• Application development stack

Page 27: Google Tangoで現実世界を感じてみよう

Unity開発の前準備

• Android SDK with package level 17+ installed.

• Unity (5.2.1 or later), set up for Android development.

• Tango Unity SDK.

• On Windows, install the Google USB Driver if your device is not recognized automatically.

Page 28: Google Tangoで現実世界を感じてみよう

Unity開発の前準備

• Edit > Preference のExternal ToolsでAndroid SDKとJDKの設定。

Page 29: Google Tangoで現実世界を感じてみよう

Unity開発の前準備

• File > Build Settings > Android > Player SettingsのMinimum API Levelを17以上にする。

• Unity用のTango SDKをimport

Page 30: Google Tangoで現実世界を感じてみよう

MOTION TRACKING

Page 31: Google Tangoで現実世界を感じてみよう

Motion Trackingの実装

• Texture(Cubemap)作成

• Skyboxマテリアル作成

• LightingのシーンタブでSkybox Materialにマテリアル割り当て

• Main Camera削除

Page 32: Google Tangoで現実世界を感じてみよう

Motion Trackingの実装

• ProjectウィンドウのAssets > TangoPrefabsからTango ManagerとTango Cameraをシーンにドロップ

• Tango Cameraを選択し、InspectorのClear FlagをSky Boxに変更する。

• Buildして完成

Page 33: Google Tangoで現実世界を感じてみよう

Motion Trackingの実装

Page 34: Google Tangoで現実世界を感じてみよう

Motion TrackingのDemo

Page 35: Google Tangoで現実世界を感じてみよう

DEPTH PERCEPTION

Page 36: Google Tangoで現実世界を感じてみよう

Depth Perceptionの実装

• ProjectウィンドウのAssets > TangoPrefabsからTango ManagerとTango Camera、Tango Point Cloudをシーンにドロップ

• Tango Managerを選択、InspectorでEnable Depthにチェックを入れる。

Page 37: Google Tangoで現実世界を感じてみよう

Depth Perceptionの実装

• Tango Point Cloudを選択し、InspectorのMesh RendererとUpdate Points Meshにチェックを入れる。

• Tango Cameraを選択し、InspectorのClear FlagをSolid Colorに変更する。

• Buildして完成

Page 38: Google Tangoで現実世界を感じてみよう

Depth Perceptionの実装

Page 39: Google Tangoで現実世界を感じてみよう

Depth Perceptionデモ

• Depth情報にRGBカメラの情報を重ね合わせて、3D空間を取り込む。

https://youtu.be/FOKiaFL-WXI

Page 40: Google Tangoで現実世界を感じてみよう

AREA LEARNING

Page 41: Google Tangoで現実世界を感じてみよう

Area Learningの用語

• Area Description学習した空間情報、ADF(Area Description File)というファイルに保存できる。

• Frames of ReferenceArea(3D空間)のどの位置にどの向きにデバイスがあるかを知ることができる。その空間(枠組み)のこと

• PoseFrames of Referenceの中での位置と向きのこと

Page 42: Google Tangoで現実世界を感じてみよう

Area Learningの実装

• 地図の作成機能– 初期化

– エリアラーニング開始

– ADF保存

• 作成した地図上にマーカー設置と保存する機能– 初期化

– ADF読込

– エリアラーニング開始

– マーカー設置

Page 43: Google Tangoで現実世界を感じてみよう

Area Learningの実装

• 流れ

Start

StratupADFなし

Learning Mode = True

ADF保存

End

Start

StratupADFあり

Learning Mode = False

ADF読込

End

マーカー設置

ADF

Page 44: Google Tangoで現実世界を感じてみよう

Learning ModeとADFの利用Learning Mode

ADF利用

フレームに対する姿勢データを利用可能か

ADFを保存できるかサービス開始位置デバイス位置

ADデバイス位置

ADサービス開始位置

False False 開始時に利用可能 利用不可 利用不可 ADを保存できません

True False 開始時に利用可能 開始時に利用可能

開始時に利用可能

新しいUUIDで現在のADが保存される

False True 開始時に利用可能 ローカライズされた後に使用可能

ローカライズされた後に使用可能

ADを保存できません

True True 開始時に利用可能 ローカライズされた後に使用可能

ローカライズされた後に使用可能

ロードしたADFに対してローカライズされるまでは、

ADを保存できません。保存するときはロードした

ADFと同じUUIDを使用し、本質的には古いADに新しく学習した領域を追加し、拡張しています。

Page 45: Google Tangoで現実世界を感じてみよう

Tangoの座標系

• サービス開始位置またはADのいずれかをAPIの基準座標系として使用する

Tango : 右手系Unity : 左手系

Page 46: Google Tangoで現実世界を感じてみよう

初期化処理

• Registerで、Tango Serviceへ接続

※継承したインターフェースの実装(OnTango~)が呼ばれるようになる。

public class AreaLearning : MonoBehaviour, ITangoLifecycle, ITangoPose, ITangoEvent, ITangoDepth

Page 47: Google Tangoで現実世界を感じてみよう

初期化処理public void Start()

{m_poseController = FindObjectOfType<TangoPoseController>();m_tangoApplication = FindObjectOfType<TangoApplication>();

if (m_tangoApplication != null){

m_tangoApplication.Register(this);if (AndroidHelper.IsTangoCorePresent()){

m_tangoApplication.RequestPermissions();}

}else{

DebugPrint("No Tango Manager found in scene.");}

}

Page 48: Google Tangoで現実世界を感じてみよう

エリアラーニング開始

• Startupでエリアラーニング開始

Page 49: Google Tangoで現実世界を感じてみよう

エリアラーニング開始public void StartAreaLearning(bool isNewAreaDescription)

{m_isLearning = isNewAreaDescription;if (m_isLearning){

m_currentAreaDescription = null;m_tangoApplication.m_areaDescriptionLearningMode = true;

}else{

m_currentAreaDescription = FindAreaDescription();if (m_currentAreaDescription == null){

DebugPrint("not found AD.");return;

}m_tangoApplication.m_areaDescriptionLearningMode = false;

}m_poseController = m_tangoCamera.GetComponent<TangoPoseController>();m_poseController.gameObject.SetActive(true);m_tangoCamera.SetActive(true);

// Relocalization中のImage表示用m_relocalization.SetActive(true);

m_tangoApplication.Startup(m_currentAreaDescription);}

Page 50: Google Tangoで現実世界を感じてみよう

ADF保存

• CurrentのADFを保存する

Page 51: Google Tangoで現実世界を感じてみよう

ADF保存if (m_tangoApplication.m_areaDescriptionLearningMode){

m_saveThread = new Thread(delegate (){

// ADF削除AreaDescription oldAreaDescription = FindAreaDescription();

// ADF保存m_currentAreaDescription = AreaDescription.SaveCurrent();AreaDescription.Metadata metadata = m_currentAreaDescription.GetMetadata();if (m_currentAreaDescription != null){

metadata.m_name = FILE_NAME;m_currentAreaDescription.SaveMetadata(metadata);

DebugPrint("New ADF ID = " + m_currentAreaDescription.m_uuid, true);if (oldAreaDescription != null){

oldAreaDescription.Delete();}

} else{

DebugPrint("ADF not found", true);}

});m_saveThread.Start();

}

Page 52: Google Tangoで現実世界を感じてみよう

ADF保存

• ADFの中身は?

Page 53: Google Tangoで現実世界を感じてみよう

ADF読込

• ADFのリストを取得

※デバイス内の保存領域を使う場合

Page 54: Google Tangoで現実世界を感じてみよう

ADF読込private AreaDescription FindAreaDescription()

{//DebugPrint("PopulateList start", false);

AreaDescription[] list = AreaDescription.GetList();AreaDescription foundADF = null;

//DebugPrint("Length = " + list.Length, false);

if (list != null && list.Length > 0){

foreach (AreaDescription areaDescription in list){

AreaDescription.Metadata metadata = areaDescription.GetMetadata();if (metadata.m_name == FILE_NAME){

foundADF = areaDescription;//DebugPrint("found uuid = " + foundADF.m_uuid, false);break;

}}

}if (foundADF == null){

//DebugPrint("No area descriptions available.", false);}return foundADF;

}

Page 55: Google Tangoで現実世界を感じてみよう

エリアラーニング開始

• Startupでエリアラーニング開始

Page 56: Google Tangoで現実世界を感じてみよう

エリアラーニング開始public void StartAreaLearning(bool isNewAreaDescription){

m_isLearning = isNewAreaDescription;if (m_isLearning){

m_currentAreaDescription = null;m_tangoApplication.m_areaDescriptionLearningMode = true;

}else{

m_currentAreaDescription = FindAreaDescription();if (m_currentAreaDescription == null){

DebugPrint("not found AD.");return;

}m_tangoApplication.m_areaDescriptionLearningMode = false;

}m_poseController = m_tangoCamera.GetComponent<TangoPoseController>();m_poseController.gameObject.SetActive(true);m_tangoCamera.SetActive(true);

// Relocalization中のImage表示用m_relocalization.SetActive(true);

m_tangoApplication.Startup(m_currentAreaDescription);}

Page 57: Google Tangoで現実世界を感じてみよう

マーカー設置

• Depthカメラを有効にし、タップ位置のプレーンを取得する。

Page 58: Google Tangoで現実世界を感じてみよう

マーカー設置m_findPlaneWaitingForDepth = true;

// Depthカメラを有効にするm_tangoApplication.SetDepthCameraRate(TangoEnums.TangoDepthCameraRate.MAXIMUM);while (m_findPlaneWaitingForDepth){

yield return null;}m_tangoApplication.SetDepthCameraRate(TangoEnums.TangoDepthCameraRate.DISABLED);

// 平面を見つけるCamera cam = Camera.main;Vector3 planeCenter;Plane plane;if (!m_pointCloud.FindPlane(cam, touchPosition, out planeCenter, out plane)){

yield break;}

// 法線ベクトルVector3 up = plane.normal;

Page 59: Google Tangoで現実世界を感じてみよう

Area Learningデモ

• Area Learningした情報と実際の物の場所の情報を紐づける。

家電AR + NLP(文脈理解)

Page 60: Google Tangoで現実世界を感じてみよう

Android端末Tango設定

許可の管理と端末内のADのクリア

Page 61: Google Tangoで現実世界を感じてみよう

VISUAL POSITIONING SERVICE

Page 62: Google Tangoで現実世界を感じてみよう

Visual Positioning Service

• Indoor Retail Mapping Leader aisle411 Delivers In-Store 3D Mapping on Google's Project Tango

Page 63: Google Tangoで現実世界を感じてみよう

VPSでやれること

• 情報の提供– 固定の情報を配信

• 場所を知らせる

• 物の情報を知らせる

– いま、その場所にいる人に情報を配信• 広告

• リコメンド

• 利用者の場所をリアルタイム把握

Page 64: Google Tangoで現実世界を感じてみよう

VPSで必要となること

• 移動によるADFの切り替え(同じ構造の建物(階数)の違いなどを埋めることも)– 直前のGPS情報

– Wifi、Beacon、LinkRay

– ADFのマージ

• 環境変化によるADFの更新– ユーザー

– サービス事業者

Page 65: Google Tangoで現実世界を感じてみよう

VPSにお役立ち

• ADFの提供サービスを牛耳る

• ADFの編集サービスもしくはツールの提供

–店舗内の棚割りとの連動

サービスを作るのは個々に任せ、土台と末端などで使えるものを提供していくことが普及につながる。お金の匂いがします。

Page 66: Google Tangoで現実世界を感じてみよう

そして近い将来…