#Hololens – Spatial Understanding vs Spatial Mapping, y un paso a paso sobre como utilizarlo

Hola !

HoloToolkit posee 2 herramientas que nos permiten realizar un un scaneo de nuestros alrededores cuando usamos Hololens.

  • Spatial Mapping
  • Spatial Understanding

Spatial Mapping es el asset que usamos por defecto y es el que nos permite tener un control básico del proceso de scan que realiza Hololens. Por ejemplo, una vez que agregamos este elemento y habilitamos el dibujo del Mesh, podemos ver en tiempo real el scan que hace Hololens del entorno donde la estamos utilizando.

Spatial Understanding nos permite ir un paso más allá y realizar algunas tareas más complejas. Por ejemplo:

  • Definir el momento de inicio y fin para el proceso de scan. Esto es realmente útil cuando por ejemplo, necesitamos realizar un scan inicial y luego sabemos que el contexto de trabajo no cambiará. Si deshabilitamos el scan en tiempo real, le damos más recursos a Hololens para utilizar en otras cosas
  • Realizar consultas simples sobre diferentes elementos en nuestro punto de vista. Por ejemplo, para buscar superficies planas en una pared o en el piso para posicionar hologramas.
  • Realizar consultas más complejas, para buscar elementos como una silla, una guitarra, etc. A esta opción no la he utilizado pero la tengo en reserva para cuando la necesite.

Importante: siempre que utilizamos Spatial Understanding, debemos tener agregado el prefab de Spatial Mapping, en caso contrario veremos unos errores muy divertidos.

Personalmente creo que las 2 mejores formas de conocer como funciona Spatial Understanding son las siguientes

  • Leer el artículo de Jeff Evertt Case study – Expanding the spatial mapping capabilities of HoloLens, donde comenta como han creado este asset para escenarios específicos que no se contemplaban en HoloToolkit.
  • Revisar la Scene de ejemplo ubicada en “HoloToolkit-Unity/Assets/HoloToolkit-Examples/SpatialUnderstanding/SpatialUnderstanding-FeatureOverview/Scenes/“.
    La misma utiliza Spatial Understanding para realizar un scan inicial del ambiente y luego presentar algunas opciones de consultas simples.

Si además lo quieres utilizar en un proyecto propio, el siguiente pequeño paso a paso puede ayudarte. El resultado final es una app que muestra en tiempo real un HUD con el estado del scan y al finalizar deshabilita la visualización del Mesh.

Estos son los pasos a seguir.

  1. Create a 3D project in Unity3D
  2. Import HoloToolkit package
  3. Configure project to
    1. Support HoloLens projects (UWP, VR, etc)
    2. enable Spatial Mapping feature
  4. Clean Scene elements
  5. Add
    1. Hololens Camera
    2. Cursor With Feedback
    3. Input Manager
    4. Spatial Mapping
    5. Spatial Understanding
    6. FPS Display
  6. Add Empty element
    1. Rename to CodeManagers
    2. Add new C# Script named “GameStartScanner.cs”

El proyecto debe quedar similar al siguiente

Clipboard02

El código completo del ejemplo se puede descargar desde aquí (link).

Y el script para la nueva clase está debajo, y lo mejor es revisar un par de apuntes interesantes sobre la misma

  • Las propiedades MinAreaForComplete , MinHorizAreaForComplete, MinWallAreaForComplete definen el mínimo de área a escanear para dar el proceso cómo válido
  • En el Start() se inicia el proceso de Scan con la operación SpatialUnderstanding.Instance.RequestBeginScanning(); y además nos suscribimos a los cambios de estado
  • La propiedad DoesScanMeetMinBarForCompletion es la que se encarga de validar si se ha terminado el proceso de scan
  • En el Update se realizan 2 operaciones imporantes
    • Se muestra en un FPS Text el estado del proceso de scan
    • Si el se ha encontrado el minimo de elementos, finalizamos el proceso de scan, y deshabilitamos el proceso visual de scan

Código de ejemplo

using System;
using HoloToolkit.Unity;
using HoloToolkit.Unity.SpatialMapping;
using UnityEngine;
using UnityEngine.UI;
public class GameStartScanner : MonoBehaviour
{
public float MinAreaForComplete = 30.0f;
public float MinHorizAreaForComplete = 20.0f;
public float MinWallAreaForComplete = 5.0f;
private bool _scanComplete = false;
public TextMesh DebugDisplay;
void Start()
{
SpatialUnderstanding.Instance.ScanStateChanged += Instance_ScanStateChanged;
SpatialUnderstanding.Instance.RequestBeginScanning();
}
private void Instance_ScanStateChanged()
{
if ((SpatialUnderstanding.Instance.ScanState == SpatialUnderstanding.ScanStates.Done)
&& SpatialUnderstanding.Instance.AllowSpatialUnderstanding)
{
_scanComplete = true;
}
}
void Update()
{
if (DebugDisplay != null)
DebugDisplay.text = PrimaryText;
if (_scanComplete || !DoesScanMeetMinBarForCompletion) return;
SpatialUnderstanding.Instance.RequestFinishScan();
_scanComplete = true;
// hide mesh
var customMesh = SpatialUnderstanding.Instance.GetComponent<SpatialUnderstandingCustomMesh>();
customMesh.DrawProcessedMesh = false;
SpatialMappingManager.Instance.DrawVisualMeshes = false;
}
public string PrimaryText
{
get
{
// Scan state
if (SpatialUnderstanding.Instance.AllowSpatialUnderstanding)
{
switch (SpatialUnderstanding.Instance.ScanState)
{
case SpatialUnderstanding.ScanStates.Scanning:
// Get the scan stats
IntPtr statsPtr = SpatialUnderstanding.Instance.UnderstandingDLL.GetStaticPlayspaceStatsPtr();
if (SpatialUnderstandingDll.Imports.QueryPlayspaceStats(statsPtr) == 0)
{
return "playspace stats query failed";
}
// The stats tell us if we could potentially finish
if (DoesScanMeetMinBarForCompletion)
{
return "When ready, air tap to finalize your playspace";
}
return @"Bruno it's time to walk !
Move around and scan in your playspace";
case SpatialUnderstanding.ScanStates.Finishing:
return "Finalizing scan (please wait)";
case SpatialUnderstanding.ScanStates.Done:
return "Scan complete – Now go back to work!";
default:
return @"I'm working,
ScanState = " + SpatialUnderstanding.Instance.ScanState.ToString();
}
}
return "";
}
}
public bool DoesScanMeetMinBarForCompletion
{
get
{
// Only allow this when we are actually scanning
if ((SpatialUnderstanding.Instance.ScanState != SpatialUnderstanding.ScanStates.Scanning) ||
(!SpatialUnderstanding.Instance.AllowSpatialUnderstanding))
{
return false;
}
// Query the current playspace stats
var statsPtr = SpatialUnderstanding.Instance.UnderstandingDLL.GetStaticPlayspaceStatsPtr();
if (SpatialUnderstandingDll.Imports.QueryPlayspaceStats(statsPtr) == 0)
{
return false;
}
var stats = SpatialUnderstanding.Instance.UnderstandingDLL.GetStaticPlayspaceStats();
// Check our preset requirements
if ((stats.TotalSurfaceArea > MinAreaForComplete) ||
(stats.HorizSurfaceArea > MinHorizAreaForComplete) ||
(stats.WallSurfaceArea > MinWallAreaForComplete))
{
return true;
}
return false;
}
}
}

 

Saludos @ Toronto

El Bruno

References

#Hololens – What to do when the device does not recognize a #Space?

Hello!

After a couple of months participating in events about Microsoft Hololens, today I found a new bug for me. Before going into details, let me share one of the most important Hololens features.

When one power on the device, the device begins to create a spatial mapping of the environment where it is used. This mapping is called “Space” and stored in the device HD. These definitions of space, are used when the device is activated again doing “a fast loading” of space and store only the changes that have occurred in the same.
Today, on my desktop of my house I happened to my Hololens does not recognize my space. This is pretty weird, since it is the place where I most use them. The problem is that, without spatial mapping, the device cannot be used.

After researching a bit what is happening, I realised the local process of loading and comparison of Spaces, was consuming all the resources of my device. The solution is very simple: Delete them all!

And here is the way to delete the collection of spaces. First, we see that when the device can not load a Space, the settings window will always open with a status bar that “invites us to load a definition of a Space”. Making click the status bar will navigate to the Spaces settings view.

01

Here we can see the Spaces collection. Based on how much time we used the device and how big is the environment, we can find different sizes. In my case, the smallest was about 20 MB and the largest nearly 500 MBs.

02

The next thing is to delete ONE BY ONE all the spaces. This is a great moment to suggest a “Delete All” button.

03

While logic suggests that when there is only a Space definition, the device should be able to function again, this did not happen. I had to erase all the spaces and restart the device to be able to return to work.

06

After this, already I could go back and use my Hololens again.

Important: How cool is my Wifi name?

Greetings @ Toronto

El Bruno

#Hololens – Qué hacer cuando el device no reconoce un #Space?

Hola !

Después de un par de meses participando en eventos con Microsoft Hololens, hoy me encontré con un error que no tenía registrado. Antes de explicar el mismo, es momento de comentar una de las funcionalidades más importantes que posee Hololens.

Cuando uno activa el device el mismo comienza a crear un mapeo espacial del ambiente donde se está utilizando. A este mapeo se lo llama “Space” y se guarda en el HD del device. Estas definiciones de espacio, luego se utilizan cuando el device se activa nuevamente para “hacer un fast loading” del espacio y solo guardar los cambios que se han registrado en el mismo.

Hoy, en mi escritorio de mi casa me sucedió que mis Hololens no reconocian mi espacio. Esto es bastante raro, ya que es el espacio donde más las utilizo. El problema es que, sin mapeo espacial, el dispositivo no se puede utiliza.

Después de investigar un poco lo que sucede, me dí cuenta de que el proceso de cargado y comparación de los Spaces, con el local, estaba consumiendo todos los recursos de mi device. La solución es muy simple: borrarlos todos !

Y he aquí la forma de borrarlos. En primer lugar, veremos que como el device no puede cargar un Space, la ventana de settings quedará siempre abierta con una barra de estado que nos “invita a cargar una definición de un Space”. Haciendo click el esta barra de estad accederemos a la colección de Spaces.

01

Aquí podremos ver la colección de Spaces. Dependiendo del tiempo que usemos los mismo y lo grande que sea el espacio, podremos encontrar diferentes tamaños. En mi caso el más pequeño era de unos 20 MB y el más grande cerca de 500 MBs.

02

Lo siguiente es borrar UNO POR UNO todos los spaces. Este es un gran momento para sugerir un “Delete All”

03

Si bien la lógica sugiere que al quedar solo un Space, el device debería poder volver a funcionar, esto no sucedió. Tuve que BORRAR TODOS y reiniciar el device para poder volver a trabajar.

06

Después de esto, ya pude volver a utilizar las Hololens nuevamente.

Importante: A que mola el nombre de mi Wifi? 

Saludos @ Toronto

El Bruno

#HoloLens – How to detect hands using #HoloToolkit

Hi !

Someone ask me about the objective of the HandsManager script (part of HoloToolkit).So, if we take a HUD like the one in my previous post, we can use this HUD to display information about hands.

The next sample script shows the following hand information:

  • Hands detected
  • Hand pressed

clipboard02

I’ll create a complete project and I’ll share the project in GitHub.

Greeting @ Toronto

El Bruno

References

#HoloLens – Detectando manos con #HoloToolkit

Hola !

Alguien me preguntó como se podía utilizar el script HandsManager incluido en el HoloToolkit. Pues bien, partiendo de un HUD, como el que comenté en el post anterior, podemos utilizar un script para mostrar el estado de las manos.

El siguiente ejemplo muestra si hay manos detectadas en la escena y además si las mismas están en acción de presionar.

clipboard02

 

En cuanto pueda compilo un ejemplo completo y lo comparto en GitHub.

Saludos @ Toronto

El Bruno

References

#Hololens – Cómo posicionar un holograma utilizando AirTap con #HoloToolkit

Hola !

Hace 2 días me preguntaron cual era la forma más simple de crear un holograma y posicionarlo en el mundo real utilizando las Hololens. Hace un tiempo, escribí un post donde comenté el paso a paso para hacerlo con URHOSharp, y hoy repasaré los pasos para hacerlo con el HoloToolkit.

En posts anteriores ya he comentado como crear un proyecto en Unity3D y como importar el HoloToolkit. A partir de aquí, los siguientes pasos serían

  • Eliminar los assets por defect Main camera y Directional light
  • Grabar la escena
  • Ajustar los valores necesarios para que proyecto de Unity funcione como UWP en Hololens
    • Project Settings / Player
    • Project Settings / Quality
    • File / Build Settings
  • Importar HoloToolkit
  • Buscar en los assets importardos y agregar los siguientes assets de HoloToolkit
    • MainCamera
    • Spatial Mapping
    • Cursor with Feedback
  • Agregar un Empty Game, usualmente lo renombro como Managers y agregar los siguientes componentes
    • Gaze Manager
    • Gaze Stabilizer
    • Gesture Manager
    • Hands Manager
    • World Anchor Manager
  • Agregar un Empty Game, usualmente lo renombro como HoloCollection
    • Agregar un holograma en el mismo
    • Agregar los siguientes components al Holograma
      • World Anchor Manager
      • Tap to Place

El resultado final es similar el siguiente, donde podemos ver como con el gesto AirTap selecciono un holograma, lo muevo en el espacio mostrado con Spatial Mapping y con otro gesto AirTap lo posiciono.

2016 10 10 Hololens move and place object.gif

Listo por hoy: he dejado el paso a paso y ahora no me lo olvido más !

Saludos @ Toronto

El Bruno

References