Erstellen eines Datenanbieters für räumliches Bewusstseinssystem — MRTK2

Das Spatial Awareness-System ist ein erweiterbares System zur Bereitstellung von Anwendungen mit Daten über reale Umgebungen. Um Unterstützung für eine neue Hardwareplattform oder eine neue Form von Spatial Awareness-Daten hinzuzufügen, ist möglicherweise ein benutzerdefinierter Datenanbieter erforderlich.

In diesem Artikel wird beschrieben, wie Sie benutzerdefinierte Datenanbieter erstellen, die auch als Spatial Observers bezeichnet werden, für das Spatial Awareness-System. Der hier gezeigte Beispielcode stammt aus der SpatialObjectMeshObserver Klassenimplementierung, die zum Laden von 3D-Mesh-Daten im Editor nützlich ist.

Hinweis

Der vollständige Quellcode, der in diesem Beispiel verwendet wird, befindet sich im Assets/MRTK/Providers/ObjectMeshObserver Ordner.

Namespace- und Ordnerstruktur

Datenanbieter können auf zwei Arten verteilt werden:

  1. Add-Ons von Drittanbietern
  2. Teil des Microsoft Mixed Reality Toolkits

Das Genehmigungsverfahren für die Übermittlung neuer Datenanbieter an MRTK variiert von Fall zu Fall und wird zum Zeitpunkt des ursprünglichen Vorschlags mitgeteilt. Vorschläge können übermittelt werden, indem ein neues Problem mit dem Featureanforderungstyp erstellt wird.

Drittanbieter-Add-On

Namespace

Datenanbieter müssen über einen Namespace verfügen, um potenzielle Namenskonflikte zu vermeiden. Es wird empfohlen, dass der Namespace die folgenden Komponenten enthält.

  • Firmenname, der das Add-On erstellt
  • Featurebereich

Ein Spatial Awareness-Datenanbieter, der vom Unternehmen Contoso erstellt und ausgeliefert wurde, kann beispielsweise "Contoso.MixedReality.Toolkit.SpatialAwareness" sein.

Ordnerstruktur

Es wird empfohlen, den Quellcode für Datenanbieter in einer Ordnerhierarchie zu erstellen, wie in der folgenden Abbildung dargestellt.

Beispiel für die Paketordnerstruktur

Wenn der Ordner ContosoSpatialAwareness die Implementierung des Datenanbieters enthält, enthält der Ordner Editor den Inspektor (und jeden anderen spezifischen Unity-Editor-Code) und der Ordner Profiles ein oder mehrere vordefinierte Profilskriptobjekte.

MRTK-Übermittlung

Namespace

Wenn ein Raumerkennungssystemdatenanbieter an das Mixed Reality Toolkit-Repository übermittelt wird, muss der Namespace mit Microsoft.MixedReality.Toolkit (z. B. Microsoft.MixedReality.Toolkit.SpatialObjectMeshObserver) beginnen.

und der Code sollte sich in einem Ordner unter MRTK/Providers (z. B. MRTK/Providers/ObjectMeshObserver) befinden.

Ordnerstruktur

Der gesamte Code sollte sich in einem Ordner unter MRTK/Providers (z. B. MRTK/Providers/ObjectMeshObserver) befinden.

Definieren des räumlichen Datenobjekts

Der erste Schritt beim Erstellen eines Spatial Awareness-Datenanbieters besteht darin, den Typ der Daten (z. B. Gitter oder Ebenen) zu bestimmen, die er anwendungen bereitstellt.

Alle räumlichen Datenobjekte müssen die IMixedRealitySpatialAwarenessObject Schnittstelle implementieren.

Die Mixed Reality Toolkit-Basis stellt die folgenden räumlichen Objekte bereit, die in neuen Datenanbietern verwendet oder erweitert werden können.

Implementieren des Datenanbieters

Angeben von Schnittstellen- und/oder Basisklassenvererbung

Alle Spatial Awareness-Datenanbieter müssen die IMixedRealitySpatialAwarenessObserver Schnittstelle implementieren, die die Mindestfunktionalität angibt, die für das Spatial Awareness-System erforderlich ist. Die MRTK-Grundlage enthält die BaseSpatialObserver -Klasse, die eine Standardimplementierung dieser erforderlichen Funktionalität bereitstellt.

public class SpatialObjectMeshObserver :
    BaseSpatialObserver,
    IMixedRealitySpatialAwarenessMeshObserver,
    IMixedRealityCapabilityCheck
{ }

Hinweis

Die IMixedRealityCapabilityCheck -Schnittstelle wird von der SpatialObjectMeshObserver -Klasse verwendet, um anzugeben, dass sie Unterstützung für die SpatialAwarenessMesh-Funktion bietet.

Anwenden des MixedRealityDataProvider-Attributs

Ein wichtiger Schritt beim Erstellen eines Spatial Awareness-Datenanbieters ist das Anwenden des MixedRealityDataProvider Attributs auf die -Klasse. Dieser Schritt ermöglicht das Festlegen des Standardprofils und der Plattform(en) für den Datenanbieter, wenn sie im Profil "Spatial Awareness" sowie "Name", "Ordnerpfad" und mehr ausgewählt sind.

[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
{ }

Implementieren der IMixedRealityDataProvider-Methoden

Nachdem die -Klasse definiert wurde, besteht der nächste Schritt darin, die Implementierung der IMixedRealityDataProvider Schnittstelle bereitzustellen.

Hinweis

Die BaseSpatialObserver -Klasse stellt über die BaseService -Klasse nur leere Implementierungen für IMixedRealityDataProvider Methoden bereit. Die Details dieser Methoden sind in der Regel datenanbieterspezifisch.

Die Methoden, die vom Datenanbieter implementiert werden sollten, sind:

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

Implementieren der Datenanbieterlogik

Der nächste Schritt besteht darin, die Logik des Datenanbieters hinzuzufügen, indem Sie die spezifische Datenanbieterschnittstelle implementieren, z. B IMixedRealitySpatialAwarenessMeshObserver. . Dieser Teil des Datenanbieters ist in der Regel plattformspezifisch.

Benachrichtigungen zu Beobachtungsänderungen

Damit Anwendungen auf Änderungen im Verständnis der Umgebung des Geräts reagieren können, löst der Datenanbieter Benachrichtigungsereignisse aus, wie in der IMixedRealitySpatialAwarenessObservationtHandler<T> Schnittstelle definiert.

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

Der folgende Code aus den Beispielen veranschaulicht das SpatialObjectMeshObserver Auslösen und Ereignis beim Hinzufügen von Mesh-Daten.

// 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;
}

Hinweis

Die SpatialObjectMeshObserver -Klasse löst keine Ereignisse aus OnObservationUpdated , da das 3D-Modell nur einmal geladen wird. Die Implementierung in der WindowsMixedRealitySpatialMeshObserver -Klasse bietet ein Beispiel für das Auslösen eines Ereignisses OnObservationUpdated für ein beobachtetes Gitter.

Hinzufügen der Unity Profiler-Instrumentierung

Die Leistung ist in Mixed Reality-Anwendungen von entscheidender Bedeutung. Jede Komponente verursacht einen gewissen Mehraufwand, für den Anwendungen verantwortlich sind. Zu diesem Zweck ist es wichtig, dass alle Spatial Awareness-Datenanbieter Unity Profiler-Instrumentierung in der inneren Schleife und häufig verwendete Codepfade enthalten.

Es wird empfohlen, das von MRTK verwendete Muster bei der Instrumentierung benutzerdefinierter Anbieter zu implementieren.

        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.
            }
        }

Hinweis

Der Name, der zum Identifizieren des Profilermarkers verwendet wird, ist willkürlich. MRTK verwendet das folgende Muster.

"[product] className.methodName – optionaler Hinweis"

Es wird empfohlen, dass benutzerdefinierte Datenanbieter ein ähnliches Muster verfolgen, um die Identifizierung bestimmter Komponenten und Methoden beim Analysieren von Ablaufverfolgungen zu vereinfachen.

Erstellen des Profils und des Inspektors

In Mixed Reality Toolkit werden Datenanbieter mithilfe von Profilen konfiguriert.

Definieren des Profils

Profilinhalte sollten die verfügbaren Eigenschaften des Datenanbieters Spiegel (z. B. Updateintervall). Alle benutzerdefinierbaren Eigenschaften, die in jeder Schnittstelle definiert sind, sollten im Profil enthalten sein.

Basisklassen werden empfohlen, wenn ein neuer Datenanbieter einen vorhandenen Anbieter erweitert. Beispielsweise erweitert die SpatialObjectMeshObserverProfileMixedRealitySpatialAwarenessMeshObserverProfile , damit Kunden ein 3D-Modell bereitstellen können, das als Umgebungsdaten verwendet werden kann.

[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;
}

Das CreateAssetMenu Attribut kann auf die Profilklasse angewendet werden, damit Kunden ein Profil instance erstellen können, indem Sie das MenüRessourcen>erstellen>Mixed Reality Toolkitprofile>verwenden.

Implementieren des Inspektors

Profilinspektoren sind die Benutzeroberfläche zum Konfigurieren und Anzeigen von Profilinhalten. Jeder Profilinspektor sollte die BaseMixedRealityToolkitConfigurationProfileInspector -Klasse erweitern.

Das CustomEditor Attribut informiert Unity über den Typ des Medienobjekts, für das der Inspektor gilt.

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

Erstellen von Assemblydefinitionen

Mixed Reality Toolkit verwendet Assemblydefinitionsdateien (.asmdef), um Abhängigkeiten zwischen Komponenten anzugeben und Unity bei der Reduzierung der Kompilierungszeit zu unterstützen.

Es wird empfohlen, Assemblydefinitionsdateien für alle Datenanbieter und deren Editorkomponenten zu erstellen.

Bei Verwendung der Ordnerstruktur im vorherigen Beispiel wären zwei ASMDEF-Dateien für den Datenanbieter ContosoSpatialAwareness vorhanden.

Die erste Assemblydefinition ist für den Datenanbieter. In diesem Beispiel heißt es ContosoSpatialAwareness und befindet sich im Ordner ContosoSpatialAwareness des Beispiels. Diese Assemblydefinition muss eine Abhängigkeit von Microsoft.MixedReality.Toolkit und allen anderen Assemblys angeben, von denen sie abhängt.

Die ContosoInputEditor-Assemblydefinition gibt den Profilinspektor und den editorspezifischen Code an. Diese Datei muss sich im Stammordner des Editorcodes befinden. In diesem Beispiel befindet sich die Datei im Ordner ContosoSpatialAwareness\Editor . Diese Assemblydefinition enthält einen Verweis auf die ContosoSpatialAwareness-Assembly sowie folgendes:

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

Registrieren des Datenanbieters

Nach der Erstellung kann der Datenanbieter beim Spatial Awareness-System registriert werden, das in der Anwendung verwendet werden soll.

Auswählen des räumlichen Objektgitterbeobachters

Verpackung und Vertrieb

Datenanbieter, die als Komponenten von Drittanbietern verteilt werden, haben die spezifischen Details der Verpackung und Verteilung dem Wunsch des Entwicklers überlassen. Wahrscheinlich ist die gängigste Lösung das Generieren eines UNITY-Pakets und die Verteilung über den Unity Asset Store.

Wenn ein Datenanbieter als Teil des Microsoft Mixed Reality Toolkit-Pakets übermittelt und akzeptiert wird, packt und verteilt das Microsoft MRTK-Team ihn als Teil der MRTK-Angebote.

Weitere Informationen