Weitere Informationen zur Nutzung der Geospatial API in Ihren Apps
Voraussetzungen
Bevor Sie fortfahren, sollten Sie sich mit den grundlegenden AR-Konzepten und der Konfiguration einer ARCore-Sitzung vertraut machen.
Weitere Informationen zur Geospatial API findest du unter Introduction to the Geospatial API.
Wenn Sie noch keine Erfahrung mit der Entwicklung von ARCore haben, finden Sie unter Erste Schritte Informationen zu Software- und Hardwareanforderungen, Voraussetzungen und anderen Informationen für die von Ihnen verwendeten Plattformen.
Damit du die ARCore Geospatial API verwenden kannst, muss dein Projekt die AR Foundation und die ARCore-Erweiterungen für AR Foundation unterstützen.
Google Cloud-Projekt einrichten
Damit das Visual Positioning System (VPS) verwendet werden kann, muss Ihre App mit einem Google Cloud-Projekt verknüpft sein, das für die ARCore API aktiviert ist.
Sie müssen in Ihrem Google Cloud-Projekt die ARCore API aktivieren. Wenn Sie das Projekt erstellen müssen, gehen Sie so vor:
Rufen Sie den Hilfeartikel Projekt in der Google Cloud Platform erstellen auf.
Geben Sie einen geeigneten Projektnamen ein und wählen Sie einen Speicherort aus.
Klicken Sie auf Erstellen.
Wähle in der Seitenleiste APIs & Services und dann Bibliothek aus.
Suchen Sie nach der ARCore API, wählen Sie sie aus und klicken Sie auf Aktivieren.
Autorisierung einrichten
Damit Geospatial API-Aufrufe an den VPS gesendet werden können, muss Ihre App autorisiert werden. Die Autorisierung per Schlüsselschlüssel wird bevorzugt, aber auch die Autorisierung für API-Schlüssel wird unterstützt.
Die Standardautorisierungsstrategie für neue Unity-Projekte mit ARCore SDK 1.24.0 oder höher ist DoNotUse. Dadurch wird verhindert, dass Anwendungen mit unnötigen Bibliotheken erstellt werden.
Schlüssellose Autorisierung
Wenn du einen API-Schlüssel bereits verwendet hast und ihn nicht mehr benötigst, kannst du ihn in der Google Cloud Platform Console löschen und aus deiner App entfernen.
Du musst dich für alle verschiedenen Kombinationen des verwendeten Paketnamens und Signaturschlüssels separat registrieren, etwa für „Debugging“, „Release“ usw.
Gehen Sie so vor, um Ihr Projekt ohne Schlüsselautorisierung zu verwenden:
Rufen Sie in Unity Edit > Project Settings > XR > ARCore Extensions auf.
Wählen Sie im Drop-down-Menü Android Authentiation Strategy die Option Keyless aus.
Klicken Sie unter Optional Features die Kästchen für die APIs an, die Sie in Ihrem Projekt verwenden.
SHA-1-Fingerabdruckschlüssel generieren
Wählen Sie im Menü Edit die Option Project Settings > Player > Publishing Settings aus.
Klicken Sie auf das Keystore Manager und erstellen Sie einen neuen Schlüssel.
Kopieren Sie den SHA-1-Fingerabdruckschlüssel (wird in einem späteren Schritt eingefügt).
Erstellen Sie die OAuth-Client-ID.
Erstellen Sie eine OAuth-Client-ID in Ihrem Google Cloud-Projekt.
Fügen Sie im Feld SHA-1 fingerprint den SHA-1-Fingerabdruck für die entsprechende Variante aus dem vorherigen Schritt ein.
Klicken Sie auf CREATE, um die OAuth-Client-ID zu erstellen.
API-Schlüsselautorisierung
Führe die folgenden Schritte aus, um einen API-Schlüssel abzurufen und deinem Projekt hinzuzufügen:
Rufen Sie den Schlüssel von der Google Cloud Platform ab, wie in der Google Cloud Platform Console-Hilfe beschrieben.
Rufen Sie in Unity Edit > Project Settings > XR > ARCore Extensions auf.
Wählen Sie im Drop-down-Menü Android Authentiation Strategy die Option API Key aus.
Füge im Feld Android API Key den API-Schlüssel ein, den du von der Google Cloud Platform erhalten hast.
Klicken Sie unter Optional Features die Kästchen für die APIs an, die Sie in Ihrem Projekt verwenden.
Nutzer auffordern, die Nutzung von Gerätedaten zu erlauben
In Apps, die die ARCore Geospatial API verwenden, muss der Nutzer aufgefordert werden, die Datennutzung auf seinem Gerät zu bestätigen und zuzulassen. Weitere Informationen finden Sie unter Anforderungen an den Datenschutz für Nutzer.
Gerätekompatibilität prüfen
Nicht alle Geräte, die ARCore unterstützen, unterstützen auch die Geospatial API. Rufe AREarthManager.IsGeospatialModeSupported()
auf, um die Kompatibilität des Nutzers zu prüfen.
Wenn FeatureSupported.Unsupported
zurückgegeben wird, versuche nicht, die Sitzung zu konfigurieren.
Nutzer zur Laufzeit um Berechtigungen zur Standortermittlung bitten
ARCore-Erweiterungen fordern automatisch die entsprechenden Berechtigungen zur Standortermittlung an, wenn der räumliche Modus in ARCoreExtensions.Update()
aktiviert ist. Wenn der Nutzer keine Berechtigung zur genauen Standortermittlung erteilt, wird die Sitzung nicht fortgesetzt und der Fehler „Berechtigung nicht gewährt“ wird zurückgegeben. Dies ist ein Beendigungsfehler und ein Neustart ist erforderlich, um die Berechtigungsanfrage noch einmal auszulösen.
Genaue Standortbestimmung
Die CameraGeospatialPose
beschreibt eine bestimmte Richtung, Höhen und Kompassrichtung in Bezug auf die Erde.
Sie wird in einem AREarthManager
-Objekt verwaltet.
Tracking-Status prüfen
Raumbezogene Werte sind nur gültig, während TrackingState.EarthTrackingState
TrackingState.Tracking
ist. Andernfalls kann TrackingState
Limited
oder None
sein.
Sie müssen die Geospatial API-Aufrufe immer in einem TrackingState
-Steuerblock zusammenfassen.
var earthTrackingState = EarthManager.EarthTrackingState;
if (earthTrackingState == TrackingState.Tracking)
{
// Values obtained by the Geospatial API are valid as long as
// earthTrackingState is TrackingState.Tracking.
// Use Geospatial APIs in this block.
}
Weitere Fehlerstatus und -bedingungen können auch unter AREarthManager.EarthState
aufgeführt sein. Wenn TrackingState
den Wert Limited
oder None
hat, kann AREarthManager.EarthState
die Ursache dieses Fehlers beschreiben.
Geospatiale Kameraposition erhalten
Wenn TrackingState
den Wert Tracking
hat, fordern Sie die Positionierung der Kamera im Verhältnis zur Erde an:
var earthTrackingState = EarthManager.EarthTrackingState;
if (earthTrackingState == TrackingState.Tracking)
{
// camera_geospatial_pose contains geodetic location, rotation, and
// confidences values.
var cameraGeospatialPose = EarthManager.CameraGeospatialPose;
}
Du erhältst dann ein GeospatialPose
-Element mit den folgenden Informationen:
- Standort in Breiten- und Längengraden Eine Schätzung der Standortgenauigkeit wird ebenfalls bereitgestellt.
- Höhe und eine Schätzung der Genauigkeit
- Richtung, Näherung der Richtung, in die das Gerät gerichtet ist, und eine Schätzung der Genauigkeit der Richtung.
Für Positionsgenauigkeit anpassen
Die Genauigkeit der Pose vom VPS kann aufgrund der Verfügbarkeit von VPS-Daten für den Standort oder aufgrund zeitlicher Bedingungen am Standort variieren. Unter Umständen muss deine App Anpassungen für die Genauigkeit der Position vornehmen (siehe Geospatial API).
Die Geospatial API bietet eine Schätzung für die Genauigkeit der von den VPS zurückgegebenen Breiten-/Längengrad-, Höhen- und Überschriftenwerte.
Wenn der Überschriftswert von GeospatialPose.Heading
beispielsweise 60 Grad und der Wert von GeospatialPose.HeadingAccuracy
10 % beträgt, besteht eine Wahrscheinlichkeit von 68 %, dass die VPS-Überschrift innerhalb von 10 Grad der beobachteten Überschrift liegt (siehe Grafik links).
Wenn der Wert für GeospatialPose.HeadingAccuracy
15 beträgt, besteht eine Wahrscheinlichkeit von 68 %, dass die tatsächliche Richtung innerhalb von 15 Grad bei 60 Grad liegt (siehe Grafik rechts). Je höher der von GeospatialPose.HeadingAccuracy
zurückgegebene Wert, desto niedriger ist die Genauigkeit des Überschriftswerts von GeospatialPose.Heading
.
Auf ähnliche Weise gibt GeospatialPose.HorizontalAccuracy
die Anzahl der Meter an, innerhalb derer der tatsächliche Breiten-/Längengradwert eine Wahrscheinlichkeit von 68% innerhalb der angegebenen Entfernung aufweist, und GeospatialPose.VerticalAccuracy
gibt die Anzahl der Meter an, in denen die tatsächliche Höhenhöhe mit einer Wahrscheinlichkeit von 68 % innerhalb des angegebenen Abstands liegt.
Geospatial API in Ihrem Projekt aktivieren
Achte darauf, dass der Ordner Assets des Projekts ein skriptfähiges ARCoreExtensionsConfig-Objekt enthält.
Klicken Sie im Bereich Assets mit der rechten Maustaste und wählen Sie Create > ARCore Extensions > ARCore Extensions Config aus, um einen zu erstellen.
Wählen Sie das skriptfähige Objekt ARCoreExtensionsConfig aus und wählen Sie im Fenster Inspector für das Drop-down-Menü Geospatial Mode Enabled aus.
Konfiguriere das Spieleobjekt ARCore Extensions, um die Konfiguration ARCoreExtensionsConfig zu verwenden:
Suche im Bereich Hierarchy das ARCore Extensions-Spielobjekt, das du bei der Einrichtung von ARCore-Erweiterungen erstellt hast.
Verbinde das Feld ARCore Extensions Config mit dem Skriptskript ARCoreExtensionsConfig im Asset-Ordner.
Raumbezogene Ankeranzeigen
Zum Platzieren eines raumbezogenen Ankers müssen Sie eine Position (Breitengrad, Längengrad und Höhe) und eine Ausrichtung (Quartal) angeben. Gemeinsam bilden sie die Pose für den Anker.
Der Breiten- und Längengrad sowie die Höhe werden im WGS84-Koordinatensystem angegeben. Die Höhe wird in Metern über dem WGS84-Ellipsoid als Referenz angegeben, sodass der Bodenniveau nicht null beträgt. Diese Koordinaten werden von Ihrer App für jeden erstellten Anker bereitgestellt.
Breiten- und Längengrad eines Standorts ermitteln
Es gibt drei Möglichkeiten, den Breiten- und Längengrad eines Standorts zu berechnen:
- Google Maps verwenden
- Verwenden Sie Google Earth. Wenn Sie diese Koordinaten nicht mit Google Maps, sondern mit Google Earth abrufen, erhalten Sie eine Fehlerspanne von bis zu mehreren Metern.
- Zum Standort
Google Maps verwenden
So rufen Sie den Längen- und Breitengrad eines Standorts in Google Maps ab:
Rufen Sie auf Ihrem Computer Google Maps auf.
Gehen Sie zu Ebenen & Mehr.
Ändern Sie den Kartentyp zu Satellit und entfernen Sie das Häkchen aus dem Kästchen Globusansicht links unten auf dem Bildschirm.
Dadurch wird eine 2D-Perspektive erzwungen. Fehler, die aus einer 3D-Ansicht entstehen, werden entfernt.
Klicken Sie auf der Karte mit der rechten Maustaste auf den Ort und wählen Sie die Längen- und Breitengrade aus, um sie in die Zwischenablage zu kopieren.
Google Earth verwenden
Sie können den Breiten- und Längengrad eines Orts in Google Earth berechnen, indem Sie auf einen Ort in der Benutzeroberfläche klicken und die Daten aus den Details der Ortsmarkierung lesen.
So rufen Sie den Längen- und Breitengrad eines Ortes in Google Earth ab:
- Öffnen Sie Google Earth auf dem Computer.
Öffnen Sie das Hamburger-Menü
und wählen Sie Kartenstil aus.
Deaktivieren Sie die Option 3D-Gebäude.
Wenn der Schalter 3D-Gebäude ausgeschaltet ist, klicken Sie auf das Stecknadelsymbol
, um eine Ortsmarkierung an der ausgewählten Position hinzuzufügen.
Wählen Sie ein Projekt für die Ortsmarkierung aus und klicken Sie auf Speichern.
Geben Sie in das Feld Titel einen Namen für die Ortsmarkierung ein.
Klicken Sie im Projektbereich auf den Zurückpfeil
und wählen Sie das Menü Weitere Aktionen
aus.
Wählen Sie im Menü Als KML-Datei exportieren aus.
Die KLM-Datei gibt den Breiten-, Längengrad und die Höhe einer Ortsmarkierung im <coordinates>
-Tag durch Kommas getrennt an. Das Beispiel sieht wie folgt aus:
<coordinates>-122.0755182435043,37.41347299422944,7.420342565583832</coordinates>
Verwende nicht den Breiten- und Längengrad aus den <LookAt>
-Tags, die die Kameraposition angeben, nicht den Standort.
Zum Standort
Sie können die Höhe eines Standorts berechnen, indem Sie sich physisch vor Ort aufhalten.
Höhe eines Standorts ermitteln
Es gibt mehrere Möglichkeiten, die Höhe eines Ortes zu bestimmen.
- Wenn sich der Ankerpunkt in der Nähe des Nutzers befindet, können Sie eine Höhe verwenden, die der Höhe des Nutzergeräts entspricht.
- Sobald Sie den Längen- und Breitengrad erhalten, können Sie mit der Elevation API eine Höhe berechnen, die auf der Spezifikation EGM96 basiert. Für einen Vergleich mit der Höhe
GeospatialPose
muss die Maps API EGM96-Höhe in WGS84 konvertiert werden. Siehe GeoidEval mit einer Befehlszeile und einer HTML-Schnittstelle. Die Google Maps API erfasst den Breiten- und Längengrad gemäß der WGS84-Spezifikation. - Diese Informationen finden Sie in Google Earth. Dies führt zu einer Fehlerspanne von bis zu mehreren Metern. Verwenden Sie den Breiten- und Längengrad sowie die Höhen der
<coordinates>
-Tags, nicht die<LookAt>
-Tags in der KML-Datei. - Wenn ein vorhandener Anker nahe und nicht in einer steilen Steigung liegt, können Sie möglicherweise die Höhe aus dem
GeospatialPose
der Kamera nutzen, ohne dafür eine andere Quelle wie die Google Maps API zu verwenden.
Rotationsquaternion abrufen
Verwenden Sie die folgende Formel, um eine Pose.rotation
-Quartale zu erstellen, bei der die +Z-Achse in dieselbe Richtung wie die Überschrift von GeospatialPose
zeigt.
Quaternion quaternion =
Quaternion.AngleAxis(180f - (float)pose.Heading, Vector3.up);
Sobald du die Breiten-, Längengrad-, Höhen- und Rotationsquarantäne erhalten hast, kannst du mit ARAnchorManager.AddAnchor
aus ARAnchorManagerExtensions
ein ARGeospatialAnchor
erstellen, um Inhalte in von dir angegebenen geografischen Koordinaten zu verankern.
if (earthTrackingState == TrackingState.Tracking)
{
var anchor =
AnchorManager.AddAnchor(
latitude,
longitude,
altitude,
quaternion);
var anchoredAsset = Instantiate(GeospatialAssetPrefab, anchor.transform);
}
Wenn Sie einen Anker an der angegebenen Position und Ausrichtung relativ zur Erde platzieren, werden Breiten- und Längengrad in der WGS84-Spezifikation definiert. Der Höhenwert wird wiederum durch die Höhe über dem WGS84-Ellipid in Metern definiert. Die angegebene Rotationsquarantäne bezieht sich in Bezug auf den Koordinatenframe Ost-Auf-Süd. Eine Identitätsrotation ist so verankert, dass X+ nach Osten, Y+ nach oben und von der Mitte der Erde nach oben zeigt und Z+ nach Süden zeigt.
API-Nutzungskontingent
Das ARCore SDK begrenzt API-Anfragen auf den ARCore-Dienst für jedes Projekt, das das ARCore SDK verwendet, auf folgende Limits:
- 1.000 Sitzungen pro Minute
- 100.000 Anfragen pro Minute
API-Anfragen, die diese Beschränkungen überschreiten, können dazu führen,
als Fehler und nicht gefüllte Anfrage
EarthState.ErrorResourcesExhausted
.