新しい ARCore Geospatial API を使用して拡張現実(AR)アプリを作成する

1. 概要

ARCore は、スマートフォンで拡張現実(AR)エクスペリエンスを構築するための Google のフレームワークです。新しい ARCore Geospatial API は、拡張現実に新たな側面をもたらし、現実世界のランドマークの周囲に位置情報に固有の拡張現実のウェイポイントを配置できるようになります。

作成するアプリの概要

この Codelab では、ARCore Geospatial API の使い方を紹介します。Geospatial API が AR エクスペリエンス全体に提供できる情報と、このデータを活用してシンプルな AR ナビゲーション エクスペリエンスを実現する方法について説明します。

学習内容

  • Geospatial API を使用する ARCore プロジェクトをセットアップする方法。
  • Geospatial API から地理データをリクエストして、Google マップを使用して表示する方法。
  • 現実世界の場所にアタッチされたアンカーを配置する方法。

必要なもの

2. 開発環境を設定する

Android Studio をセットアップする

Geospatial API を使い始めるにあたって、Google Maps SDK を統合した基本的な ARCore プロジェクトを含むスターター プロジェクトを用意しています。これにより、Geospatial API をすぐに使い始めることができます。

  1. Android Studio を起動し、VCS からプロジェクトをインポートします。
    • プロジェクトがすでに開いている場合は、[File] > [New] > [Project from Version Control...] を使用します。
    • [Welcome to Android Studio] ウィンドウが表示されたら、[Get from VCS] を使用します。Get from VCS の場所
  2. [Git] を選択し、URL https://github.com/google-ar/codelab-geospatial.git を使用してプロジェクトをインポートします。

Google Cloud プロジェクトの設定

Geospatial API は、StreetView の画像とデバイスの磁力計およびカメラセンサーの情報を組み合わせて、向きの値を改善します。このサービスを利用するには、Google Cloud プロジェクトを設定する必要があります。

  1. Google Cloud コンソールでプロジェクトを作成します。
  2. 必要な API を有効にします。
    • サイドバーで、[API とサービス]、[ライブラリ] の順に選択します。
    • ARCore API を検索します。
    • [有効にする] をクリックします。
    • [ライブラリ] に戻ります。
    • Maps SDK for Android を検索します。
    • [有効にする] をクリックします。
  3. API キーの認証情報を作成します。
    • [API とサービス] で [認証情報] を選択します。
    • 上部のバーで [認証情報を作成] をクリックし、[API キー] を選択します。
    • 次のステップで必要になるため、作成されたキーをメモしておきます。取得する必要がある場合は、[認証情報] ページに戻ります。

これで、API キー認証がある Google Cloud プロジェクトを作成できました。これで、Geospatial API を使用する準備が整いました。

API キーを Android Studio プロジェクトに統合する

Google Cloud の API キーをプロジェクトに関連付けるには、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 を Google Cloud プロジェクトで作成した API キーに置き換えます。

com.google.android.ar.API_KEY に格納されている値は、このアプリが Geospatial API を使用することを許可するものです。com.google.android.geo.API_KEY に格納されている値は、このアプリが Google Maps SDK を使用することを許可するものです。

プロジェクトを検証する

プロジェクトの準備が整っていることを確認します。Android Studio でアプリを実行します。画面の下部にカメラビューと動作中の地図が表示されます。

ボイラープレート プロジェクト

3. ユーザーの位置を特定する

このステップでは、Geospatial API を使い始めるために、サンプル プロジェクトにコードを追加します。

Geospatial API を使用するように ARCore セッションを構成する

地理空間データを取得するには、Geospatial API を有効にする必要があります。HelloGeoActivity.kt の configureSession 関数を変更して、セッション構成の GeospatialMode を ENABLED に変更します。

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

地理空間モードが ENABLED の場合、アプリは地理空間情報を取得できます。

Geospatial 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 が返されます。

  • 緯度と経度で表される位置情報。位置情報の精度の推定値も提供されます。
  • 標高と、標高の精度の推定値。
  • 方位(デバイスが向いている方向の概算値)と、方位の精度の推定値。

地図上に位置情報を表示する

cameraGeospatialPose に保存されている GeospatialPose を使用して、ユーザーの位置を示す地図上のマーカーを移動できます。中断したところから続けて、次のコードを追加します。

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

これにより、Geospatial API から取得した値を使用して、地図の位置が継続的に更新されます。

試してみる

Android Studio で、[Play] をクリックします。デバイスを持ち上げて動かし、ARCore がトラッキングを確立できるようにします。しばらくすると、地図に緑色のマーカーが表示されます。このマーカーは、周囲の状況を確認するにつれて回転します。また、正しい方向を指している必要があります。つまり、実際に北を向いているときに、矢印も北を指している必要があります。

緑色の矢印は、現在地と向きに合わせて移動します。

4. 地球座標を使用してアンカーを配置する

Geospatial API を使用すると、現実世界の任意の座標ペアと回転にアンカーを配置できます。これにより、特定の場所を訪れたユーザーにアンカー付きコンテンツを表示できます。

このステップでは、地図をタップしてアンカーを配置する方法を追加します。

地図がタップされたときのアクションを設定する

このプロジェクトには onMapClick 関数が付属しています。この関数は、地図フラグメントがクリックされたときに緯度と経度とともに呼び出されます。HelloGeoRenderer.kt で onMapClick 関数を見つけます。

Earth オブジェクトが使用可能であることを確認する

地球上にアンカーを作成する前に、地球オブジェクトの TrackingState が TRACKING であることを確認します。これは、地球の位置がわかっていることを意味します。また、EarthState が ENABLED であることも確認します。これは、Geospatial API で問題が発生しなかったことを意味します。onMapClick 内に次の行を追加します。

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

新しいアンカーの位置を決定する

Earth オブジェクトが追跡していることを確認したら、以前の 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 がトラッキングを確立できるようにします。しばらくすると、地図上に現在地を示す緑色のマーカーが表示されます。

地図をタップすると、Geospatial API を使用してアンカーが配置され、現実世界の場所に固定されます。アンカーを現在地の近くに配置して、AR ビューで確認できるようにします。環境内を移動しても安定した状態を維持する必要があります。

地図をタップしてマーカーを配置します。

5. まとめ

この Codelab では、Geospatial API を使用して、現実世界に関連付けられたシンプルな AR エクスペリエンスを作成する方法を学びました。

地図をタップしてマーカーを配置します。

学習した内容

  • Geospatial API が有効になっている Google Cloud プロジェクトをセットアップする方法。
  • ARCore プロジェクトで地理空間情報を取得し、地図に表示する方法。
  • 地理位置情報を使用して現実世界に配置されたアンカーを配置する方法。

参考情報

この Codelab で使用した地理空間のコンセプトと SDK の詳細については、次の追加リソースをご覧ください。