Uzamsal bir tanıma sistem veri sağlayıcısı oluşturma

Uzamsal tanıma sistemi, gerçek dünya ortamları hakkında veri içeren uygulamalar sağlamak için genişletilebilir bir sistemdir. Yeni bir donanım platformu veya yeni bir uzamsal tanıma verileri formu için destek eklemek üzere özel bir veri sağlayıcısı gerekli olabilir.

Bu makalede, uzamsal algılama sistemi için uzamsal observers olarak da bilinen özel veri sağlayıcılarınınnasıl oluşturulacağı açıklanmaktadır. Burada gösterilen örnek kod, SpatialObjectMeshObserverSpatialObjectMeshObserverolan sınıf uygulamasıdır.

Not

Bu örnekte kullanılan tüm kaynak kodu Assets/MRTK/Providers/ObjectMeshObserver klasöründe bulunabilir.

Ad alanı ve klasör yapısı

Veri sağlayıcıları iki şekilde dağıtılabilir:

  1. Üçüncü taraf eklentileri
  2. Microsoft Mixed Reality araç seti 'nin bir parçası

Yeni veri sağlayıcılarının MRTK 'a gönderdikleri onay süreci, büyük/küçük harfe göre farklılık gösterir ve ilk teklifin anında iletilecektir. Teklifler, yeni bir özellik isteği türü sorunuoluşturularak gönderilebilir.

Üçüncü taraf eklentisi

Ad Alanı

Veri sağlayıcılarının olası ad çakışmalarını hafifletmek için bir ad alanına sahip olması gerekir. Ad alanının aşağıdaki bileşenleri içermesi önerilir.

  • Eklentiyi üreten şirket adı
  • Özellik alanı

Örneğin, contoso şirketi tarafından oluşturulan ve sevk edilen bir uzamsal tanıma veri sağlayıcısı "contoso. MixedReality. Toolkit. Spatıalawarlemi"olabilir.

Klasör yapısı

Veri sağlayıcılarının kaynak kodunun, aşağıdaki görüntüde gösterildiği gibi bir klasör hiyerarşisinde kullanıma hazır olması önerilir.

Örnek klasör yapısı

Contosospatıalawarçarpma klasörü, veri sağlayıcısı uygulamasını Içerdiğinde, Düzenleyici klasörü Inspector 'ı (ve diğer Unity düzenleyiciyle ilgili herhangi bir kodu) içerir ve profiller klasörü bir veya daha fazla önceden oluşturulmuş profil komut dosyası nesnesi içerir.

MRTK gönderimi

Ad Alanı

Uzamsal bir tanıma sistem veri sağlayıcısı karma gerçeklik araç seti deposunagönderiliyorsa , ad alanı Microsoft. mixedreality. Toolkit (ex: Microsoft. Mixedreality. Toolkit. SpatialObjectMeshObserver) ile başlamalıdır

kod, MRTK/sağlayıcılar altındaki bir klasörde bulunmalıdır (örn: mrtk/Providers/ObjectMeshObserver).

Klasör yapısı

Tüm kodun MRTK/sağlayıcılar altındaki bir klasörde bulunması gerekir (örn: MRTK/Providers/ObjectMeshObserver).

Uzamsal veri nesnesini tanımlama

Uzamsal bir tanıma veri sağlayıcısı oluşturmanın ilk adımı, uygulamalara sağlanacak olan veri türünü (örn: kafesler veya düzler) belirler.

Tüm uzamsal veri nesnelerinin arabirimini uygulaması gerekir IMixedRealitySpatialAwarenessObject .

Karma Gerçeklik araç seti temeli, yeni veri sağlayıcılarıyla kullanılabilecek ve genişletilebilen aşağıdaki uzamsal nesneleri sağlar.

Veri sağlayıcısını uygulama

Arabirim ve/veya temel sınıf devralma belirtin

Tüm uzamsal algılama verileri sağlayıcılarının, uzamsal algılama IMixedRealitySpatialAwarenessObserver sistemi için gereken en düşük işlevi belirten arabirimini uygulaması gerekir. MRTK Foundation, BaseSpatialObserver Bu gerekli işlevselliğin varsayılan bir uygulamasını sağlayan sınıfını içerir.

public class SpatialObjectMeshObserver :
    BaseSpatialObserver,
    IMixedRealitySpatialAwarenessMeshObserver,
    IMixedRealityCapabilityCheck
{ }

Not

IMixedRealityCapabilityCheckArabirim, SpatialObjectMeshObserver Spatıalawarenesskafesözelliği için destek sağladığını göstermek üzere sınıfı tarafından kullanılır.

MixedRealityDataProvider özniteliğini uygulama

Uzamsal bir tanıma veri sağlayıcısı oluşturma bölümünde temel bir adım, MixedRealityDataProvider özniteliğini sınıfına uygulamaktır. Bu adım, uzamsal tanıma profilinde seçildiğinde, ad, klasör yolu ve daha birçok veri sağlayıcısı için varsayılan profili ve platformu ayarlamaya izin verir.

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

IMixedRealityDataProvider yöntemlerini uygulama

Sınıf tanımlandıktan sonra, bir sonraki adım arabirimin uygulanmasını sağlamaktır IMixedRealityDataProvider .

Not

Sınıfı BaseSpatialObserver aracılığıyla sınıfı, BaseService Yöntemler için yalnızca boş bir uygulama sağlar IMixedRealityDataProvider . Bu yöntemlerin ayrıntıları genellikle veri sağlayıcısına özeldir.

Veri sağlayıcısı tarafından uygulanması gereken yöntemler şunlardır:

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

Veri sağlayıcısı mantığını uygulama

Bir sonraki adım, örneğin belirli veri sağlayıcısı arabirimini uygulayarak veri sağlayıcının mantığını eklemektir IMixedRealitySpatialAwarenessMeshObserver . Veri sağlayıcısının bu bölümü, genellikle platforma özgüdür.

Değişiklik bildirimlerini gözlemme

Uygulamaların, cihazın ortamı anlama alanındaki değişikliklere yanıt vermesini sağlamak için, veri sağlayıcısı arabirimde tanımlanan bildirim olaylarını başlatır IMixedRealitySpatialAwarenessObservationtHandler<T> .

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

Örneklerden aşağıdaki kod, SpatialObjectMeshObserver kafes verileri eklendiğinde, oluşturma ve olay gösterir.

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

Not

SpatialObjectMeshObserverOnObservationUpdated 3B model yalnızca bir kez yüklendiği için sınıf olayları oluşturmaz. Sınıfındaki uygulama, WindowsMixedRealitySpatialMeshObserver gözlemlenen bir ağ için bir olay oluşturma örneği sağlar OnObservationUpdated .

Unity profil oluşturucu araçları ekleme

Karma gerçeklik uygulamalarında performans kritik öneme sahiptir. Her bileşen, uygulamaların hesaba sahip olması gereken miktarda ek yük ekler. Bu uçta, tüm uzamsal tanıma veri sağlayıcılarının, iç döngüde Unity Profiler araçları ve sık kullanılan kod yolları içermesi önemlidir.

Özel sağlayıcılar düzenlenirken MRTK tarafından kullanılan düzenin uygulanması önerilir.

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

Not

Profil Oluşturucu işaretçisini tanımlamak için kullanılan ad rastgele bir addır. MRTK aşağıdaki kalıbı kullanır.

"[Product] className. methodName-isteğe bağlı Note"

Özel veri sağlayıcılarının, izlemeleri analiz edilirken belirli bileşen ve yöntemlerin tanımlanmasını basitleştirmeye yardımcı olması için benzer bir model izlemesi önerilir.

Profil ve Inspector oluşturma

Karma Gerçeklik araç setinde, veri sağlayıcıları profillerkullanılarak yapılandırılır.

Profili tanımlama

Profil içeriği, veri sağlayıcısının erişilebilir özelliklerini yansıtmalıdır (örn: güncelleştirme aralığı). Her arabirimde tanımlanan kullanıcı yapılandırılabilir özelliklerinin tümü, profille birlikte bulunmalıdır.

Yeni bir veri sağlayıcısı var olan bir sağlayıcıyı genişletiğinden, temel sınıflar önerilir. Örneğin,, SpatialObjectMeshObserverProfileMixedRealitySpatialAwarenessMeshObserverProfile müşterilerin ortam verileri olarak kullanılacak bir 3B model sağlamasına olanak tanımak için öğesini genişletir.

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

CreateAssetMenuÖzniteliği, müşterilerin CreateAssetMenu>>>>>> Oluştur menüsünü kullanarak bir profil örneği oluşturmasını sağlamak için profil sınıfına uygulanabilir.

Inspector 'ı uygulama

Profil denetçiler, profil içeriklerini yapılandırmak ve görüntülemek için kullanıcı arabirimidir. Her profil denetçisi, sınıfını genişletmelidir BaseMixedRealityToolkitConfigurationProfileInspector .

CustomEditorÖznitelik, Unity 'nin Inspector 'ın uyguladığı varlık türünü bilgilendirir.

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

Derleme tanımları oluştur

Karma Gerçeklik araç seti, bileşenler arasındaki bağımlılıkları belirtmek ve derleme süresini azaltmak için Unity 'ye yardımcı olmak üzere derleme tanımı (. asmdef) dosyalarını kullanır.

Tüm veri sağlayıcıları ve bunların düzenleyici bileşenleri için derleme tanımı dosyalarının oluşturulması önerilir.

Önceki örnekte yer alan klasör yapısını kullanarak Contosospatialawartıma veri sağlayıcısı için iki. asmdef dosyası vardır.

İlk derleme tanımı veri sağlayıcısına yöneliktir. Bu örnekte, Contosospatialawarlede çağrılır ve örneğin contosospatıalawarlei klasöründe yer alır. Bu derleme tanımı Microsoft. MixedReality. Toolkit ve bağımlı olduğu diğer derlemeler için bir bağımlılık belirtmelidir.

Contosoınputeditor derleme tanımı profil denetçisini ve düzenleyiciye özgü kodu belirtir. Bu dosya, düzenleyici kodunun kök klasöründe bulunmalıdır. Bu örnekte, dosya Contosospatıalawareness\editor klasöründe yer alır. Bu derleme tanımı, Contosospatıalawarçarpme derlemesine ve şu şekilde bir başvuru içerecektir:

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

Veri sağlayıcıyı kaydetme

Veri sağlayıcısı oluşturulduktan sonra, uygulamada kullanılacak olan uzamsal tanıma sistemine kaydedilebilir.

Uzamsal nesne kafes gözlemci seçiliyor

Paketleme ve dağıtım

Üçüncü taraf bileşenler olarak dağıtılan veri sağlayıcıları, paketleme ve dağıtımla ilgili belirli ayrıntıları geliştiricinin tercihlerine bırakmaktadır. Büyük olasılıkla en yaygın çözüm bir .unitypackage oluşturmak ve Unity Varlık Deposu aracılığıyla dağıtmaktır.

Bir veri sağlayıcısı gönderilirse ve Microsoft Mixed Reality Toolkit paketinin bir parçası olarak kabul edilirse, Microsoft MRTK ekibi bunu MRTK tekliflerinin bir parçası olarak paketler ve dağıtır.

Ayrıca bkz.