Создайте приложение дополненной реальности (AR) с помощью нового API ARCore Geospatial API.

1. Обзор

ARCore — это фреймворк Google для создания приложений дополненной реальности на смартфонах. Новый API ARCore Geospatial открывает новые возможности дополненной реальности, позволяя размещать путевые точки дополненной реальности, привязанные к конкретному местоположению, вокруг реальных достопримечательностей.

Что вы построите

В этом практическом занятии вы познакомитесь с геопространственным API ARCore. Вы узнаете, какую информацию может предоставить геопространственный API для улучшения вашего опыта работы с дополненной реальностью и как эти данные можно использовать для создания простой системы навигации в дополненной реальности.

Что вы узнаете

  • Как настроить проект ARCore, использующий геопространственный API.
  • Как запросить географические данные из геопространственного API и отобразить их с помощью Google Maps.
  • Как установить якорь, прикрепленный к реальному месту.

Что вам понадобится

2. Настройте среду разработки.

Настройка Android Studio

Для начала работы с геопространственным API мы предоставили стартовый проект, включающий основы проекта ARCore, интегрированного с SDK Google Maps. Это позволит вам быстро начать работу с геопространственным API.

  1. Запустите Android Studio и импортируйте проект из системы контроля версий.
    • Если у вас уже открыт проект, воспользуйтесь меню Файл > Создать > Проект из системы контроля версий... .
    • Если вы видите окно «Добро пожаловать в Android Studio» , используйте команду «Получить из системы контроля версий» . Добраться можно из офиса VCS.
  2. Выберите Git и используйте URL-адрес https://github.com/google-ar/codelab-geospatial.git для импорта проекта.

Создайте проект в Google Cloud.

Геопространственный API использует изображения StreetView в сочетании с информацией от магнитометра и камеры устройства для уточнения значений ориентации. Для использования этого сервиса необходимо настроить проект в Google Cloud.

  1. Создайте проект в консоли Google Cloud:
    • Перейдите на страницу «Создать проект в Google Cloud Platform» .
      Создайте проект в Google Cloud.
    • Введите подходящее название проекта (например, "Проект ARCore Geospatial API") и выберите любое местоположение.
    • Нажмите «Создать» .
  2. Включите необходимые API:
    • В боковой панели выберите «API и сервисы» , затем «Библиотека» .
    • Найдите API ARCore .
    • Нажмите «Включить» .
    • Вернуться в библиотеку .
    • Найдите Maps SDK для Android .
    • Нажмите «Включить» .
  3. Создайте учетные данные API-ключа:
    • В разделе «API и сервисы» выберите «Учетные данные» .
    • В верхней панели нажмите «Создать учетные данные» , затем выберите «Ключ API» .
    • Запишите созданный ключ, он понадобится вам на следующем шаге. Вернитесь на страницу «Учетные данные» , если вам потребуется его восстановить.

Выполнив эти шаги, вы создали проект Google Cloud с авторизацией по ключу API и готовы использовать геопространственный API.

Интегрируйте ключ API в проект Android Studio.

Чтобы связать ключ API из Google Cloud с вашим проектом, откройте созданный вами проект в Android Studio и измените ключи API:

  1. Откройте файл app > src > AndroidManifest.xml .
  2. Найдите следующие записи meta-data :
    <meta-data
        android:name="com.google.android.ar.API_KEY"
        android:value="PLACEHOLDER_API_KEY" />
    
    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="PLACEHOLDER_API_KEY" />
    
  3. Замените PLACEHOLDER_API_KEY на ключ API, который вы создали в своем проекте Google Cloud .

Значение, хранящееся в com.google.android.ar.API_KEY разрешает этому приложению использовать геопространственный API, а значение, хранящееся в com.google.android.geo.API_KEY разрешает этому приложению использовать SDK Google Maps.

Проверьте свой проект

Убедитесь, что ваш проект полностью готов к запуску. В Android Studio запустите приложение. Вы должны увидеть изображение с камеры, а также работающую карту в нижней части экрана.

Типовой проект

3. Определите местоположение пользователя.

На этом этапе вы добавляете код в пример проекта, чтобы начать работу с геопространственным API.

Настройте сессию ARCore для использования геопространственного API.

Для получения геопространственных данных необходимо включить геопространственный API. Измените GeospatialMode в конфигурации сессии на ENABLED , изменив функцию configureSession в HelloGeoActivity.kt :

fun configureSession(session: Session) {
  session.configure(
    session.config.apply {
      // Enable Geospatial Mode.
      geospatialMode = Config.GeospatialMode.ENABLED
    }
  )
}

Пока ENABLED геопространственный режим, приложение может получать геопространственную информацию.

Запросите данные из геопространственного API.

В HelloGeoRenderer.kt найдите следующую строку:

// TODO: Obtain Geospatial information and display it on the map.

Ниже проверьте, доступен ли объект Earth для использования. Это происходит, когда у него установлено trackingState TrackingState.ENABLED .

val earth = session.earth
if (earth?.trackingState == TrackingState.TRACKING) {
  // TODO: the Earth object may be used here.
}

Ниже пункта TODO запросите геопространственную информацию у ARCore. Добавьте следующую строку:

val cameraGeospatialPose = earth.cameraGeospatialPose

В результате вы получите объект GeospatialPose , содержащий следующую информацию:

  • Местоположение указано в широте и долготе. Также приводится оценка точности определения местоположения.
  • Высота над уровнем моря и оценка точности определения высоты.
  • Направление движения — приблизительное указание направления, в котором обращено устройство, и оценка точности этого направления.

Отображение информации о местоположении на карте

Вы можете использовать объект GeospatialPose хранящийся в cameraGeospatialPose для перемещения маркера на карте, показывающего местоположение пользователя. Продолжите с того места, где остановились, и добавьте следующее:

activity.view.mapView?.updateMapPosition(
  latitude = cameraGeospatialPose.latitude,
  longitude = cameraGeospatialPose.longitude,
  heading = cameraGeospatialPose.heading
)

Эта функция постоянно обновляет положение на карте, используя значения, полученные из геопространственного API.

Попробуйте!

В Android Studio нажмите «Играть» . Поднимите устройство и подвигайте его, чтобы ARCore установил отслеживание. Через некоторое время на карте должен появиться зеленый маркер. Этот маркер вращается, когда вы осматриваете окрестности. Он также должен указывать в правильном направлении: когда вы физически смотрите на север, стрелка также указывает на север.

Зелёная стрелка указывает ваше местоположение и направление.

4. Установите якорь, используя земные координаты.

Геопространственный API позволяет размещать якоря в любой паре координат и с любым поворотом в реальном мире. Это позволяет пользователям видеть привязанный контент при посещении определенных мест.

На этом шаге вы добавляете возможность размещения якоря путем касания карты.

Настройте действие при нажатии на карту.

В проекте есть функция onMapClick , которая вызывается с указанием широты и долготы при щелчке по фрагменту карты. Функцию onMapClick можно найти в HelloGeoRenderer.kt .

Убедитесь, что объект «Земля» можно использовать.

Перед созданием привязок к Земле убедитесь, что у объекта Earth TrackingState равно TRACKING , что означает, что положение Земли известно. Также убедитесь, что у объекта EarthState значение ENABLED , что означает отсутствие проблем с геопространственным API. Добавьте следующие строки внутрь onMapClick :

val earth = session?.earth ?: return
if (earth.trackingState != TrackingState.TRACKING) {
  return
}

Определите местоположение нового якоря.

После подтверждения того, что объект «Земля» отслеживается, отсоедините предыдущий earthAnchor , если он существует. На следующих шагах замените earthAnchor новым якорем:

earthAnchor?.detach()

Затем используйте параметр cameraGeospatialPose , чтобы определить высоту для новой точки привязки. Используйте пару координат, полученную при касании карты, в качестве положения точки привязки.

// Place the earth anchor at the same altitude as that of the camera to make it easier to view.
val altitude = earth.cameraGeospatialPose.altitude - 1
// The rotation quaternion of the anchor in the East-Up-South (EUS) coordinate system.
val qx = 0f
val qy = 0f
val qz = 0f
val qw = 1f
earthAnchor =
  earth.createAnchor(latLng.latitude, latLng.longitude, altitude, qx, qy, qz, qw)

createAnchor создает Anchor закрепленный на геодезических координатах с заданным поворотом. Этот якорь стремится оставаться стабильным и зафиксированным на указанных координатах и ​​высоте.

Отметьте установленный маркер на карте.

Наконец, переместите новый маркер, указывающий место, где был установлен предыдущий маркер:

activity.view.mapView?.earthMarker?.apply {
  position = latLng
  isVisible = true
}

Попробуйте!

В Android Studio нажмите «Play» . Поднимите устройство и перемещайте его, чтобы ARCore установил отслеживание. Через некоторое время на карте должен появиться зеленый маркер, указывающий ваше текущее местоположение.

При касании карты используется геопространственный API для размещения якоря, который фиксируется в реальном месте. Попробуйте разместить якорь как можно ближе к вашему текущему местоположению, чтобы вы могли видеть его в режиме дополненной реальности. Он должен оставаться стабильным во время перемещения по окружающей среде.

Установите маркер, коснувшись карты.

5. Заключение

В этом практическом занятии вы научились использовать API геопространственных данных для создания простого приложения дополненной реальности, связанного с реальным миром.

Установите маркер, коснувшись карты.

Что мы рассмотрели

  • Как настроить проект Google Cloud с включенным геопространственным API.
  • Как получить геопространственную информацию в проекте ARCore и отобразить её на карте.
  • Как установить точку привязки в реальном мире, используя географическое позиционирование.

Дополнительные ресурсы

Для получения более подробной информации о географических концепциях и SDK, используемых в этом практическом занятии, см. следующие дополнительные ресурсы: