Creación de un proveedor de datos del sistema de reconocimiento espacial: MRTK2

El sistema de reconocimiento espacial es un sistema extensible para proporcionar aplicaciones con datos sobre entornos reales. Para agregar compatibilidad con una nueva plataforma de hardware o una nueva forma de datos de reconocimiento espacial, es posible que se requiera un proveedor de datos personalizado.

En este artículo se describe cómo crear proveedores de datos personalizados, también denominados observadores espaciales, para el sistema de reconocimiento espacial. El código de ejemplo que se muestra aquí es de la implementación de clase SpatialObjectMeshObserver que es útil para cargar datos de malla 3D en el editor.

Nota

El código fuente completo que se usa en este ejemplo se puede encontrar en la Assets/MRTK/Providers/ObjectMeshObserver carpeta .

Espacio de nombres y estructura de carpetas

Los proveedores de datos se pueden distribuir de una de estas dos maneras:

  1. Complementos de terceros
  2. Parte del Kit de herramientas de Microsoft Mixed Reality

El proceso de aprobación de los envíos de nuevos proveedores de datos a MRTK variará según el caso y se comunicará en el momento de la propuesta inicial. Las propuestas se pueden enviar mediante la creación de un nuevo problema de tipo solicitud de características.

Complemento de terceros

Espacio de nombres

Los proveedores de datos deben tener un espacio de nombres para mitigar posibles colisiones de nombres. Se recomienda que el espacio de nombres incluya los siguientes componentes.

  • Nombre de la empresa que genera el complemento
  • Área de función

Por ejemplo, un proveedor de datos de Reconocimiento espacial creado y enviado por la empresa Contoso puede ser "Contoso.MixedReality.Toolkit.SpatialAwareness".

Estructura de carpetas

Se recomienda que el código fuente de los proveedores de datos se incluya en una jerarquía de carpetas, como se muestra en la imagen siguiente.

Ejemplo de estructura de carpetas

Donde la carpeta ContosoSpatialAwareness contiene la implementación del proveedor de datos, la carpeta Editor contiene el inspector (y cualquier otro código específico del editor de Unity) y la carpeta Profiles contiene uno o varios objetos scriptables de perfil creados previamente.

Envío de MRTK

Espacio de nombres

Si se envía un proveedor de datos del sistema de reconocimiento espacial al repositorio de Mixed Reality Toolkit, el espacio de nombres debe comenzar con Microsoft.MixedReality.Toolkit (por ejemplo: Microsoft.MixedReality.Toolkit.SpatialObjectMeshObserver)

y el código debe encontrarse en una carpeta debajo de MRTK/Providers (por ejemplo: MRTK/Providers/ObjectMeshObserver).

Estructura de carpetas

Todo el código debe encontrarse en una carpeta debajo de MRTK/Providers (por ejemplo, MRTK/Providers/ObjectMeshObserver).

Definición del objeto de datos espaciales

El primer paso para crear un proveedor de datos de reconocimiento espacial es determinar el tipo de datos (por ejemplo, mallas o planos) que proporcionará a las aplicaciones.

Todos los objetos de datos espaciales deben implementar la IMixedRealitySpatialAwarenessObject interfaz .

La base Mixed Reality Toolkit proporciona los siguientes objetos espaciales que se pueden usar o ampliar en nuevos proveedores de datos.

Implementación del proveedor de datos

Especificación de la interfaz o la herencia de clases base

Todos los proveedores de datos de reconocimiento espacial deben implementar la IMixedRealitySpatialAwarenessObserver interfaz , que especifica la funcionalidad mínima requerida por el sistema de reconocimiento espacial. La base MRTK incluye la BaseSpatialObserver clase que proporciona una implementación predeterminada de esta funcionalidad necesaria.

public class SpatialObjectMeshObserver :
    BaseSpatialObserver,
    IMixedRealitySpatialAwarenessMeshObserver,
    IMixedRealityCapabilityCheck
{ }

Nota

La IMixedRealityCapabilityCheck clase usa la SpatialObjectMeshObserver interfaz para indicar que proporciona compatibilidad con la funcionalidad SpatialAwarenessMesh.

Aplicación del atributo MixedRealityDataProvider

Un paso clave para crear un proveedor de datos de Reconocimiento espacial es aplicar el MixedRealityDataProvider atributo a la clase . Este paso permite establecer el perfil y las plataformas predeterminados para el proveedor de datos, cuando se seleccionan en el perfil de reconocimiento espacial, así como nombre, ruta de acceso de carpeta, etc.

[MixedRealityDataProvider(
    typeof(IMixedRealitySpatialAwarenessSystem),
    SupportedPlatforms.WindowsEditor | SupportedPlatforms.MacEditor | SupportedPlatforms.LinuxEditor,
    "Spatial Object Mesh Observer",
    "ObjectMeshObserver/Profiles/DefaultObjectMeshObserverProfile.asset",
    "MixedRealityToolkit.Providers")]
public class SpatialObjectMeshObserver :
    BaseSpatialObserver,
    IMixedRealitySpatialAwarenessMeshObserver,
    IMixedRealityCapabilityCheck
{ }

Implementar los métodos IMixedRealityDataProvider

Una vez definida la clase, el siguiente paso es proporcionar la implementación de la IMixedRealityDataProvider interfaz.

Nota

La BaseSpatialObserver clase, a través de la BaseService clase , proporciona solo una implementación vacía para IMixedRealityDataProvider los métodos. Los detalles de estos métodos suelen ser específicos del proveedor de datos.

Los métodos que debe implementar el proveedor de datos son:

  • Destroy()
  • Disable()
  • Enable()
  • Initialize()
  • Reset()
  • Update()

Implementación de la lógica del proveedor de datos

El siguiente paso consiste en agregar la lógica del proveedor de datos mediante la implementación de la interfaz del proveedor de datos específica, por ejemplo IMixedRealitySpatialAwarenessMeshObserver. Esta parte del proveedor de datos normalmente será específica de la plataforma.

Notificaciones de cambios de observación

Para permitir que las aplicaciones respondan a los cambios en la comprensión del entorno del dispositivo, el proveedor de datos genera eventos de notificación según se define en la IMixedRealitySpatialAwarenessObservationtHandler<T> interfaz .

  • OnObservationAdded()
  • OnObservationRemoved()
  • OnObservationUpdated()

En el código siguiente de los SpatialObjectMeshObserver ejemplos se muestra cómo generar y eventos cuando se agregan datos de malla.

// The data to be sent when mesh observation events occur.
// This member variable is initialized as part of the Initialize() method.
private MixedRealitySpatialAwarenessEventData<SpatialAwarenessMeshObject> meshEventData = null;

/// <summary>
/// Sends the observations using the mesh data contained within the configured 3D model.
/// </summary>
private void SendMeshObjects()
{
    if (!sendObservations) { return; }

    if (spatialMeshObject != null)
    {
        MeshFilter[] meshFilters = spatialMeshObject.GetComponentsInChildren<MeshFilter>();
        for (int i = 0; i < meshFilters.Length; i++)
        {
            SpatialAwarenessMeshObject meshObject = SpatialAwarenessMeshObject.Create(
                meshFilters[i].sharedMesh,
                MeshPhysicsLayer,
                $"Spatial Object Mesh {currentMeshId}",
                currentMeshId,
                ObservedObjectParent);

            meshObject.GameObject.transform.localPosition = meshFilters[i].transform.position;
            meshObject.GameObject.transform.localRotation = meshFilters[i].transform.rotation;

            ApplyMeshMaterial(meshObject);

            meshes.Add(currentMeshId, meshObject);

            // Initialize the meshEventData variable with data for the added event.
            meshEventData.Initialize(this, currentMeshId, meshObject);
            // Raise the event via the spatial awareness system.
            SpatialAwarenessSystem?.HandleEvent(meshEventData, OnMeshAdded);

            currentMeshId++;
        }
    }

    sendObservations = false;
}

Nota

La SpatialObjectMeshObserver clase no genera OnObservationUpdated eventos, ya que el modelo 3D solo se carga una vez. La implementación de la WindowsMixedRealitySpatialMeshObserver clase proporciona un ejemplo de generación de un OnObservationUpdated evento para una malla observada.

Adición de instrumentación de Unity Profiler

El rendimiento es fundamental en las aplicaciones de realidad mixta. Cada componente agrega cierta cantidad de sobrecarga para la que las aplicaciones deben tener en cuenta. Para ello, es importante que todos los proveedores de datos de reconocimiento espacial contengan instrumentación de Unity Profiler en bucle interno y rutas de acceso de código usadas con frecuencia.

Se recomienda implementar el patrón utilizado por MRTK al instrumentar proveedores personalizados.

        private static readonly ProfilerMarker UpdateObserverPerfMarker = new ProfilerMarker("[MRTK] WindowsMixedRealitySpatialMeshObserver.UpdateObserver");

        /// <summary>
        /// Requests updates from the surface observer.
        /// </summary>
        private void UpdateObserver()
        {
            using (UpdateObserverPerfMarker.Auto())
            {
                // Code to be measured.
            }
        }

Nota

El nombre usado para identificar el marcador del generador de perfiles es arbitrario. MRTK usa el siguiente patrón.

"[product] className.methodName : nota opcional"

Se recomienda que los proveedores de datos personalizados sigan un patrón similar para ayudar a simplificar la identificación de componentes y métodos específicos al analizar seguimientos.

Crear el perfil y el inspector

En Mixed Reality Toolkit, los proveedores de datos se configuran mediante perfiles.

Definición del perfil

El contenido del perfil debe reflejar las propiedades accesibles del proveedor de datos (por ejemplo, intervalo de actualización). Todas las propiedades configurables por el usuario definidas en cada interfaz deben estar contenidas en el perfil.

Se recomienda que las clases base si un nuevo proveedor de datos extiende un proveedor existente. Por ejemplo, SpatialObjectMeshObserverProfile extiende MixedRealitySpatialAwarenessMeshObserverProfile para permitir que los clientes proporcionen un modelo 3D que se usará como datos del entorno.

[CreateAssetMenu(
    menuName = "Mixed Reality Toolkit/Profiles/Spatial Object Mesh Observer Profile",
    fileName = "SpatialObjectMeshObserverProfile",
    order = 100)]
public class SpatialObjectMeshObserverProfile : MixedRealitySpatialAwarenessMeshObserverProfile
{
    [SerializeField]
    [Tooltip("The model containing the desired mesh data.")]
    private GameObject spatialMeshObject = null;

    /// <summary>
    /// The model containing the desired mesh data.
    /// </summary>
    public GameObject SpatialMeshObject => spatialMeshObject;
}

El CreateAssetMenu atributo se puede aplicar a la clase de perfil para permitir a los clientes crear una instancia de perfil mediante el menú Crear>recursos>Mixed Reality Perfiles del kit de herramientas>.

Implementar el inspector

Los inspectores de perfil son la interfaz de usuario para configurar y ver el contenido del perfil. Cada inspector de perfil debe extender la BaseMixedRealityToolkitConfigurationProfileInspector clase .

El CustomEditor atributo informa a Unity del tipo de recurso al que se aplica el inspector.

[CustomEditor(typeof(SpatialObjectMeshObserverProfile))]
public class SpatialObjectMeshObserverProfileInspector : BaseMixedRealityToolkitConfigurationProfileInspector
{ }

Crear definiciones de ensamblado

Mixed Reality Toolkit usa archivos de definición de ensamblado (.asmdef) para especificar dependencias entre componentes, así como para ayudar a Unity a reducir el tiempo de compilación.

Se recomienda crear archivos de definición de ensamblado para todos los proveedores de datos y sus componentes del editor.

Con la estructura de carpetas del ejemplo anterior, habría dos archivos .asmdef para el proveedor de datos ContosoSpatialAwareness.

La primera definición de ensamblado es para el proveedor de datos. En este ejemplo, se llamará ContosoSpatialAwareness y se ubicará en la carpeta ContosoSpatialAwareness del ejemplo. Esta definición de ensamblado debe especificar una dependencia de Microsoft.MixedReality.Toolkit y de cualquier otro ensamblado en el que dependa.

La definición del ensamblado ContosoInputEditor especificará el inspector de perfil y cualquier código específico del editor. Este archivo debe encontrarse en la carpeta raíz del código del editor. En este ejemplo, el archivo se ubicará en la carpeta ContosoSpatialAwareness\Editor . Esta definición de ensamblado contendrá una referencia al ensamblado ContosoSpatialAwareness, así como:

  • Microsoft.MixedReality.Toolkit
  • Microsoft.MixedReality.Toolkit.Editor.Inspectors
  • Microsoft.MixedReality.Toolkit.Editor.Utilities

Registro del proveedor de datos

Una vez creado, el proveedor de datos se puede registrar con el sistema de reconocimiento espacial que se usará en la aplicación.

Selección del observador de malla de objetos espaciales

Empaquetado y distribución

Los proveedores de datos que se distribuyen como componentes de terceros tienen los detalles específicos del empaquetado y la distribución que quedan a la preferencia del desarrollador. Es probable que la solución más común sea generar un paquete .unitypackage y distribuir a través del almacén de recursos de Unity.

Si se envía y acepta un proveedor de datos como parte del paquete microsoft Mixed Reality Toolkit, el equipo de Microsoft MRTK empaquetará y lo distribuirá como parte de las ofertas de MRTK.

Consulte también