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

Preview:

Citation preview

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

Panasonic System Design

大久保 聡

自己紹介

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

大久保 聡

twitter ovjang(@followapp)

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

本日の内容

• SLAMとは

• Visual SLAMとは

• マーカーレスAR

• Google Tangoとは

•Motion Tracking

•Area Learning

•Depth perception

•Visual Positioning Service

SLAMとは

Simultaneous Localization And Mapping

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

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

サ イ モ テ ー ニ ア ス

Ruloにも搭載

価格.com

SLAMの目

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

• RGBカメラ

• Depth(深度)カメラ

• Stereo(2眼)カメラ

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

Visual SLAMとは

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

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

Visual SLAMとは

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

参考 https://goo.gl/uFqQtk

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

Visual SLAMの弱点

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

– 反射する、透明なもの

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

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

SLAMの用語

• Localization

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

SLAMの用語

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

マーカーレスARが流行る

• Google Tango

• Google ARCore

• Apple ARKit(iOS11)

• Kudan AR

• Grapecity Wikitude

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

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

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

Visual Odometry(VO)

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

Apple ARKitGoogle ARCore

Motion Tracking

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

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

Depth Perception

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

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

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

Area Learning

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

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

Visual Positioning Service

Motion Tracking、Area Learningなど組み合

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

とは

Tango ARCore

• Motion Tracking ○ ○

• Area Learning ○

• Depth perception ○ ○

• Visual Positioning Service ○

• Light estimation ○

Tangoデバイス

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

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

ARCoreデバイス

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

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

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

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

UNITYでの開発

Tango SDK

• Application development stack

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.

Unity開発の前準備

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

Unity開発の前準備

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

• Unity用のTango SDKをimport

MOTION TRACKING

Motion Trackingの実装

• Texture(Cubemap)作成

• Skyboxマテリアル作成

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

• Main Camera削除

Motion Trackingの実装

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

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

• Buildして完成

Motion Trackingの実装

Motion TrackingのDemo

DEPTH PERCEPTION

Depth Perceptionの実装

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

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

Depth Perceptionの実装

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

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

• Buildして完成

Depth Perceptionの実装

Depth Perceptionデモ

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

https://youtu.be/FOKiaFL-WXI

AREA LEARNING

Area Learningの用語

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

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

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

Area Learningの実装

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

– エリアラーニング開始

– ADF保存

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

– ADF読込

– エリアラーニング開始

– マーカー設置

Area Learningの実装

• 流れ

Start

StratupADFなし

Learning Mode = True

ADF保存

End

Start

StratupADFあり

Learning Mode = False

ADF読込

End

マーカー設置

ADF

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に新しく学習した領域を追加し、拡張しています。

Tangoの座標系

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

Tango : 右手系Unity : 左手系

初期化処理

• Registerで、Tango Serviceへ接続

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

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

初期化処理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.");}

}

エリアラーニング開始

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

エリアラーニング開始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);}

ADF保存

• CurrentのADFを保存する

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();

}

ADF保存

• ADFの中身は?

ADF読込

• ADFのリストを取得

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

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;

}

エリアラーニング開始

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

エリアラーニング開始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);}

マーカー設置

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

マーカー設置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;

Area Learningデモ

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

家電AR + NLP(文脈理解)

Android端末Tango設定

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

VISUAL POSITIONING SERVICE

Visual Positioning Service

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

VPSでやれること

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

• 場所を知らせる

• 物の情報を知らせる

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

• リコメンド

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

VPSで必要となること

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

– Wifi、Beacon、LinkRay

– ADFのマージ

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

– サービス事業者

VPSにお役立ち

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

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

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

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

そして近い将来…

Recommended