Unityを使ってみる その2(ROS#、カメラ映像のSubscribe)

はじめに

 今回はUnityにROS#をインストールし、ROSでPublishされているカメラ映像をSubscribeできるようにしてみました。

 ロボットの遠隔操作をするときに用いようと思っています。通信のラグなどが気になるところです。

▼Unity自体は以下の記事でインストール済みです。

Unityを使ってみる その1(Unityのインストール、チュートリアルの確認)

はじめに  今回はUnityをインストールして、チュートリアルを確認してみました。  これまでUnreal Engineも使ったことがあったのですが、ロボットと連携させることを考…

▼以前の記事はこちら

ロボットアームにカメラを取り付けて映像を確認する(YOLO)

はじめに  以前の話ですが、Amazonで購入して動かせるようにしたロボットアームにカメラを取り付けて試していました。  YOLOによるリアルタイム検出も併用して、視野や…

5軸のロボットアームを製作する その3(キャチロボ2025、ロボコンでの動作確認)

はじめに  今回はロボコンに向けて製作していた5軸のロボットアームの、当日の動作についての紹介です。  これまでキャチロボバトルコンテストに3年間はチームで参加し…

パッケージをインストールする

 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については、以下の記事で紹介しています。

Jetson Xavierを使ってみる その3(ROSの環境構築、USBカメラ映像のPublish)

はじめに  今回はJetson XavierでROSの環境を構築して、USBカメラの映像をPublishしてみました。  ROSの通信で画像を送信して、物体検出や遠隔操作などを試したいなと思…

 マスターはWindows側のWSL2のROS Noetic環境になるように、.bashrcを編集しておきました。IPアドレスはTailscaleのものです。

▼WSL2、Ubuntu環境へのTailscaleの導入についてはこちら

Jetson Xavierを使ってみる その4(ROS、Tailscaleを利用した画像データの送受信)

はじめに  今回はROSとTailscaleを利用して、インターネットを経由した画像データの送受信を試してみました。  前回の記事ではローカルネットワークで試していました。…

Jetson Xavierを使ってみる その2(通信周りの設定、Node-RED、TailScale)

はじめに  今回は以前OSのセットアップを行ったJetson Xavierの通信周りの設定を行いました。  自宅サーバーとして使いたかったので、外部のネットワークからでもアクセ…

 WSL2側でrqt_image_viewを実行し、カメラ映像を受信できることを予め確認しました。

▼以下のようなカメラ映像が送信されています。

ROS Bridgeの起動

 ROS#ではROS Bridgeを用いて通信するので、WSL2側でROS Bridgeを起動しておきます。

▼以下の記事でも利用していました。WSL2の場合はファイアウォールの許可などを行う必要があります。

WSL2のROSとWebSocket通信(ROS Bridge、Node-RED、Gazebo)

はじめに  今回はWSL2のROS NoeticとNode-REDで、WebSocket通信を行いました。  ROSで計算した数値をNode-REDで取得したかったのですが、調べているとROS Bridgeという…

 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

 なお、一度プロジェクトを閉じてから再度起動したときに、エラーが起きていました。

▼対処方法は分かったので、次の記事で紹介しようと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です