RealSense T265の位置情報を使って、VR空間を移動する


OculusQuest2, ROSなどを使ってARラジコンを作っているのですが、今回ラジコンの移動に合わせてOculusQuest2上のVR空間を移動できるようにしたいと考えました。
そこで、ラジコンの位置をRealSense T265で取得し、それをROSを使ってOculusQuest2に送ることでVR空間を移動できるようにしました。

なお今回実装をするにあたり、OculusQuest2でROS#が、RaspberryPi4でRealsenseT265がすでに動く状態となっていることを前提としています。
それぞれの動かし方については以下の記事を参照してください。

デバイス、環境

  • Raspberry Pi4 Model B
    • Ubuntu Server 18.04
    • ROS melodic
  • Oculus Quest 2
    • Unity
    • ROS# v1.6
  • RealSense T265

実装

ROSでRealSenseT265を使うとnav_msgs/Odometryの型のデータが/camera/odom/sampleというtopic名で出力されます。
ROS# v1.6では、Odometryを受信するOdometorySubscriberがすでに用意されているので、これを使用します。

Odometryの受信

  1. RosConnectorのInspectorウィンドウを開く
  2. Assets/RosSharp/Scripts/RosBridgeClient/RosCommuncationにあるOdometorySubscriberをドラッグ&ドロップする
  3. Topicに/camera/odom/sampleと入力する

RealSense T265に合わせて、移動できるようにする

RealSense T265から受信したOdometryを使って移動するオブジェクトを作成し、その上にOculusQuest2のカメラを置くことで、VR空間を移動できるようにします。

  1. Hierarchyウィンドウで右クリックし、3D Object->Cubeを作成し、名前をRC-Carとする
  2. 作成したCubeの大きさを実際のラジコンと同じ大きさにする。また、位置を後輪軸の中心が原点になるように位置を調整する。
    • 自分は以下のようにしましたが、VR空間を移動したいだけならデフォルト値で大丈夫です
      • Position x : 0, y : 0, z : 0.08
      • Rotation x : 0, y : 0, z : 0.08
      • Scale x : 0.26, y : 0.21, z : 0.33
  3. Hierarchyウィンドウで、OVRCameraRigRC-Carの下にドラッグ&ドラッグする
  4. OVRCameraRigの位置をラジコン上のカメラ位置と一致するようにTransformを設定する
    • Position x : 0, y : 0.17, z : 0.08
    • Rotation x : 0, y : 0, z : 0.08
    • Scale x : 1, y : 1, z : 1
  5. Hierarchyウィンドウで、PlaneRotatorRC-Carの下にドラッグ&ドラッグする
    • Oculus GoにRaspiのカメラ画像を表示する&姿勢を取得する」の記事で、ヘッドセットの向きに合わせてカメラ画像の位置を動かすために、PlaneRotatorを実装しました。それも一緒に移動するようRC-Carの下に移動します。
      • Position x : 0, y : 0, z : 0
      • Rotation x : 0, y : 0, z : 0
      • Scale x : 1, y : 1, z : 1

ビルド

通常の手順でUnityアプリをビルドしOculusQuest2にデプロイします

launchファイルの作成

ROSのRealSense用のノードやRosBridgeをまとめて動かすために、以下のlaunchファイルを作成しました。
rosbridge_websocket/addressのIPアドレスは、実行環境に合わせて変更してください。

t265_test.launch
<launch>
  <include file="$(find rosbridge_server)/launch/rosbridge_websocket.launch" /> 
  <param name="rosbridge_websocket/address" value="192.168.4.8"/>
  <include file="$(find realsense2_camera)/launch/rs_t265.launch" /> 
</launch>

実行

Raspi側

launchファイルを実行します

roslaunch t265_test.launch

OculusQuest側

アプリの提供不明から、開発したアプリを実行します。

結果

RealSense T265を動かして、それに合わせてカメラが移動すれば成功です。
以下の動画はカメラの移動が分かりやすいように、cubeを置いてみた動画です。

参考