Unity と ROS の通信 ( ROS# : ros-sharp )
はじめに
UnityアプリとROSの間でデータをやり取りしたい
ROS#というライブラリを使うと簡単に実現できるようです
公式の情報を見ればだいたい分かりますが、 一応メモを残しておきます
参考
バージョン1.3以降の場合
環境
Unity側
- Windows10
- Unity 2018.2.8f1
- ROS# v1.0 (バージョン:v1.3 → v1.0)
ROS側
- Ubuntu 16.04 LTS
- ROS Kinetic
ROS#をインポート
GitHubページから最新版UnityPackageをダウンロードしてインポート
UnityのAsset Storeからもインポートできるようです
ros-sharpパッケージ内にサンプルシーンが入っているのでそれを見るとだいたい使い方が分かります
(Assets > RosSharp > Scenes)
オブジェクトのPoseを配信してみる
Unity側の準備
Hierarchyで空(Empty)のオブジェクトを作成(名前:ROSConnector)
Create>Create Enpty で作成
そのオブジェクトに Assets > RosSharp > Script > RosCommunication > RosConnector.cs をアタッチ
(もしくはRosSharp > Prefabs > RosConnectorから作成)
InspectorでROS側PCのURLを入力
次にCubeを作成します。ここではこのCubeのPoseを配信してみます。
HierarchyでCreate > 3D Object > Cube で作成
作成したCubeに RosSharp > Scripts > MessageHandling > PoseProvider.cs をアタッチ
PoseProviderのframeId
は、特に何もなければUnity
と入力
最後にROSConnectorに RosSharp > Scripts > RosCommunication > UnityTimePublisher.cs をアタッチ
Topic
に/pose
と入力
Message Provider
はCube
を選択
ROS側の準備
すでにROSがインストールされているUbuntuを用意
以下のコマンドでrosbridge-serverをインストール
sudo apt-get install ros-kinetic-rosbridge-server
rosbridge-serverはROSとROSではないソフトウェアで簡単に通信を行えるようにするものです
以下のコマンドで実行
roslaunch rosbridge_server rosbridge_websocket.launch
やってみる
準備が整ったらUnityのプレイボタンを押します
UnityとROSの接続が成功するとubuntu側の端末にClient connected. 1 clients total.
と表示されます
接続が成功したら以下のコマンドを打ってPoseが配信されているかを確認します
rostopic list
次に以下のコマンドを打ってメッセージの内容を確認します
rostopic echo /pose
/poseトピックのメッセージが確認できると思います
ここでUnity側のCubeのPositionやRotationを変更するとメッセージの内容も変わることが確認できます
座標系について
ちなみにですが、UnityとROSでは座標系が異なっています
そのことについてまとめたので確認してみてください
通信が上手くいかない場合
考えられる点
- ROSConnectorで入力するROS側PCのURLが間違っている
- Unity側PCとROS側PCが同じネットワークにいない
- rosbridge-serverを起動していない
- Unity側の準備が足りていない
など
配信されているPoseの可視化について
ROSには可視化ツールとしてRvizというソフトウェアがあります
このrvizで今回Unityから配信したPoseデータを可視化してみるとおもしろいかと思います
以下のコマンドで実行できます
rosrun rviz rviz
使い方は調べれば出てきます
rvizで可視化する場合、Unity上でCubeにアタッチしたPoseProviderのFrameIdを設定する必要があります
気になること
ROS#がiOS端末上では上手く動かない問題
(2019/04/17追記)
以下情報
まとめ
ROS#を利用してUnityとROSでデータをやり取り
おわりに
今回はUnityからROSへデータを送りましたが、 もちろんROSからUnityへデータを送ることもできます
またROS#の強みは、簡単であることと、URDFも扱えるということみたいです
ROS#の存在はありがたい