Přehled sady SDK modulu runtime
V této části najdete podrobný přehled sady SDK ukotvení objektů, které se používají ke zjišťování objektů pomocí modelu ukotvení objektů. Získáte přehled o tom, jak je objekt reprezentován a k čemu se používají různé komponenty.
Všechny níže popsané typy lze najít v jednom z následujících oborů názvů: Microsoft. Azure. ObjectAnchors, Microsoft. Azure. ObjectAnchors. Diagnostics a Microsoft. Azure. ObjectAnchors. SpatialGraph.
Typy
ObjectModel
ObjectModel představuje geometrii fyzických objektů a kóduje potřebné parametry pro detekci a odhad pozice. Musí být vytvořen pomocí služby ukotvení objektů. Aplikace pak může načíst vygenerovaný soubor modelu pomocí rozhraní API kotev objektu a zadat dotaz na síť vloženou v tomto modelu pro vizualizaci.
ObjectSearchArea
ObjectSearchArea určuje místo pro hledání jednoho nebo více objektů. Je definovaný ID uzlu prostorového grafu a prostorové meze v systému souřadnic reprezentované ID uzlu prostorového grafu. Sada SDK ukotvení objektů podporuje čtyři typy hranic, konkrétně pole pole zobrazení, ohraničujícího pole, koule a umístění.
AccountInformation
AccountInformation ukládá ID, klíč a doménu pro účet kotev objektů Azure.
ObjectAnchorsSession
ObjectAnchorsSession představuje relaci kotev objektů Azure, která se používá k vytváření instancí ObjectObserver používaných k detekci objektů ve fyzickém světě.
ObjectObserver
ObjectObserver načítá objektové modely, detekuje jejich instance a sestavy 6 – DoF představuje každou instanci v HoloLens souřadnicovém systému.
I když se z pozorovatele vytvoří libovolný objektový model nebo instance, jejich životnost je nezávislá. Aplikace může odstranit pozorovatele a pokračovat v používání objektového modelu nebo instance.
ObjectQuery
ObjectQuery oznamuje pozorovateli objektu , jak najít objekty daného modelu. Poskytuje následující parametry přizpůsobitelné, jejichž výchozí hodnoty lze načíst z objektového modelu.
MinSurfaceCoverage
Vlastnost MinSurfaceCoverage Určuje hodnotu, která je považována za zjištěnou instanci.
U každého kandidáta objektu sleduje pozorovatel poměr překrývajících se povrchů mezi transformovaným objektovým modelem a scénou a potom hlásí, že je kandidátem na aplikaci pouze v případě, že je poměr pokrytí nad danou prahovou hodnotou.
IsExpectedToBeStandingOnGroundPlane
Vlastnost IsExpectedToBeStandingOnGroundPlane určuje, zda se očekává, že cílový objekt na rovině umělé země stojí.
Základní rovina je nejnižší vodorovná podlaha v oblasti hledání. Poskytuje dobré omezení u možného objektu. Zapnutí tohoto příznaku povede pozorovatele k odhadu pozice v omezeném prostoru a může zlepšit přesnost. Tento parametr bude ignorován, pokud model nemá být na rovině základní desky.
ExpectedMaxVerticalOrientationInDegrees
Vlastnost ExpectedMaxVerticalOrientationInDegrees označuje očekávaný maximální úhel ve stupních mezi směrem instance objektu a závažností.
Tento parametr poskytuje jiné omezení pro směr v případě odhadované pozice. Například pokud je objekt napravo vpravo, tento parametr může být 0. Kotvy objektů neslouží k detekci objektů, které se liší od modelu. Pokud je model napravo vpravo, nezjistí nezjištěnou instanci. Pro souběžné rozložení se použije nový model. Stejné pravidlo platí pro kloub.
MaxScaleChange
Vlastnost MaxScaleChange označuje maximální změnu měřítka objektu (v rozsahu 0 ~ 1) s ohledem na prostorové mapování. Odhadované měřítko se používá pro transformované vrcholy objektů zarovnané na střed na počátku a na osách zarovnané na ose. Odhadovaná měřítka nemusí být skutečnou škálou mezi modelem CAD a jeho fyzickou reprezentací, ale některé hodnoty, které aplikaci umožňují vykreslovat objekt modelu blízko prostorového mapování na fyzickém objektu.
SearchAreas
Vlastnost SearchAreas označuje pole prostorových rozsahů, kde najít objekty.
Pozorovatel bude hledat objekty v prostoru sjednocení všech oblastí hledání zadaných v dotazu. V této verzi vrátíme maximálně jeden objekt s nejvyšší jistotou, aby se snížila latence.
ObjectInstance
ObjectInstance představuje hypotetickou polohu, kde může být instance daného modelu v systému HoloLens souřadnicovém systému. Každá instance obsahuje SurfaceCoverage vlastnost, která indikuje, jak dobrá je předpokládaná pozice.
Instance je vytvořena voláním ObjectObserver.DetectAsync metody a pak se automaticky aktualizuje na pozadí při připojení. Aplikace může naslouchat události změněné stavu na konkrétní instanci nebo změnit režim sledování pro pozastavení nebo obnovení aktualizace. Instance bude automaticky odebrána z pozorovatele , když dojde ke ztrátě sledování.
ObjectDiagnosticsSession
ObjectDiagnosticSession zaznamenává diagnostiku a zapisuje data do archivu.
Diagnostický archiv zahrnuje Cloud bodu scény, stav pozorovatele a informace o modelech. Tyto informace jsou užitečné k identifikaci možných potíží s modulem runtime. Další informace najdete v nejčastějších dotazech.
Použití a podrobnosti o běhovém prostředí sady SDK
Tato část by vám měla poskytnout základní informace o použití sady SDK modulu runtime. Měl by vám poskytnout dostatečný kontext pro procházení ukázkových aplikací, abyste viděli, jak se kotvy objektů používají komplexní.
Inicializace
Aplikace musí volat ObjectObserver.IsSupported() rozhraní API, aby bylo možné zjistit, zda jsou kotvy objektů v zařízení podporovány, než je použije. Pokud ObjectObserver.IsSupported() rozhraní API vrátí false , ověřte, že aplikace povolila spatialPerception schopnost and\or upgradovat na nejnovější HoloLens operační systém.
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
}
V dalším kroku aplikace vytvoří pozorovatele objektu a nahraje nezbytné modely generované službou konverze modelu kotev objektu.
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.
Aplikace vytvoří dotaz pro detekci instancí tohoto modelu v rámci prostoru.
using Microsoft.Azure.ObjectAnchors;
using Microsoft.Azure.ObjectAnchors.SpatialGraph;
using Microsoft.Azure.ObjectAnchors.Unity;
using UnityEngine;
// Get the coordinate system.
SpatialGraphCoordinateSystem? coordinateSystem = null;
#if WINDOWS_UWP
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.
IList<ObjectInstance> detectedObjects = await observer.DetectAsync(query);
Ve výchozím nastavení se každá zjištěná instance automaticky sleduje pozorovatelem. Volitelně můžeme manipulovat s těmito instancemi změnou režimu sledování nebo poslechem události změny stavu.
using Microsoft.Azure.ObjectAnchors;
foreach (ObjectInstance instance in detectedObjects)
{
// Supported modes:
// "LowLatencyCoarsePosition" - Consumes less CPU cycles thus fast to
// update the state.
// "HighLatencyAccuratePosition" - (Not yet implemented) 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();
}
V události změněné stav můžeme zadat dotaz na nejnovější stav nebo odstranit instanci, pokud se ztratilo sledování.
using Microsoft.Azure.ObjectAnchors;
var InstanceChangedHandler = new Windows.Foundation.TypedEventHandler<ObjectInstance, ObjectInstanceChangedEventArgs>((sender, args) =>
{
// Try to query the current instance state.
ObjectInstanceState? state = sender.TryGetCurrentState();
if (state.HasValue)
{
// Process latest state via state.Value.
// An object pose includes scale, 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.
sender.Dispose();
}
});
Aplikace může také volitelně nahrávat jednu nebo více diagnostických cvičení pro offline ladění.
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"));
Nakonec uvolníme prostředky vyřazením všech objektů.
using Microsoft.Azure.ObjectAnchors;
foreach (ObjectInstance instance in activeInstances)
{
instance.Changed -= InstanceChangedHandler;
instance.Dispose();
}
model.Dispose();
observer.Dispose();