ARCore for Jetpack XR を使用してアプリで深度情報を取得する

アプリは ARCore for Jetpack XR を通じて深度情報を取得し、物理オブジェクトがデバイスにどれだけ近いかを判断できます。

ARCore for Jetpack XR セッションを作成する

ARCore for Jetpack XR セッションを通じて頭のポーズ情報を取得します。Session を取得するには、セッションのライフサイクルを理解するをご覧ください。

セッションを構成する

XR セッションでは、深度マップの取得はデフォルトで有効になっていません。デプスマップの取得を有効にするには、セッションを構成して DepthEstimationMode を設定します。

val newConfig = session.config.copy(
    depthEstimation = Config.DepthEstimationMode.SMOOTH_ONLY,
)
when (val result = session.configure(newConfig)) {
    is SessionConfigureSuccess -> TODO(/* Success! */)
    is SessionConfigureConfigurationNotSupported ->
        TODO(/* Some combinations of configurations are not valid. Handle this failure case. */)
    else ->
        TODO(/* The session could not be configured. See SessionConfigureResult for possible causes. */)
}

DepthEstimationMode には次の値を使用できます。

  • DISABLED: シーンの奥行きに関する情報は提供されません。
  • RAW_ONLY: 生の奥行き値と信頼値で奥行き推定が有効になっています。
  • SMOOTH_ONLY: 奥行き推定が有効になり、奥行きと信頼度の値がスムーズになります。
  • SMOOTH_AND_RAW: 生の深度値と平滑化された深度値、信頼値の両方で深度推定が有効になっています。

生深度マップは、より高い精度で深度推定を提供しますが、生深度画像には、カメラ画像のすべてのピクセルに対する深度推定が含まれていない場合があります。一方、滑らかな深度マップはすべてのピクセルの推定深度を提供しますが、深度推定の平滑化と補間により、ピクセル単位の深度データの精度が低下する可能性があります。

深度データを取得する

特定のカメラの深度データを取得するには、DepthMap を使用します。

val depthMap = DepthMap.left(session) ?: return

デバイスによって機能が異なります。ステレオ カメラ構成のデバイスは、left カメラと right カメラの null 以外の深度マップを返します。同様に、単一のカメラを搭載したデバイスは、mono を使用して null 以外のデプスマップを返します。

深度値を計算する

生成された深度マップから、深度値と信頼値を取得できます。

val depthMap = DepthMap.left(session) ?: return

使用する構成設定に応じて、smoothDepthMap または rawDepthMap を使用して対応する深度マップにアクセスします。これらのマップに含まれる測定値はメートル単位で表されます。smoothConfidenceMaprawConfidenceMap を使用して信頼値にアクセスすることもできます。これらの値の範囲は 0 ~ 255 で、255 は信頼度が最も高いことを表します。

デバッグまたは可視化のために深度マップをレンダリングするには、ARCore テストアプリの深度部分をご覧ください。