YKpages

ロボット分野で勉強したことのまとめ

Unity と ROS の通信 ( rosbridge, websocket_sharp )

追記(2018/10/24)

この記事では websocket-sharp をそのまま使用して通信を行っていますが、 ROS# (ros-sharp) というライブラリを使った方が楽です

github.com

使い方を簡単にまとめてみました

kato-robotics.hatenablog.com

はじめに

だいぶ前にUnityアプリからTurtleBotを動かしたときのことをまとめます。

(ざっと流れを書いていくので参考程度に)

目的

UnityアプリからTurtleBotを操作

環境

  • Ubuntu16.04
  • ROS Kinetic Kame
  • Unity

手順

  • Unity側

    • websocket-sharpライブラリの準備
    • TurtleBotへ命令を出すコードを用意
  • TurtleBot側

    • TurtleBotが動かせるように準備
    • rosbridge_serverを起動

websocket-sharpの準備(Unity側)

以下を参考。ありがたい。

qiita.com

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へデータを送る方法を書きました。

おわりに

あまり確認作業をせずに書いたので間違ってたらすみません。

他に参考にしたもの

oohito.com

oohito.com