2018年3月10日土曜日

第五回 HoloLens参考書 読書会で発表しました。

お疲れ様です。ZuQ9->Nnです。
2018/03/09(金) 第五回 HoloLens 参考書 読書会 で発表を担当させてもらいました。

第5回 HoloLens参考書読書会@アカツキ (2018/03/09 18:30〜)

HoloLensアプリってどうやって作ればいいの? HoloLensアプリケーションってどうやって作ればいいんだろう。Microsoftが提供するチュートリアル「Academy」を一通りやってみたけど、次はど うすればいいんだろう。 そんなお悩みを持っている方たちに向けて参考書の読み会を開催します! 現在出版されている参考書は洋書だけなので少しハードルが高いですが、みんなで挑めば怖くない! 本イベントで取り扱う書籍の内容は以下の通りです。 ch.1 OverView & 環境構築 ch.2 はじめてのHoloアプリ(豆腐みたいなもん) ch.3 Holoの入力(Gaz...
HoloLensに関連する何かに携わっていないと、絶対に触らずにダメになっていく
そんな不安や焦りの気持ちからこちらの読書会にスタッフとして参加させてもらっていました。

こちらの「HoloLens Beginner's Guide

の書籍に添いながら各Chapterごとにスタッフが発表を受け持っています
そして、いよいよ、僕の担当の番となったわけです
内容は、Chapter6 のSpatial Mappingについて、発表資料はこちらです。

こちらの資料の中のコードApplicationManagerについはて、こちらです。

完成したアプリを実機で動かしたときは、こんな感じになります。

発表は、自分でも、早口になっているなと思いながらも ついつい焦りからか、
止められない感じになってしまいました。

今まで5分くらいのLTはやっていたのですが、
1時間以上の枠をもらったのは、
今回初めてで時間配分、どっからどこまでをダラダラせず、
わかりやすくまとめるか、とても課題が残りました。

発表後は、参加者にお声もかけていただき。
具体的な質問等もいただき、まだまだ、きっちりと
理解していない部分がほとんどだと痛感しました。

Spatial Mappingの一番のポイントは、HoloLensがセンサーをつかって
周りの空間の情報をスキャンし貯めている部分です。

質問者さんから言われて、僕も勘違いしていた部分があります。
SpatialMappingObserver.csにStartObserving があるので
てっきり、アプリを起動したときに
周囲をスキャンを開始するのかと思っていたのですが
アプリを起動しなくてもHoloLensそのものを起動したときに
既に自動的にセンサーを使って周りの空間をスキャンし
空間情報を貯めて更新していますね。
アプリ内では、あらかじめスキャンした空間の情報も利用しているようです。

途中でヘルプいただいた @dy_karous はじめ、スタッフの皆さんありがとうございました。
発表そのものは終わりましたが、読書会自体はつづきますので
最後まで、できる範囲内でお手伝いさせてもらいます。

2017年10月14日土曜日

xRLT vol.1に参加

お疲れ様です。ZuQ9->Nnです。
201710/13(金) xRLT vol.1 に参加しました。
場所は渋谷のTECH PLAYさん

xRLT vol.01|IT勉強会・セミナーなどのイベント情報検索サービス - TECH PLAY[テックプレイ]

本年1月に日本発売されたHoloLens、そしてまもなく一般発売を迎えるWindows Mixed Reality Immersiveデバイス! まだかまだかと待ち構えるみなさんの熱気が今回のLT大会の源となりました! もちろんMRだけでなく、VR/ARも集めてどーんとLT21連発! 10/2 Update: U22割(先着10名無料)やります! 10/3 Update: ...
今回もLT発表枠で申し込みました。内容はTokyo HoloLens meetup vol.5 の
LTで発表した椅子の検知の続きのような形
どうしても歩かせてから椅子に座らせてみたかったのでチャレンジしてみました。

結果的には、残念ながらうまくいきませんでした。orz..

発表そのものも、またしても5分で終わらず、強制終了。。orz..
もう、緊張のためか発表中は足がガタガタ震えてきたのがわかったんですが
全然とめられなかったですね。内容も頭の中が真っ白に
パーンっていっちゃいましたね。自分でも何言っているのかわからない感じ
とにかく、ふわふわ浮いたように感じてました。
はじめっててわけじゃないのに意識しすぎたんだろうか??

前回のリベンジならずで、ものすごく自分的に
反省点ばかりが目立つ結果になってしまいました。

発表したおかげか、色々な人から声をかけてもらいとてもうれしかったです。
今後も積極的に発表前提で勉強会に臨みます。

ともあれ、時間が許す限り、力を尽くしたので
ある意味ではやり遂げた感も、いったんこちらの内容は一休みして
ずっと気になっていたMRDesignLabs_Unityで、
いろいろ脳内の妄想が実装できそうなのでチャレンジしてみます。

あぁ次こそはキッチリとかっこよく5分ぴったりでおわらせるぞ。。
課題も増えましたが、やりたいことも増えてなんだかとても楽しくなってきています。
これを続けられるように精進かな。。


2017年10月8日日曜日

はじめよう!Mixed Reality を開催しました。

お疲れ様です。ZuQ9->Nnです。
2017/10/07(金) はじめよう!Mixed Reality を開催しました。
場所は渋谷の21Cafeさん

はじめよう!Mixed Reality (2017/10/06 19:00〜)

理念・目的 最近MRやHoloLensといった分野が盛り上がっていて、ドキュメントなどの整理もされ始めているので、一度初心を思い出すとともにこれからMRを始めたい! という方が情報を仕入れられる機会を作りたいなと思い開催されます。 ## こんな方を対象にしたお話し会です * HoloLensやMR技術に興味がある * でも実機は高いし * unity? C#? ちょっとよくわからないな... * そもそもMRって何よ? VRとは違うの? ## 当日のスケジュール 18:30 開場 18:50 開始 ~19:00 geechs.inc による会場説明 ~19...
これまで、何度も勉強会に参加者としては行っていましたが、
今回は、なんと主催側??。。といっても発表資料を作り
発表しただけで、ほとんど、浅葱 (あさぎ)さんにお任せでした。

本当に色々、準備してくださってありがとうございました。
もう少し、自主的に動けるように、今後の反省点も多いです

当日は、ものすごい雨となりましたが、
ほとんど想定した人数の方が参加してくださったようなので
こちらも本当に、ありがとうございました。

僕の発表内容は、「HoloLensのはじめかた」という技術的な内容より
操作方法やHoloLensに関する説明がメインでした。


いざ まとめ始めると、こんなので大丈夫なのか?
また、発表した後も、こんなのでよかったの??という迷いばかり。。

めちゃくちゃ、つたない発表となりましたが、
無事、最低限の義務は果たせてよかったかなと思っています。

アウトプットはとても、重要だと感じてますが、
僕は、量も少ないうえ、スピード感も無く、
それがとてもコンプレックスな感覚はもっています。

ただ、そんな思いをするたびに、マイペースで良い
自分のできる範囲内で最大で良いのだと自分を言い聞かせています。

他の勉強会の主催者、発表者さんたちは、自分の業務も持ちながら
おしみなく、自分のノウハウを積極的に共有していて
改めて、そのすごさや重要さを再認識しました。

なにはともあれ、勉強会開催という参加者か
次のステップを歩むことができ、自分的には大進歩だと感じています。

今後も続けられるのか?。不安も多いですが
今まで同様に、できる範囲を最大限を尽くして行く感じで取り組みます。

今回は、本当に良い体験になったと感じています
最後に、ほかの登壇者の方も含めてお連れ様でした。

2017年9月18日月曜日

Tokyo HoloLens ミートアップ vol.5 に参加

お疲れ様です。ZuQ9->Nnです。
2017/09/18(日) Tokyo HoloLens Meetup vol.5 が開催されたので参加しました。
場所は、日本マイクロソフト株式会社セミナールーム

Tokyo HoloLens ミートアップ vol.5 (2017/09/17 13:00〜)

開催概要 ## HoloLensアプリ開発秘話 HoloLensアプリ開発で著名な方々に登壇いただき、HoloLensに向いたアプリ、VR/MRに向いたアプリの特長や、HoloLensアプリ開発の裏話をお 話しいただきます。 HoloLensを持っていない方も参加可能です!ご興味のある方は是非ともご参加頂き、HoloLensを含めたWindows ...
イベントの詳細内容は、おそらくほかの方が詳しく、
わかりやすくまとめてくれると期待して。
今回は自分のLTについてのみです。
前から気になっていた椅子の検知にチャレンジ です。


なんとかサンプルが実機でも動きました。

今回はプロジェクトもGitHubに公開しましたので、参考にしてください。
ZuQ9Nn/ChairDetection

ZuQ9Nn/ChairDetection

This is HoloLens Sample App ChairDetection minimum cod
LTは残念ながら5分をオーバーしてしまいました。。orz..
プレゼンや動画の操作に戸惑いましたね。。事前に準備はしてたつもりでしたが
まだまだ努力も必要だったようです。

LTではいきなりコードを出してしまい詳細な説明しきれなかった、
椅子の定義について。ポイントは下記の部分です。

SpatialUnderstandingDllShapes.ShapeComponentConstraint.Create_SurfaceHeight_Between(0.25f, 0.6f),
...
SpatialUnderstandingDllShapes.ShapeComponentConstraint.Create_RectangleLength_Between(0.1f, 0.5f),
SpatialUnderstandingDllShapes.ShapeComponentConstraint.Create_RectangleWidth_Between(0.1f, 0.4f),
こんな感じで図解すると多少はわかりやすいでしょうか? ?(;^_^A アセアセ・・・


UnityでのScaleの1は、HoloLensで見て現実世界の1m
つまり幅が0.1m~0.4m、長さが0.1m~0.5m、床からの高さが0.25m~0.6mの
条件に当てはまった矩形を椅子として扱う感じです。

GitHubでのサンプルプロジェクトはUnityだけでも動くように作っています。
こんな感じで実行した後、ゲームシーンでマウスをぐりぐりと動かして
空間情報を読み込んでみてください。ある程度読み込むとユニティちゃんがでてきます。


結構時間がかかりますので、面倒な方は、
ChairDetection.csのpublicのプロパティ
Min Area For Complete、Min Horiz Area For Complete、Min Wall Area For Completeの値を
小さくしてみてください。実機ではある程度空間情報が必要ですが
Unity上ではそれぞれの値を半分くらいにしても大丈夫だと思います。
SpatialUnderstandingのサンプルは、全部の機能がてんこ盛りにされているため
逆に、やりたいことだけを抜き出すのにかなり苦労します。
今回、かなりコードが短くできたので
他の開発者さんの理解の助けになれば幸いです。

2017年9月14日木曜日

HoloLensの開発 SpatialUnderstandingDllTopologyで壁にオブジェクト配置してみる

お疲れ様です。ZuQ9->Nnです。
今回も、前回に引き続きSpatialUnderstandingの話題です。

SpatialUnderstandingには検知した壁、天井、床にオブジェクト配置する機能があります。
今回はSpatialUnderstandingDllTopologyというクラスを用いて
壁にオブジェクト配置に挑戦してみます。

Unity 5.6.2f1HoloToolkit-Unity-v1.5.8.0.unitypackage
HoloToolkit-Unity-Tests-v1.5.8.0.unitypackage を利用します。
まずは、HoloToolkit-Unity-v1.5.8.0.unitypackageをすべてインポート

次にHoloToolkit-Unity-Tests-v1.5.8.0.unitypackageの
MediumRoomWithHomeFurniture.fbxのみ
チェックしてインポートします。
次にプロジェクトの設定を行います。UnityのHoloToolkitメニューから
Configure > Apply Hololens Projectを選択、
表示されたポップアップメニューのApplyをおします。
続いてUnityのHoloToolkitメニューから
Configure > Apply Hololens Capablity Settingを選択、
Spatial PerceptionをチェックしてApplyをおします。
HierarchyのMain Cameraを右クリックで選択
表示されたメニューからDeleteで削除します。
HoloLensCamera、InputManager、Cusor、SpatialMapping、SpatialUnderstandingの
PrefabをHierarchyに置きます。
(HoloLensCamera、InputManagerはProjectのHoloToolkit > Input > Prefabs
CusorはHoloToolkit > Input > Prefabs > Cursor
SpatialMappingはHoloToolkit > SpatialMapping > Prefabs
SpatialUnderstandingはHoloToolkit > SpatialUnderstanding > Prefabsの中です)

HierarchyのSpatialMappingを選択Room Modelのプロパティに
MediumRoomWithHomeFurniture.fbxを選択しアタッチします。
HierarchyのSpatialMappingを選択Spatial Mapping Managerの
Draw Visual MesheのチェックをOFFにします。
UnityのProjectに適当な画像ファイルを追加します。
(今回はskey.pngという空の画像を追加しました。)
HierarchyのCreate > 3D Object Planeを選択し、Planeを作成
作成されたPlaneの名前をposterに変更、大きさを適当に変更し(サンプルでは x0.1 y0.1 z0.1)
rotationのxを90に変更、Unityに追加した画像ファイルをposterのMaterialにします。
HierarchyのposterをProjectにドラグアンドドロップでPrefab化した後
Hierarchyのposterは削除します。

ProjectのCreateからC# Scriptを選択、Scriptの名前をTopologySampleとします。

TopologySampleの中身はこんな感じです。

HierarchyのCreate Emptyで空のGame Objectを追加し
GameObjectにTopologySampleのScriptをアタッチ、
TopologySampleのWall Prefabプロパティにposterのprefabをアタッチして完成。
Unityを実行するとこんな感じで壁に、空のポスターが表示されます。
もちろん、SpatialUnderstandingDllTopologyを使わなくても
同じように壁にオブジェクト配置することは可能です。

MicrosoftのHolograms 230 のサンプルはSpatialMappingとSurfaceMeshesToPlanes.csで
壁の検知と壁にポスターを張っています。

SpatialUnderstandingDllTopology.QueryTopology_FindPositionsOnWallsの
メソッドの引数を調整することで細かく壁の位置が指定できるのが特徴ですね。

より細かく制御する場合はSpatialUnderstandingDllTopologyを
用いるといったすみわけかな。

GitHubで見つけたSpatialDemoでは壁だけではなく
SpatialUnderstandingDllTopology.QueryTopology_FindPositionsOnFloor
SpatialUnderstandingDllTopology.QueryTopology_FindPositionsSittable
なんかも利用していますので、併せて参考にしてください。

2017年8月23日水曜日

fastlane勉強会 vol4 に参加

お疲れ様です。 ZuQ9->Nnです
2017/08/22(日) fastlane勉強会 vol4 が開催されたので参加しました。
場所は株式会社Origami さん
実はこの勉強会は何度お参加しているのですが
今回の目的は勉強会の参加ってよりも、自分の発表です。

発表内容はFabricでfastlaneを使ってみるというもの

前から気になっていたので今回、自分の勉強もかねて
どこまでこのツールが使えるかを検証したかったのでこのテーマを選びました。

発表が久しぶりすぎて緊張しすぎてしまい。かなりグダグダになってしまいましたね。
発表中もFabricとfastlaneの話がまじってしまい。
自分の中で混乱してしまう感じでした。
あと、自分の発表に集中しすぎて、他の方の発表を集中して聞けなかった。orz..

特にmatchあたりは、現状きちんと使えて無いので
もう一度資料だけでも読み直しておきます。

あーなんだか悔しぃ。。リベンジしてぇって感じ。
あと、もう少し余裕も欲しいですね。
懇親会も料理の写真撮っておけばよかった。ここに載せられたのに。。

また、宣言して自分を追い込むかなぁ。
最近こんな感じでしか行動できてないけど。。
また、その時の気分、ノリで決めたいと思います。

最後に、今回の発表の機会をいただけて大変ありがとうございました。
これを糧に次のステップに進めるように精進します。

2017年6月4日日曜日

HoloLens開発 SpatialUnderstanding事始め 空間検知と空間内の情報(天井、床、壁)の判定まで

お疲れ様です。ZuQ9->Nnです。
久しぶりのHoloLens開発の進捗。
今回はSpatialUnderstandingです。

SpatialUnderstandingはクラス名、メソッド名が長くまた公式のサンプル
HoloToolkit-Examples > SpatialUnderstanding > SpatialUnderstanding-FeatureOverviewの
中のコードもかなり多めで解析が困難です。
ですから、まず空間検知と空間内の情報(天井、床、壁)の判定までを行っていきます。

今回は、Unity 5.6.1f1 (64-bit)
HoloToolKit-UnityはGitHubの最新を取得して行いました。

Unityのプロジェクトを作成し、
HoloToolKit-UnityとHoloToolkit-Testsのフォルダーを追加してください。

UnityにHoloToolKitのメニューが表示されますので
Configure > Apply HoloLens Project Settingsを選択
表示されたメニューをそのままApply > YES

プロジェクトの設定が終わったら再びUnityにHoloToolKitのメニューから
Configure > Apply HoloLens Capability Settingsを選択
Spatial PerceptionをチェックしApply

次に、 HierarchyのMain cameraを右クリック
メニューからDelelteで削除します

Project内のHoloToolkit > Input > PrefabのHoloLensCamera

続いてInputManager、

HoloToolkit > Input > Prefab > Cursorの中のCursor

HoloToolkit > SpatialMapping > Preabsの中のSpatialMapping

HoloToolkit > SpatialUnderstanding > Preabsの中のSpatialUnderstandingを

それぞれHierarchyに追加

HierarchyのSpatialMappingを選択し、Inspectorの
Object Surface Obsever Room Modelのプロパティをクリック
MediumRoomWithHomeFurnitureを選択しセット

Spatial Mapping ManagerのDraw Visual Meshesのチェックを外します。


この段階でいったんUnityを実行してみると。
こんな感じて空間検知が実行されメッシュが表示されます。

SpatialMapping同様、空間検知だけならノーコーディングでできてしまいます。

次にHierarchyのCreateから 3DObject > 3D Textを選択し追加
3D TextのInspectorで見やすい位置、設定にしてください。

今回はTransformのpositionをx:0 y:0 z;40
Text MehのAnchorをMiddle Cneter AlignmentをCenter
Font Sizeを30に設定しました。(ここはご自由にお好きな設定にしてください)


つづいて3D TextのInspector Add ComponentでTaglongと

BillboardのScriptを追加します

ProjectのCreateからC# Script、スクリプトの名前を
SpatialUnserstandingTestとします。

SpatialUnserstandingTestの中身はこんな感じ

using UnityEngine;
using HoloToolkit.Unity;
using System;

public class SpatialUnserstandingTest : MonoBehaviour {

    public TextMesh textMesh = null;
    public float kMinAreaForComplete = 50.0f;
    public float kMinHorizAreaForComplete = 25.0f;
    public float kMinWallAreaForComplete = 10.0f;

    private void LateUpdate()
    {
        if (DoesScanMeetMinBarForCompletion)
        {
            SpatialUnderstanding.Instance.RequestFinishScan();
        }

        Vector3 rayPos = Camera.main.transform.position;
        Vector3 rayVec = Camera.main.transform.forward * 10.0f;

        IntPtr raycastResultPtr = SpatialUnderstanding.Instance.UnderstandingDLL.GetStaticRaycastResultPtr();
        SpatialUnderstandingDll.Imports.PlayspaceRaycast(
            rayPos.x,
            rayPos.y,
            rayPos.z,
            rayVec.x,
            rayVec.y,
            rayVec.z,
            raycastResultPtr);

        SpatialUnderstandingDll.Imports.RaycastResult rayCastResult = SpatialUnderstanding.Instance.UnderstandingDLL.GetStaticRaycastResult();
        textMesh.text = rayCastResult.SurfaceType.ToString();
    }
    private bool DoesScanMeetMinBarForCompletion
    {
        get
        {
            if ((SpatialUnderstanding.Instance.ScanState != SpatialUnderstanding.ScanStates.Scanning) ||
                (!SpatialUnderstanding.Instance.AllowSpatialUnderstanding))
            {
                return false;
            }

            IntPtr statsPtr = SpatialUnderstanding.Instance.UnderstandingDLL.GetStaticPlayspaceStatsPtr();
            if (SpatialUnderstandingDll.Imports.QueryPlayspaceStats(statsPtr) == 0)
            {
                return false;
            }

            SpatialUnderstandingDll.Imports.PlayspaceStats stats = SpatialUnderstanding.Instance.UnderstandingDLL.GetStaticPlayspaceStats();
            if ((stats.TotalSurfaceArea > kMinAreaForComplete) ||
                (stats.HorizSurfaceArea > kMinHorizAreaForComplete) ||
                (stats.WallSurfaceArea > kMinWallAreaForComplete))
            {
                return true;
            }
            return false;
        }
    }
}

最後に、HierarchyのCreateからCreate EmptyでからのGameObjectを作成

作成したGameObjectのAdd Componentで先ほど作成した
SpatialUnserstandingTestとのスクリプトをアタッチ

SpatialUnserstandingTestのText MeshにNew Textを設定

これでUnityを実行、マウスでぐりぐり視線を動かすとこんな感じで
Testに空間の情報が表示されます。

それでは、SpatialMappingとSpatialUnserstandingとの相違点は何かといことですが
僕の理解では下記の点かとおもいます。(間違っていた場合はご指摘ください。)

*メッシュの形状が異なる
   これは一目瞭然なのですが、SpatialMappingは、かなり、
    ガタガタなメッシュが表示されるのに対し
 SpatialUnserstandingは場所によっては、
    とても綺麗なグリッド状のメッシュが表示されます。

*メッシュの構築プロセスが異なる
    これは文章で説明するとわかりにくいのですが、SpatialMappingは実行して
    時間がたてば行動しなくてもメッシュの情報が構築されていきます。
     SpatialUnserstandingは動画で示した通り、実行しただけでは、
     少ししかメッシュが表示されず
     積極的に視線を動かしていくことでメッシュの情報が構築されていきます。

*SpatialUnserstandingは直接、空間内の情報(天井、壁、床)を判別できる。
     SpatialMappingはSurfaceMeshesToPlanes.csのMakePlanesメソッドを実行し
     SurfacePlaneオブジェクトを生成しないと空間内の天井、壁、床を判別できませんが
     SpatialUnserstandingは視線の先の情報を直接判別することができます。

*空間内で判別できる情報がSpatialUnserstandingの方が多い
     SpatialMappingは、SurfacePlane.csにPlaneTypesのenumで定義されている
     Wall、Floor、Ceiling、Table、Unknownの5種類しか判別できないのに対し
     SpatialUnserstandingは、SpatialUnderstandingDll.csの
     内部クラスRaycastResultのSurfaceTypesのenumで定義されている
     Invalid、Other、Floor、FloorLike、Platform、Ceiling、WallExternal、WallLikeの8種類です

*SpatialUnserstandingでは定義以外の空間内情報を独自定義することができる
     MicrosoftのSpatialUnserstanding公式のサンプルでは
  ChairやCouch(ソファーのような長椅子)を独自定義し利用しています。

*SpatialUnserstandingでは空間内にオブジェクトを生成する便利関数が存在する
     HoloToolkit > SpatialMapping > Script内に
 SpatialUnderstandingDllObjectPlacement.csのスクリプトが用意されていて
     Create_OnFloor、Create_OnWall、Create_OnCeilingという、
     いかにもオブジェクトの生成を助けるような便利関数が存在しています。

これらを見ていくと、今回おこなった空間検知、空間内の情報の判別を行った後
最後のお便利関数を利用してオブジェクトを配置してくといった
処理の流れになるかと思います。

SpatialUnderstandingは、やはりコードも長く複雑な印象が強く
苦手意識が強くなりますが、今回くらいの内容であれば
意外と怖くないかも?っておもってくれる開発者が多くなるといいなぁと考えています。

SpatialUnderstandingは情報も少なかったので
個人的に参考にした記事のリンクも張っておきます

Indubitable Development
HoloLens Tutorial – Spatial Understanding

El Bruno
#Hololens – Spatial Understanding vs Spatial Mapping, and a step-by-step on how to use it

Mike Taulty
Hitchhiking the HoloToolkit-Unity, Leg 14–More with Spatial Understanding
https://mtaulty.com/2017/05/03/hitchhiking-the-holotoolkit-unity-leg-14-more-with-spatial-understanding/