Criando um provedor de dados do sistema de reconhecimento espacial — MRTK2

O sistema de Reconhecimento Espacial é um sistema extensível para fornecer aos aplicativos dados sobre ambientes do mundo real. Para adicionar suporte a uma nova plataforma de hardware ou a uma nova forma de dados de Reconhecimento Espacial, um provedor de dados personalizado pode ser necessário.

Este artigo descreve como criar provedores de dados personalizados, também chamados observadores espaciais, para o sistema de Reconhecimento Espacial. O código de exemplo mostrado aqui é da SpatialObjectMeshObserver implementação de classe que é útil para carregar dados de malha 3D no editor.

Observação

O código-fonte completo usado neste exemplo pode ser encontrado na Assets/MRTK/Providers/ObjectMeshObserver pasta .

Estrutura de namespace e pasta

Os provedores de dados podem ser distribuídos de duas maneiras:

  1. Complementos de terceiros
  2. Parte do Microsoft Realidade Misturada Toolkit

O processo de aprovação para envios de novos provedores de dados ao MRTK variará caso a caso e será comunicado no momento da proposta inicial. As propostas podem ser enviadas criando um novo problema de tipo de solicitação de recurso.

Complemento de terceiros

Namespace

Os provedores de dados devem ter um namespace para atenuar possíveis colisões de nome. É recomendável que o namespace inclua os seguintes componentes.

  • Nome da empresa que produz o complemento
  • Área do recurso

Por exemplo, um provedor de dados de Reconhecimento Espacial criado e enviado pela empresa Contoso pode ser "Contoso.MixedReality.Toolkit.SpatialAwareness".

Estrutura de pastas

É recomendável que o código-fonte para provedores de dados seja apresentado em uma hierarquia de pastas, conforme mostrado na imagem a seguir.

Estrutura de pasta de exemplo

Onde a pasta ContosoSpatialAwareness contém a implementação do provedor de dados, a pasta Editor contém o inspetor (e qualquer outro código específico do editor do Unity) e a pasta Perfis contém um ou mais objetos scriptáveis de perfil pré-fabricados.

Envio do MRTK

Namespace

Se um provedor de dados do sistema de reconhecimento espacial estiver sendo enviado ao repositório Realidade Misturada Toolkit, o namespace deverá começar com Microsoft.MixedReality.Toolkit (por exemplo: Microsoft.MixedReality.Toolkit.SpatialObjectMeshObserver)

e o código deve estar localizado em uma pasta abaixo de MRTK/Provedores (por exemplo: MRTK/Providers/ObjectMeshObserver).

Estrutura de pastas

Todo o código deve estar localizado em uma pasta abaixo de MRTK/Provedores (por exemplo: MRTK/Providers/ObjectMeshObserver).

Definir o objeto de dados espaciais

A primeira etapa na criação de um provedor de dados de Reconhecimento Espacial é determinar o tipo de dados (por exemplo, malhas ou planos) que ele fornecerá aos aplicativos.

Todos os objetos de dados espaciais devem implementar a IMixedRealitySpatialAwarenessObject interface .

A base Realidade Misturada Toolkit fornece os seguintes objetos espaciais que podem ser usados ou estendidos em novos provedores de dados.

Implementar o provedor de dados

Especificar herança de interface e/ou classe base

Todos os provedores de dados de Reconhecimento Espacial devem implementar a IMixedRealitySpatialAwarenessObserver interface , que especifica a funcionalidade mínima exigida pelo sistema de Reconhecimento Espacial. A base do MRTK inclui a BaseSpatialObserver classe que fornece uma implementação padrão dessa funcionalidade necessária.

public class SpatialObjectMeshObserver :
    BaseSpatialObserver,
    IMixedRealitySpatialAwarenessMeshObserver,
    IMixedRealityCapabilityCheck
{ }

Observação

A IMixedRealityCapabilityCheck interface é usada pela SpatialObjectMeshObserver classe para indicar que ela fornece suporte para a funcionalidade SpatialAwarenessMesh.

Aplicar o atributo MixedRealityDataProvider

Uma etapa fundamental na criação de um provedor de dados de Reconhecimento Espacial é aplicar o MixedRealityDataProvider atributo à classe . Esta etapa permite definir o perfil e as plataformas padrão para o provedor de dados, quando selecionado no perfil de Reconhecimento Espacial, bem como Nome, caminho da pasta e muito mais.

[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 os métodos IMixedRealityDataProvider

Depois que a classe tiver sido definida, a próxima etapa será fornecer a implementação da IMixedRealityDataProvider interface.

Observação

A BaseSpatialObserver classe , por meio da BaseService classe , fornece apenas implementações vazias para IMixedRealityDataProvider métodos. Os detalhes desses métodos geralmente são específicos do provedor de dados.

Os métodos que devem ser implementados pelo provedor de dados são:

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

Implementar a lógica do provedor de dados

A próxima etapa é adicionar a lógica do provedor de dados implementando a interface específica do provedor de dados, por exemplo IMixedRealitySpatialAwarenessMeshObserver. Essa parte do provedor de dados normalmente será específica da plataforma.

Notificações de alteração de observação

Para permitir que os aplicativos respondam a alterações na compreensão do ambiente do dispositivo, o provedor de dados gera eventos de notificação conforme definido na IMixedRealitySpatialAwarenessObservationtHandler<T> interface.

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

O código a seguir dos exemplos demonstra a SpatialObjectMeshObserver criação e o evento quando os dados de malha são adicionados.

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

Observação

A SpatialObjectMeshObserver classe não gera OnObservationUpdated eventos, pois o modelo 3D só é carregado uma vez. A implementação na WindowsMixedRealitySpatialMeshObserver classe fornece um exemplo de como gerar um OnObservationUpdated evento para uma malha observada.

Adicionar instrumentação do Unity Profiler

O desempenho é fundamental em aplicativos de realidade misturada. Cada componente adiciona alguma quantidade de sobrecarga para a qual os aplicativos devem ser contabilados. Para isso, é importante que todos os provedores de dados de reconhecimento espacial contenham instrumentação do Unity Profiler em loop interno e caminhos de código frequentemente utilizados.

É recomendável implementar o padrão utilizado pelo MRTK ao instrumentar provedores 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.
            }
        }

Observação

O nome usado para identificar o marcador do criador de perfil é arbitrário. O MRTK usa o padrão a seguir.

"[product] className.methodName - observação opcional"

É recomendável que os provedores de dados personalizados sigam um padrão semelhante para ajudar a simplificar a identificação de componentes e métodos específicos ao analisar rastreamentos.

Criar o perfil e o inspetor

No Realidade Misturada Toolkit, os provedores de dados são configurados usando perfis.

Definir o perfil

O conteúdo do perfil deve espelho as propriedades acessíveis do provedor de dados (por exemplo: intervalo de atualização). Todas as propriedades configuráveis do usuário definidas em cada interface devem estar contidas com o perfil.

As classes base serão incentivadas se um novo provedor de dados estender um provedor existente. Por exemplo, o SpatialObjectMeshObserverProfile estende o para permitir que os MixedRealitySpatialAwarenessMeshObserverProfile clientes forneçam um modelo 3D a ser usado como dados de ambiente.

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

O CreateAssetMenu atributo pode ser aplicado à classe de perfil para permitir que os clientes criem uma instância de perfil usando o menu Criar>Ativos> Realidade MisturadaPerfis do Kit de Ferramentas>.

Implementar o inspetor

Os inspetores de perfil são a interface do usuário para configurar e exibir o conteúdo do perfil. Cada inspetor de perfil deve estender a BaseMixedRealityToolkitConfigurationProfileInspector classe.

O CustomEditor atributo informa ao Unity o tipo de ativo ao qual o inspetor se aplica.

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

Criar definições de assembly

Realidade Misturada Toolkit usa arquivos de definição de assembly (.asmdef) para especificar dependências entre componentes, bem como para ajudar o Unity a reduzir o tempo de compilação.

É recomendável que os arquivos de definição de assembly sejam criados para todos os provedores de dados e seus componentes do editor.

Usando a estrutura de pastas no exemplo anterior, haveria dois arquivos .asmdef para o provedor de dados ContosoSpatialAwareness.

A primeira definição de assembly é para o provedor de dados. Para este exemplo, ele será chamado contosoSpatialAwareness e estará localizado na pasta ContosoSpatialAwareness do exemplo. Essa definição de assembly deve especificar uma dependência em Microsoft.MixedReality.Toolkit e quaisquer outros assemblies dos quais ela depende.

A definição do assembly ContosoInputEditor especificará o inspetor de perfil e qualquer código específico do editor. Esse arquivo deve estar localizado na pasta raiz do código do editor. Neste exemplo, o arquivo estará localizado na pasta ContosoSpatialAwareness\Editor . Essa definição de assembly conterá uma referência ao assembly ContosoSpatialAwareness, bem como:

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

Registrar o provedor de dados

Depois de criado, o provedor de dados pode ser registrado no sistema de Reconhecimento Espacial a ser usado no aplicativo.

Selecionando o observador de malha de objeto espacial

Empacotamento e distribuição

Os provedores de dados distribuídos como componentes de terceiros têm os detalhes específicos do empacotamento e da distribuição deixados à preferência do desenvolvedor. Provavelmente, a solução mais comum será gerar um .unitypackage e distribuir por meio do Unity Asset Store.

Se um provedor de dados for enviado e aceito como parte do pacote microsoft Realidade Misturada Toolkit, a equipe do Microsoft MRTK o empacotará e distribuirá como parte das ofertas do MRTK.

Confira também