Unity と ROS の通信 ( rosbridge, websocket_sharp )
追記(2018/10/24)
この記事では websocket-sharp をそのまま使用して通信を行っていますが、 ROS# (ros-sharp) というライブラリを使った方が楽です
使い方を簡単にまとめてみました
はじめに
だいぶ前にUnityアプリからTurtleBotを動かしたときのことをまとめます。
(ざっと流れを書いていくので参考程度に)
目的
UnityアプリからTurtleBotを操作
環境
- Ubuntu16.04
- ROS Kinetic Kame
- Unity
手順
Unity側
- websocket-sharpライブラリの準備
- TurtleBotへ命令を出すコードを用意
TurtleBot側
- TurtleBotが動かせるように準備
- rosbridge_serverを起動
websocket-sharpの準備(Unity側)
以下を参考。ありがたい。
rosbridgeの準備(ROS側)
以下のコマンドでインストール
sudo apt install ros-kinetic-rosbridge-server
以下のコマンドで実行
roslaunch rosbridge_server rosbridge_websocket.launch
rosbridge_serverを立てている間は、 外部からトピックへアクセスできる。
TurtleBotの準備(ROS側)
すでにTurtleBotを動かすために必要なものは揃っている前提。
以下のコマンドを実行
roslaunch turtlebot_bringup minimal.launch roslaunch turtlebot_teleop keyboard_teleop.launch
これでTurtleBotが動くはず。
TurtleBotを動かすためのコード(Unity側)
以下がサンプルコード
きれいではないけど動くとは思います。
(websocketよく分からん)
using System.Collections; using System.Collections.Generic; using UnityEngine; using WebSocketSharp; using WebSocketSharp.Net; public class TurtleBot_Script : MonoBehaviour { [System.Serializable] public class RosData1 { public string op; public string topic; public string type; } [System.Serializable] public class RosData2 { public string op; public string topic; public Msg msg; } [System.Serializable] public class Msg { public Vector3 linear; public Vector3 angular; } WebSocket ws; public float linear_val = 1.0; public float angular_val = 1.0; void Start() { string ipaddress = "xxx.xxx.xxx.xxx"; //自分のIPアドレス ws = new WebSocket("ws://" + ipaddress + ":9090/"); ws.OnOpen += (sender, e) => { Debug.Log("WebSocket Open"); RosData1 data = new RosData1(); data.op = "advertise"; data.topic = "/mobile_base/commands/velocity"; data.type = "geometry_msgs/Twist"; string json = JsonUtility.ToJson(data); ws.Send(json); }; ws.OnError += (sender, e) => { Debug.Log("WebSocket Error Message: " + e.Message); }; ws.OnClose += (sender, e) => { Debug.Log("WebSocket Close"); }; ws.Connect(); } // Update is called once per frame void Update() { Vector3 lin = new Vector3(linear_val ,0,0); Vector3 ang = new Vector3(0,0,angular_val); Msg msg = new Msg(); msg.linear = lin; msg.angular = ang; RosData2 data = new RosData2(); data.op = "publish"; data.topic = "/mobile_base/commands/velocity"; data.msg = msg; string json = JsonUtility.ToJson(data); ws.Send(json); } }
まとめ
UnityアプリからROSへデータを送る方法を書きました。
おわりに
あまり確認作業をせずに書いたので間違ってたらすみません。