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:
- Complementos de terceros
- 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 de 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.
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 el nombre, la 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 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.
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. Probablemente, la solución más común será generar un archivo .unitypackage y distribuirlo 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.
Vea también
- Sistema de reconocimiento espacial
IMixedRealitySpatialAwarenessObject
Interfaz- Clase
BaseSpatialAwarenessObject
- Clase
SpatialAwarenessMeshObject
- Clase
SpatialAwarenessPlanarObject
IMixedRealitySpatialAwarenessObserver
Interfaz- Clase
IMixedRealitySpatialAwarenessMeshObserver
InterfazIMixedRealityDataProvider
InterfazIMixedRealityCapabilityCheck
Interfaz