Oculus GoにRaspiのカメラ画像を表示する&姿勢を取得する


Oculus GoにRaspberry Piに接続したUSBカメラの画像を表示する方法と、Oculus Goの姿勢をRaspberry Piに送信する方法について説明します。
と言っても、ほぼ他の方がやったことをそのまま行っただけです。

Oculus Go(Unity)とRaspberry Piの間の通信にはROSを使用します。

デバイス・環境一覧

  • Windows PC
    • Unityのアプリ開発用
    • Unity 2017.4.1
    • ROS# version 1.2c
  • Oculus Go
  • Raspberry Pi4 Model B
    • Ubuntu Server 18.04
    • ROS melodic
  • Raspberry Pi Camera Module V2.1

Raspberry Piの環境構築は「Rasberry Pi 4に Ubuntu server 18.04をインストール」を参照してください。
ROSの環境構築は公式に説明があります。また、多くの人がまとめています。

実装

Unity側

ビルド環境構築

こちらのサイトを参考にして環境構築しました。

実装

ROSからカメラ画像を表示する機能と、ROSにOculus Goの姿勢を送信する機能を持ったアプリを実装します。
基本的にはこちらのサイトの解説に沿いましたが、自分の環境に合わせて以下のパラメータ等だけ変更しました。

  • ROS#のバージョン [対応箇所 : 2)-2]
    • v1.2cを使用。こちらからダウンロードできます。
  • ImageReceiverのRotateとScaleを変更 [対応箇所 : 3)-1]
    • rotate (-90, 180, 0) : カメラを上下逆さまで取り付けたため、反転しました
    • scale (-1.5, -1. 0.84375) : 参考記事よりも大きく表示しました
  • ImageReceiverのInspectorで、Mesh ColidarのCooking OptionsInflate Convex Meshを追加
  • SubscriberのTopic名を変更 [対応箇所 : 3)-2]
    /cv_camera/image_raw/compressed->/image_raw/compressed
  • UnityTimePublisherのTopic名を変更 [対応箇所 : 5)-2]
    /camera->/oculus_pose

ROS側

パッケージのインストール

ROS側は公開されているパッケージをインストールします。

$ sudo apt install -y ros-melodic-rosbridge-server
$ sudo apt install -y ros-melodic-uvc_camera
$ sudo apt install -y ros-melodic-image-transport
$ sudo apt install -y ros-melodic-image-transport-plugins
  • uvc_camera
    • ここではcv_cameraを使用していましたが、自分はuvc_cameraを使用しました
  • ros-melodic-image-transport, ros-melodic-image-transport-plugins
    • ROS#のImageReceiverはimage_raw型には対応しておらず、image_raw/compressed型に対応しています。上記2つのパッケージをインストールすることで、uvc_cameraからimage_raw/compressed型が出力されるようになります

実行

最初にROS側から実行します。

ROS側

以下のlaunchファイルを作成して実行しました。valueには、実行するデバイスのIPアドレスを設定してください。

<launch>
  <include file="$(find rosbridge_server)/launch/rosbridge_websocket.launch" /> 
  <param name="rosbridge_websocket/address" value="192.168.xxx.xxx"/>
  <node name="uvc_camera" pkg="uvc_camera" type="uvc_camera_node">
  </node>
</launch>

Unity側

上記の参考記事のとおりBuild & Runをしただけです。

結果

Oculus Goで、以下のようにカメラ画像が表示できていれば正しく動作しています。

ROSの方は、以下のような出力が得られれば正しくOculus Goの姿勢を取得できています。

$ rostopic echo /oculus_pose
---
header: 
  seq: 82
  stamp: 
    secs: 35
    nsecs:        36
  frame_id: ''
pose: 
  position: 
    x: 0.09448901
    y: 0.05349608
    z: -0.09275523
  orientation: 
    x: 0.399406433
    y: -0.024657717
    z: 0.05147786
    w: -0.9149953
---

補足

今回Unity 2017.4.1を使いましたが、2018.2.17f1でも動くようで、その場合は、ROS#の v1.3以上を使う必要があるそうです。
ROS# v1.3はv1.2と使い方が異なります。v1.3を使い場合はこちらこちらが参考になります。

参考

リンク

ARラジコンを開発する記事の一覧

  1. ARラジコンを作る (概要)
  2. Oculus GoにRaspiのカメラ画像を表示する&姿勢を取得する (本記事)
  3. Oculus Goの姿勢を使ってサーボモーターをコントロールする
  4. Raspberry Pi, Arduinoでタミヤラジコンを制御する