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

1. 概要

ARCore は、スマートフォンで拡張現実を体験するための 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 は、ストリートビュー画像をデバイスの磁力計およびカメラセンサーの情報と組み合わせて、向きの値を改善します。このサービスを使用するには、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.ktconfigureSession 関数を変更して、セッション構成の GeospatialModeENABLED に変更します。

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.ktonMapClick 関数を見つけます。

Earth オブジェクトを使用できることを確認する

Earth にアンカーを作成する前に、Earth オブジェクトの TrackingStateTRACKING(地球の位置がわかっていること)であることを確認してください。また、その EarthStateENABLED(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 について詳しくは、以下の参考情報をご覧ください。