新しい 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 マップを使用して表示する方法
  • 実際の場所に付加する Anchor を配置する方法

必要なもの

2. 開発環境を設定する

Android Studio を設定する

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

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

Google Cloud プロジェクトの設定

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

  1. Google Cloud コンソールでプロジェクトを作成します。
  2. 必要な API を有効にします。
    • サイドバーで [API と[Services]、[ライブラリ] に移動します。
    • 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. アプリを開く >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
}

新しい Anchor の配置を決定する

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 の詳細については、以下の参考情報をご覧ください。