Tworzenie dostawcy danych systemu rozpoznawania przestrzennego — MRTK2

System rozpoznawania przestrzennego to rozszerzalny system zapewniający aplikacjom dane dotyczące rzeczywistych środowisk. Aby dodać obsługę nowej platformy sprzętowej lub nowej formy danych świadomości przestrzennej, może być wymagany niestandardowy dostawca danych.

W tym artykule opisano sposób tworzenia niestandardowych dostawców danych, nazywanych również obserwatorami przestrzennymi, dla systemu rozpoznawania przestrzennego. Przykładowy kod pokazany tutaj pochodzi z SpatialObjectMeshObserver implementacji klasy, która jest przydatna do ładowania danych siatki 3D w edytorze.

Uwaga

Kompletny kod źródłowy używany w tym przykładzie można znaleźć w folderze Assets/MRTK/Providers/ObjectMeshObserver .

Przestrzeń nazw i struktura folderów

Dostawcy danych mogą być dystrybuowani na jeden z dwóch sposobów:

  1. Dodatki innych firm
  2. Część zestawu narzędzi Microsoft Mixed Reality Toolkit

Proces zatwierdzania przesyłania nowych dostawców danych do zestawu narzędzi MRTK będzie się różnić w zależności od przypadku i zostanie przekazany w momencie pierwotnego wniosku. Propozycje można przesłać, tworząc nowy problem z typem żądania funkcji.

Dodatek innej firmy

Obszaru nazw

Dostawcy danych muszą mieć przestrzeń nazw, aby wyeliminować potencjalne kolizje nazw. Zaleca się, aby przestrzeń nazw zawierała następujące składniki.

  • Nazwa firmy produkująca dodatek
  • Obszar funkcji

Na przykład dostawca danych rozpoznawania przestrzennego utworzony i dostarczony przez firmę Contoso może mieć wartość "Contoso.MixedReality.Toolkit.SpatialAwareness".

Struktura folderów

Zaleca się, aby kod źródłowy dostawców danych został ułożone w hierarchii folderów, jak pokazano na poniższej ilustracji.

Przykładowa struktura folderów

Gdzie folder ContosoSpatialAwareness zawiera implementację dostawcy danych, folder Editor zawiera inspektora (i dowolny inny kod specyficzny dla edytora aparatu Unity), a folder Profiles zawiera jeden lub więcej wstępnie utworzonych obiektów skryptowych profilu.

Przesyłanie zestawu narzędzi MRTK

Obszaru nazw

Jeśli dostawca danych systemu rozpoznawania przestrzennego jest przesyłany do repozytorium Mixed Reality Toolkit, przestrzeń nazw musi zaczynać się od microsoft.MixedReality.Toolkit (np. Microsoft.MixedReality.Toolkit.SpatialObjectMeshObserver)

kod powinien znajdować się w folderze poniżej zestawu narzędzi MRTK/Providers (np. MRTK/Providers/ObjectMeshObserver).

Struktura folderów

Cały kod powinien znajdować się w folderze poniżej zestawu narzędzi MRTK/Providers (np. MRTK/Providers/ObjectMeshObserver).

Definiowanie obiektu danych przestrzennych

Pierwszym krokiem tworzenia dostawcy danych rozpoznawania przestrzennego jest określenie typu danych (np. siatki lub płaszczyzny), które będą zapewniane aplikacjom.

Wszystkie obiekty danych przestrzennych muszą implementować IMixedRealitySpatialAwarenessObject interfejs.

Podstawy zestawu narzędzi Mixed Reality udostępniają następujące obiekty przestrzenne, których można używać lub rozszerzać u nowych dostawców danych.

Implementowanie dostawcy danych

Określanie dziedziczenia interfejsu i/lub klasy bazowej

Wszyscy dostawcy danych rozpoznawania przestrzennego muszą zaimplementować IMixedRealitySpatialAwarenessObserver interfejs, który określa minimalną funkcjonalność wymaganą przez system rozpoznawania przestrzennego. Podstawy zestawu narzędzi MRTK obejmują klasę BaseSpatialObserver , która zapewnia domyślną implementację tej wymaganej funkcjonalności.

public class SpatialObjectMeshObserver :
    BaseSpatialObserver,
    IMixedRealitySpatialAwarenessMeshObserver,
    IMixedRealityCapabilityCheck
{ }

Uwaga

Interfejs IMixedRealityCapabilityCheck jest używany przez klasę SpatialObjectMeshObserver , aby wskazać, że zapewnia obsługę funkcji SpatialAwarenessMesh.

Stosowanie atrybutu MixedRealityDataProvider

Kluczowym krokiem tworzenia dostawcy danych rozpoznawania przestrzennego jest zastosowanie atrybutu MixedRealityDataProvider do klasy. Ten krok umożliwia ustawienie domyślnych profilów i platform dostawcy danych, po wybraniu w profilu świadomości przestrzennej, a także nazwy, ścieżki folderu i nie tylko.

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

Implementowanie metod IMixedRealityDataProvider

Po zdefiniowaniu klasy następnym krokiem jest zapewnienie implementacji interfejsu IMixedRealityDataProvider .

Uwaga

Klasa BaseSpatialObserver za pośrednictwem BaseService klasy udostępnia tylko puste implementacje metod IMixedRealityDataProvider . Szczegóły tych metod są zwykle specyficzne dla dostawcy danych.

Metody, które powinny być implementowane przez dostawcę danych, to:

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

Implementowanie logiki dostawcy danych

Następnym krokiem jest dodanie logiki dostawcy danych przez zaimplementowanie określonego interfejsu dostawcy danych, na przykład IMixedRealitySpatialAwarenessMeshObserver. Ta część dostawcy danych będzie zwykle specyficzna dla platformy.

Powiadomienia o zmianie obserwacji

Aby umożliwić aplikacjom reagowanie na zmiany w zrozumieniu środowiska przez urządzenie, dostawca danych zgłasza zdarzenia powiadomień zgodnie z definicją w interfejsie IMixedRealitySpatialAwarenessObservationtHandler<T> .

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

Poniższy kod z SpatialObjectMeshObserver przykładów przedstawia wywoływanie i zdarzenie podczas dodawania danych siatki.

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

Uwaga

Klasa SpatialObjectMeshObserver nie zgłasza OnObservationUpdated zdarzeń, ponieważ model 3D jest ładowany tylko raz. Implementacja w WindowsMixedRealitySpatialMeshObserver klasie stanowi przykład podniesienia OnObservationUpdated zdarzenia dla obserwowanej siatki.

Dodawanie instrumentacji profilera aparatu Unity

Wydajność ma kluczowe znaczenie w aplikacjach rzeczywistości mieszanej. Każdy składnik dodaje pewną ilość narzutów, dla których aplikacje muszą być uwzględniane. W tym celu ważne jest, aby wszyscy dostawcy danych świadomości przestrzennej zawierali instrumentację profilera aparatu Unity w pętli wewnętrznej i często używane ścieżki kodu.

Zaleca się zaimplementowanie wzorca używanego przez zestaw narzędzi MRTK podczas instrumentowania dostawców niestandardowych.

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

Uwaga

Nazwa używana do identyfikowania znacznika profilera jest dowolna. Zestaw narzędzi MRTK używa następującego wzorca.

"[product] className.methodName — opcjonalna uwaga"

Zaleca się, aby niestandardowi dostawcy danych postępowali zgodnie z podobnym wzorcem, aby ułatwić identyfikację określonych składników i metod podczas analizowania śladów.

Tworzenie profilu i inspektora

W Mixed Reality Toolkit dostawcy danych są skonfigurowani przy użyciu profilów.

Definiowanie profilu

Zawartość profilu powinna odzwierciedlać dostępne właściwości dostawcy danych (np. interwał aktualizacji). Wszystkie konfigurowalne właściwości użytkownika zdefiniowane w każdym interfejsie powinny być zawarte w profilu.

Klasy bazowe są zachęcane, jeśli nowy dostawca danych rozszerza istniejącego dostawcę. Na przykład rozszerzenie SpatialObjectMeshObserverProfileMixedRealitySpatialAwarenessMeshObserverProfile , aby umożliwić klientom zapewnienie modelu 3D, który będzie używany jako dane środowiska.

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

Atrybut CreateAssetMenu można zastosować do klasy profilu, aby umożliwić klientom tworzenie wystąpienia profilu przy użyciu menu Tworzenie>zasobów>Mixed Reality Profile zestawu narzędzi>.

Implementowanie inspektora

Inspektorzy profilów to interfejs użytkownika służący do konfigurowania i wyświetlania zawartości profilu. Każdy inspektor profilu powinien rozszerzyć klasę BaseMixedRealityToolkitConfigurationProfileInspector .

Atrybut CustomEditor informuje aparat Unity o typie zasobu, do którego ma zastosowanie inspektor.

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

Tworzenie definicji zestawów

Mixed Reality Toolkit używa plików definicji zestawu (asmdef) do określania zależności między składnikami, a także pomaga aparatu Unity w skróceniu czasu kompilacji.

Zaleca się utworzenie plików definicji zestawu dla wszystkich dostawców danych i ich składników edytora.

Korzystając ze struktury folderów we wcześniejszym przykładzie, istnieją dwa pliki asmdef dla dostawcy danych ContosoSpatialAwareness.

Pierwsza definicja zestawu dotyczy dostawcy danych. W tym przykładzie zostanie ona nazwana ContosoSpatialAwareness i będzie znajdować się w folderze ContosoSpatialAwareness w przykładzie. Ta definicja zestawu musi określać zależność od zestawu Microsoft.MixedReality.Toolkit i innych zestawów, od których zależy.

Definicja zestawu ContosoInputEditor określi inspektora profilu i dowolny kod specyficzny dla edytora. Ten plik musi znajdować się w folderze głównym kodu edytora. W tym przykładzie plik zostanie umieszczony w folderze ContosoSpatialAwareness\Editor . Ta definicja zestawu będzie zawierać odwołanie do zestawu ContosoSpatialAwareness, a także:

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

Rejestrowanie dostawcy danych

Po utworzeniu dostawca danych można zarejestrować w systemie rozpoznawania przestrzennego, który będzie używany w aplikacji.

Wybieranie obserwatora siatki obiektów przestrzennych

Pakowanie i dystrybucja

Dostawcy danych, którzy są dystrybuowani jako składniki innych firm, mają szczegółowe informacje na temat pakowania i dystrybucji pozostawione preferencjom dewelopera. Prawdopodobnie najbardziej typowym rozwiązaniem będzie wygenerowanie pliku unitypackage i rozpowszechnianie za pośrednictwem magazynu zasobów aparatu Unity.

Jeśli dostawca danych zostanie przesłany i zaakceptowany w ramach pakietu Microsoft Mixed Reality Toolkit, zespół MRTK firmy Microsoft spakuje i rozpowszechnia go w ramach ofert MRTK.

Zobacz też