无法订阅节点RosSharp C#Unity

时间:2018-10-24 20:31:02

标签: c# unity3d ros

我无法使用RosSharp订阅任何主题。我在同一台机器上完全在本地工作。我相当确定我具有正确的uri和正确的端口,并且无法进行任何通信。我正在通过Win-ROS运行ROS:https://ros-win.visualstudio.com/_git/ros-win?path=%2Fdoc%2FSetup.md&version=GBmaster

在本地Windows主机上,我正在运行roscore并发布具有以下内容的节点: rostopic pub -r 10 /testtopic std_msgs/String "whatever"

我能够使用rostopic echo /testtopic在命令提示符下运行订阅服务器并收到正确的数据,但是我无法让该订阅服务器在Unity中工作。我期望至少SubscriptionHandler被调用。这是我要复制的代码:https://github.com/siemens/ros-sharp/blob/a45e847f96d7dd1a7859dd9595e05ef27b27b5c3/Libraries/RosBridgeClientTest/RosSocketTests.cs

下面是我附在GameObject上的代码,我们将不胜感激。谢谢。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using RosSharp.RosBridgeClient;
using std_msgs = RosSharp.RosBridgeClient.Messages.Standard;

public class BasicROS : MonoBehaviour {

    public string uri = "ws://18.40.26.172:11311";
    private RosSocket rosSocket;
    string subscriptionId = "";

    void Start () {
        rosSocket = new RosSocket(new 
        RosSharp.RosBridgeClient.Protocols.WebSocketNetProtocol(uri)); // 10.189.42.225:9090
        Subscribe("/testtopic");
    }

    public void Subscribe(string id)
    {
        subscriptionId  = rosSocket.Subscribe<std_msgs.String>(id, SubscriptionHandler);
        StartCoroutine(WaitForKey());     
    }

    private IEnumerator WaitForKey()
    {
        Debug.Log("Press any key to close...");

        while (!Input.anyKeyDown)
        {
            yield return null;
        }

        Debug.Log("Closed");
       // rosSocket.Close();
    }

    private void SubscriptionHandler(std_msgs.String message)
    {
        Debug.Log("Message received!");
        Debug.Log(message.data);
    }
}

1 个答案:

答案 0 :(得分:1)

在撰写本文时,ros-win不支持rosbridge,它是rosSharp可以与之通信的ros-websocket桥。如果必须使用ros-win并使用RosSharp统一进行websocket通信,则需要等待或编写自己的rosbridge端口。

如果您可以将ros-win替换为ros on WSL,则可以执行以下操作:

安装ros-websocket桥

sudo apt-get install ros-<rosdistro>-rosbridge-suite

例如

sudo apt-get install ros-melodic-rosbridge-suite

使用roslaunch rosbridge_server rosbridge_websocket.launch运行它,以使Web套接字消息到达ros网络。

这样做会在端口9090上创建一个websocket侦听器,因此您需要将uri更改为使用端口9090

此外,您可能希望使用localhost(即uri = "ws://localhost:9090";)来避免路由问题。