Unityを使ってみる その2(ROS#、カメラ映像のSubscribe)
はじめに
今回はUnityにROS#をインストールし、ROSでPublishされているカメラ映像をSubscribeできるようにしてみました。
ロボットの遠隔操作をするときに用いようと思っています。通信のラグなどが気になるところです。
▼Unity自体は以下の記事でインストール済みです。
▼以前の記事はこちら
パッケージをインストールする
ROS#のパッケージを、Unityに追加します。
▼ROS#のGitHubのリポジトリはこちら。READMEに沿って進めます。
https://github.com/siemens/ros-sharp
Package Managerを開きます。
▼WindowのPackage Managementにありました。


+のアイコンからパッケージを追加します。
▼今回はInstall package from git URLを選択します。

▼URLは以下のものを入力しました。
https://github.com/siemens/ros-sharp.git?path=/com.siemens.ros-sharp

Installを選択後、パッケージが追加されました。
▼特に問題なくインストールできました。

Unityでカメラ映像の表示
USBカメラ映像の確認
Jetson Xavierに接続したUSBカメラの映像を、WindowsのPCで起動したUnityで受信するという構成で進めます。
▼USBカメラの映像のPublishについては、以下の記事で紹介しています。
マスターはWindows側のWSL2のROS Noetic環境になるように、.bashrcを編集しておきました。IPアドレスはTailscaleのものです。
▼WSL2、Ubuntu環境へのTailscaleの導入についてはこちら
WSL2側でrqt_image_viewを実行し、カメラ映像を受信できることを予め確認しました。
▼以下のようなカメラ映像が送信されています。

ROS Bridgeの起動
ROS#ではROS Bridgeを用いて通信するので、WSL2側でROS Bridgeを起動しておきます。
▼以下の記事でも利用していました。WSL2の場合はファイアウォールの許可などを行う必要があります。
ROS Bridgeは以下のコマンドで起動できます。
sudo apt install ros-noetic-rosbridge-server
roslaunch rosbridge_server rosbridge_websocket.launch▼9090ポートで起動しました。

Unity側の設定
Projectに追加されたROS#の実装を利用します。
▼ROS#/Runtime/RosBridgeClient/RosCommunicationに、CompressedImageSubscriberとRawImageSubscriberがあります。

今回は両方試してみました。
▼Unity上でPlaneとRawImageSubscriberを追加しました。

▼RawImageSubscriberのInspectorで、ROS BridgeのURIやトピック、レンダリング対象のメッシュを選択できるようになっています。

もう一つPlaneを追加して、Add ComponentでCompressed Image Subscriberを追加しました。
▼こちらの方が管理しやすそうですね。

この状態で起動してみたところ、Planeにカメラの映像が表示されませんでした。
▼デフォルトのテクスチャなのか、ピンク色になっています。

Inspectorのパラメータでは調整できそうになかったのですが、今回はコードを修正することで対応しました。
RawImageSubscriberとCompressedImageSubscriberのファイルを開くと、マテリアルに関する以下のコードがありました。
meshRenderer.material = new Material(Shader.Find("Standard"));StandardからUnlit/Textureに修正しました。
meshRenderer.material = new Material(Shader.Find("Unlit/Texture"));この状態だと問題なく表示されました。
▼カメラの映像を受信できました!

なお左がRawImageSubscriber、右がCompressedImageSubscriberの映像です。なぜか反転しているのですが、右が正しいです。この辺りもコードの方を見直す必要があるのかも知れません。
TailscaleによるVPN接続を利用していることも影響しているのか、ラグは大きかったです。その代わり、インターネットに接続されていればどこからでも確認できます。ロボットに載せたときにどのくらいの影響があるのか気になるところです。
最後に
カメラ映像の受信はできましたが、少し修正する必要がありました。Unity 6に完全に対応しているわけでは無いので、今後も他の問題が起きる可能性があります。
ROS#ではなくUnity Robotics Hubを利用することもできそうなので、そちらも試したいと思っています。
▼Unity Robotics HubのGitHubのページはこちら
https://github.com/Unity-Technologies/Unity-Robotics-Hub
なお、一度プロジェクトを閉じてから再度起動したときに、エラーが起きていました。
▼対処方法は分かったので、次の記事で紹介しようと思います。




