JackMasaki’s blog

掲載した記事ネタや作ったアプリ、参加したイベントレポートなどを掲載します

Surface+RealSense T265で6DoFARっぽい奴を作ってみる

Unity上でSurfaceのリアカメラとRealSense T265を組み合わせてARっぽい表示をしてみるデモを作ってみる記事です。

f:id:JackMasaki:20190308203256p:plain

まずRealSense T265をUnityで使うにあたりdllが必要になります。 しかし、その辺の面倒なビルドなどを全部含めてかつサンプルも含めた素晴らしいunitypackageが公開されているので使わせていただきましょう。

下記のGitHubIのreleasesページからIntel.RealSense.unitypackageをダウンロードします。

github.com

Unityで新規プロジェクトを作成し、ダウンロードしたIntel.RealSense.unitypackageからインポートします。

Build SettingsからPlayer Settingsを開き、ResolutionをWidthを1920,Heightを1080に設定します。

f:id:JackMasaki:20190308193604p:plain

Assets/RealSenseSDK2.0/PrefabsからRsDeviceをヒエラルキーに持ってきます。

続いてRsDeviceのComponentのRsDeviceスクリプトを設定します。

ProfilesのSizeを1に設定しElement 0のStreeamをPose、FormatをSixDOFに設定します。

f:id:JackMasaki:20190308194145p:plain

ヒエラルキーで空のGameObjectを作成します。名前は何でもいいです(今回はPoseにしました)

作成した空のGameObjectにRs Pose Stream TransformをAdd Componentします。

Rs Pose Stream TransformのSourceにはヒエラルキー上のRsDeviceを設定します。

f:id:JackMasaki:20190308194710p:plain

ここまでで一度動作確認をしましょう。Pose直下にCubeを置いてプレイしてみます。

T265を動かしてみて、自己位置推定の結果が反映されてCubeが動いていればT265のPoseを取得できています。

確認できたらCubeは削除します。

続いてMain Cameraの動作とT265の動作を反映させるため、Pose直下にMain Cameraを移動します。

Main CameraのTransform Positionを(0,0,0)、Field of Viewを16、Clipping PlanesのNearを0.1に設定します。

f:id:JackMasaki:20190308195435p:plain

ここまでで、Main CameraはT265の自己位置推定の結果が反映されているかと思います。

最後にWebCamTextureを使ってSurfaceのリアカメラの表示を行います。

以下のようなRearCameraTexture.csというスクリプトを記述します。

using System.Collections;
using UnityEngine;
using UnityEngine.UI;

public class RearCameraTexture : MonoBehaviour {

    [SerializeField]
    private int width = 1920;
    [SerializeField]
    private int height = 1080;
    [SerializeField]
    private RawImage rawImage = null;

    private WebCamTexture webCamTexture = null;

    private IEnumerator Start()
    {
        yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);

        if (!Application.HasUserAuthorization(UserAuthorization.WebCam))
        {
            yield break;
        }

        webCamTexture = new WebCamTexture("Microsoft Camera Rear", width, height);

        rawImage.texture = webCamTexture;
        
        webCamTexture.Play();
    }
}

通常、WebCamTextureを使う場合はデバイスをすべて取得し、そのデバイス番号などで使用するカメラを指定したりするのですが、今回はSurface限定ということでカメラ名を"Microsoft Camera Rear"で固定しています。

ヒエラルキーにRawImageを追加し、Widthを1920、Heightを1080に設定します。

続いてCanvasの設定を行います。

Render ModeをScreen Space - Cameraに変更しRender CameraにMain Cameraを設定します。

RearCameraTexture.csをCanvasにAdd Componentし、RawImageには先ほど作成したRawImageを設定してあげれば大丈夫です。

f:id:JackMasaki:20190308200459p:plain

以上でARっぽい6DoFななにかが完成します。

このままだと分かりづらいので何らかのGameObjectを置いてあげると確認しやすいです。(ただし、当然ですがT265の移動距離は現実空間の移動距離と同じになるので、GameObjectのSizeやPositionには気を付けましょう(1敗))

T265をSurfaceのリアカメラの下あたりに固定して動かしてみるとそれっぽく動いていると思います。

メッシュ生成とか点群とか何も触ってないのでオクルージョンとかはなんもないです。

D435iと組み合わせたりするといい感じにオクルージョンもできそうですね!!

Vuforiaとかと組み合わせれば原点合わせもできると思うので、いろいろなデバイスと空間共有できそうです。