Översikt över Runtime SDK
Det här avsnittet innehåller en översikt på hög nivå över Object Anchors Runtime SDK, som används för att identifiera objekt med hjälp av en Object Anchors-modell. Du får en förståelse för hur ett objekt representeras och vad de olika komponenterna används till.
Alla typer som beskrivs nedan finns i något av följande namnområden: Microsoft.Azure.ObjectAnchors, Microsoft.Azure.ObjectAnchors.Diagnostics och Microsoft.Azure.ObjectAnchors.SpatialGraph.
Typer
ObjectModel
En ObjectModel representerar ett fysiskt objekts geometri och kodar nödvändiga parametrar för identifiering och poseuppskattning. Den måste skapas med hjälp av tjänsten Object Anchors. Sedan kan ett program läsa in den genererade modellfilen med hjälp av API:et Object Anchors och köra frågor mot det inbäddade nätet i modellen för visualisering.
ObjectSearchArea
Ett ObjectSearchArea anger det utrymme som ska sökas efter ett eller flera objekt. Det definieras av ett rumsligt grafnod-ID och rumsliga gränser i koordinatsystemet som representeras av det rumsliga grafnod-ID:t. Object Anchors Runtime SDK stöder fyra typer av gränser, nämligen visningsfält, avgränsningsruta, sfär och en plats.
AccountInformation
En AccountInformation lagrar ID, nyckel och domän för ditt Azure Object Anchors-konto.
ObjectAnchorsSession
En ObjectAnchorsSession representerar en Azure Object Anchors-session som används för att skapa ObjectObserver-instanser som används för att identifiera objekt i den fysiska världen.
ObjectObserver
En ObjectObserver läser in objektmodeller, identifierar deras instanser och rapporterar 6-DoF-poser för varje instans i HoloLens-koordinatsystemet.
Även om alla objektmodeller eller instanser skapas från en övervakare är deras livslängd oberoende. Ett program kan ta bort en övervakare och fortsätta att använda objektmodellen eller instansen.
ObjectQuery
En ObjectQuery talar om för en objektobservatör hur objekt i en viss modell ska hittas. Den innehåller följande justerbara parametrar, vars standardvärden kan hämtas från en objektmodell.
MinSurfaceCoverage
Egenskapen MinSurfaceCoverage anger värdet för att betrakta en instans som identifierad.
För varje objektkandidat beräknar en övervakare förhållandet mellan överlappande ytor mellan transformerad objektmodell och scen. Sedan rapporterar den kandidaten till programmet endast när täckningsförhållandet är över ett visst tröskelvärde.
IsExpectedToBeStandingOnGroundPlane
Egenskapen IsExpectedToBeStandingOnGroundPlane anger om målobjektet förväntas stå på markplanet.
Ett markplan är det lägsta vågräta golvet i sökområdet. Det ger goda begränsningar för möjliga objektpositioner. Om du aktiverar den här flaggan vägleder du observatören att uppskatta posen i ett begränsat utrymme och kan förbättra noggrannheten. Den här parametern ignoreras om modellen inte ska stå på markplanet.
ExpectedMaxVerticalOrientationInDegrees
Egenskapen ExpectedMaxVerticalOrientationInDegrees anger den förväntade maximala vinkeln i grader mellan uppriktningen för en objektinstans och gravitationen.
Den här parametern ger en annan begränsning för uppriktningen för en uppskattad pose. Om ett objekt till exempel är rätt kan den här parametern vara 0. Objektfästpunkter ska inte identifiera objekt som skiljer sig från modellen. Om en modell är uppåtriktad identifierar den inte en instans som har lagts ned åt sidan. En ny modell skulle användas för sidolayout. Samma regel gäller för artikulering.
MaxScaleChange
Egenskapen MaxScaleChange anger den maximala objektskalningsändringen (inom 0 ~ 1) när det gäller rumslig mappning. Den uppskattade skalan tillämpas på omvandlade objekthörn centrerad efter ursprung och axeljusterad. Uppskattade skalor kanske inte är den faktiska skalan mellan en CAD-modell och dess fysiska representation, men vissa värden som gör att appen kan återge en objektmodell nära rumslig mappning på det fysiska objektet.
SearchAreas
Egenskapen SearchAreas anger en matris med rumsliga gränser där objekt ska hittas.
Övervakaren söker efter objekt i unionsområdet för alla sökområden som anges i en fråga. I den här versionen returnerar vi högst ett objekt med högsta konfidens för att minska svarstiden.
ObjectInstance
En ObjectInstance representerar en hypotetisk position där en instans av en viss modell kan finnas i HoloLens-koordinatsystemet. Varje instans levereras med en SurfaceCoverage
egenskap som anger hur bra den uppskattade posen är.
En instans skapas genom att anropa ObjectObserver.DetectAsync
metoden och uppdateras sedan automatiskt i bakgrunden när den är vid liv. Ett program kan lyssna på tillståndsändringshändelsen på en viss instans eller ändra spårningsläget för att pausa/återuppta uppdateringen. En instans tas automatiskt bort från övervakaren när spårningen går förlorad.
ObjectDiagnosticsSession
ObjectDiagnosticSession registrerar diagnostik och skriver data till ett arkiv.
Ett diagnostikarkiv innehåller scenpunktsmolnet, observatörens status och information om modellerna. Den här informationen är användbar för att identifiera möjliga körningsproblem. Mer information finns i vanliga frågor och svar.
Användning och information om Runtime SDK
Det här avsnittet bör ge dig grunderna i hur du använder Runtime SDK. Det bör ge dig tillräckligt med kontext för att bläddra igenom exempelprogrammen för att se hur Object Anchors används holistiskt.
Initiering
Program måste anropa API:et ObjectObserver.IsSupported()
för att avgöra om Object Anchors stöds på enheten innan de använder den. Om API:et ObjectObserver.IsSupported()
returnerar false
kontrollerar du att programmet har aktiverat spatialPerception-funktionen och\eller uppgradera till det senaste HoloLens-operativsystemet.
using Microsoft.Azure.ObjectAnchors;
if (!ObjectObserver.IsSupported())
{
// Handle the error
}
// This call should grant the access we need.
ObjectObserverAccessStatus status = await ObjectObserver.RequestAccessAsync();
if (status != ObjectObserverAccessStatus.Allowed)
{
// Handle the error
}
Därefter skapar programmet en objektövervakare och läser in de modeller som genereras av objektfästpunktsmodellens konverteringstjänst.
using Microsoft.Azure.ObjectAnchors;
// Note that you need to provide the Id, Key and Domain for your Azure Object
// Anchors account.
Guid accountId = new Guid("[your account id]");
string accountKey = "[your account key]";
string accountDomain = "[your account domain]";
AccountInformation accountInformation = new AccountInformation(accountId, accountKey, accountDomain);
ObjectAnchorsSession session = new ObjectAnchorsSession(accountInformation);
ObjectObserver observer = session.CreateObjectObserver();
// Load a model into a byte array. The model could be a file, an embedded
// resource, or a network stream.
byte[] modelAsBytes;
ObjectModel model = await observer.LoadObjectModelAsync(modelAsBytes);
// Note that after a model is loaded, its vertices and normals are transformed
// into a centered coordinate system for the ease of computing the object pose.
// The rigid transform can be retrieved through the `OriginToCenterTransform`
// property.
Programmet skapar en fråga för att identifiera instanser av modellen inom ett utrymme.
#if WINDOWS_UWP || DOTNETWINRT_PRESENT
#define SPATIALCOORDINATESYSTEM_API_PRESENT
#endif
using Microsoft.Azure.ObjectAnchors;
using Microsoft.Azure.ObjectAnchors.SpatialGraph;
using Microsoft.Azure.ObjectAnchors.Unity;
using UnityEngine;
// Get the coordinate system.
SpatialGraphCoordinateSystem? coordinateSystem = null;
#if SPATIALCOORDINATESYSTEM_API_PRESENT
SpatialCoordinateSystem worldOrigin = ObjectAnchorsWorldManager.WorldOrigin;
if (worldOrigin != null)
{
coordinateSystem = await Task.Run(() => worldOrigin.TryToSpatialGraph());
}
#endif
if (!coordinateSystem.HasValue)
{
Debug.LogError("no coordinate system?");
return;
}
// Get the search area.
SpatialFieldOfView fieldOfView = new SpatialFieldOfView
{
Position = Camera.main.transform.position.ToSystem(),
Orientation = Camera.main.transform.rotation.ToSystem(),
FarDistance = 4.0f, // Far distance in meters of object search frustum.
HorizontalFieldOfViewInDegrees = 75.0f, // Horizontal field of view in
// degrees of object search frustum.
AspectRatio = 1.0f // Aspect ratio (horizontal / vertical) of object search
// frustum.
};
ObjectSearchArea searchArea = ObjectSearchArea.FromFieldOfView(coordinateSystem.Value, fieldOfView);
// Optionally change the parameters, otherwise use the default values embedded
// in the model.
ObjectQuery query = new ObjectQuery(model);
query.MinSurfaceCoverage = 0.2f;
query.ExpectedMaxVerticalOrientationInDegrees = 1.5f;
query.MaxScaleChange = 0.1f;
query.SearchAreas.Add(searchArea);
// Detection could take a while, so we run it in a background thread.
IReadOnlyList<ObjectInstance> detectedObjects = await observer.DetectAsync(query);
Som standard spåras varje identifierad instans automatiskt av övervakaren. Vi kan också ändra dessa instanser genom att ändra deras spårningsläge eller lyssna på deras tillstånd ändrade händelse.
using Microsoft.Azure.ObjectAnchors;
foreach (ObjectInstance instance in detectedObjects)
{
// Supported modes:
// "LowLatencyCoarsePosition" - Consumes less CPU cycles thus fast to
// update the state.
// "HighLatencyAccuratePosition" - Uses the device's camera and consumes more CPU
// cycles thus potentially taking longer
// time to update the state.
// "Paused" - Stops to update the state until mode
// changed to low or high.
instance.Mode = ObjectInstanceTrackingMode.LowLatencyCoarsePosition;
// Listen to state changed event on this instance.
instance.Changed += InstanceChangedHandler;
// Optionally dispose an instance if not interested in it.
// instance.Dispose();
}
I den tillstånds ändrade händelsen kan vi fråga det senaste tillståndet eller ta bort en instans om den förlorade spårningen.
using Microsoft.Azure.ObjectAnchors;
void InstanceChangedHandler(object sender, ObjectInstanceChangedEventArgs args)
{
// Try to query the current instance state.
ObjectInstanceState state = sender.TryGetCurrentState();
if (state != null)
{
// Process latest state.
// An object pose includes rotation and translation, applied in
// the same order to the object model in the centered coordinate system.
}
else
{
// This object instance is lost for tracking, and will never be recovered.
// The caller can detach the Changed event handler from this instance
// and dispose it.
}
}
Ett program kan också registrera en eller flera diagnostiksessioner för felsökning offline.
using Microsoft.Azure.ObjectAnchors;
using Microsoft.Azure.ObjectAnchors.Diagnostics;
string diagnosticsFolderPath = Windows.Storage.ApplicationData.Current.TemporaryFolder.Path;
const uint maxSessionSizeInMegaBytes = uint.MaxValue;
// Recording starts on the creation of a diagnostics session.
ObjectDiagnosticsSession diagnostics = new ObjectDiagnosticsSession(observer, maxSessionSizeInMegaBytes);
// Wait for the observer to do a job.
// Application can report some **pseudo ground-truth** pose for an instance
// acquired from other means.
diagnostics.ReportActualInstanceLocation(instance, coordinateSystem, Vector3.Zero, Quaternion.Identity);
// Close a session and write the diagnostics into an archive at specified location.
await diagnostics.CloseAsync(System.IO.Path.Combine(diagnosticsFolderPath, "diagnostics.zip"));
Slutligen släpper vi resurser genom att ta bort alla objekt.
using Microsoft.Azure.ObjectAnchors;
foreach (ObjectInstance instance in activeInstances)
{
instance.Changed -= InstanceChangedHandler;
instance.Dispose();
}
model.Dispose();
observer.Dispose();
Feedback
https://aka.ms/ContentUserFeedback.
Kommer snart: Under hela 2024 kommer vi att fasa ut GitHub-problem som feedbackmekanism för innehåll och ersätta det med ett nytt feedbacksystem. Mer information finns i:Skicka och visa feedback för