Upload
-
View
106
Download
0
Embed Size (px)
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;
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の編集サービスもしくはツールの提供
–店舗内の棚割りとの連動
サービスを作るのは個々に任せ、土台と末端などで使えるものを提供していくことが普及につながる。お金の匂いがします。
そして近い将来…