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 Options
でInflate 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側から実行します。
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を使い場合はこちらやこちらが参考になります。
参考
- UnityでOculus Go向けアプリをビルドしてインストールする その1(開発者登録とJDKのインストール)
- ROS# v1.2
- OculusGoをROSと通信させる
- ROS#:UnityとROSの接続
- 2018/11/11(Oculus GoとROSをROSSharpで通信させてLRFのデータ表示)
リンク
ARラジコンを開発する記事の一覧
- ARラジコンを作る (概要)
- Oculus GoにRaspiのカメラ画像を表示する&姿勢を取得する (本記事)
- Oculus Goの姿勢を使ってサーボモーターをコントロールする
- Raspberry Pi, Arduinoでタミヤラジコンを制御する