Can';t订阅节点RosSharp C#Unity

Can';t订阅节点RosSharp C#Unity,c#,unity3d,ros,C#,Unity3d,Ros,我不能使用RosSharp订阅任何主题。我完全在同一台机器上本地工作。我相当肯定我有正确的uri和正确的端口,无法获得任何通信。我通过Win ROS运行ROS: 在本地Windows主机上,我正在运行roscore并发布一个节点,其中包含: rostopicpub-r10/testtopic std\u msgs/String“whatever” 我能够在命令提示符下使用rostopicecho/testtopic运行订阅服务器并接收正确的数据,但我无法使该订阅服务器在Unity中工作。我希望至

我不能使用RosSharp订阅任何主题。我完全在同一台机器上本地工作。我相当肯定我有正确的uri和正确的端口,无法获得任何通信。我通过Win ROS运行ROS:

在本地Windows主机上,我正在运行
roscore
并发布一个节点,其中包含:
rostopicpub-r10/testtopic std\u msgs/String“whatever”

我能够在命令提示符下使用
rostopicecho/testtopic
运行订阅服务器并接收正确的数据,但我无法使该订阅服务器在Unity中工作。我希望至少能调用SubscriptionHandler。这是我试图复制的代码:

下面是我的代码附加到一个游戏对象,任何帮助将不胜感激。多谢各位

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);
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
使用RosSharp.RosBridgeClient;
使用std_msgs=RosSharp.RosBridgeClient.Messages.Standard;
公共类BasicROS:单一行为{
公共字符串uri=“ws://18.40.26.172:11311”;
私人罗索克特罗索克特;
字符串subscriptionId=“”;
无效开始(){
rosSocket=新的rosSocket(新的
RosSharp.RosBridgeClient.Protocols.WebSocketNetProtocol(uri));//10.189.42.225:9090
订阅(“/testtopic”);
}
公共无效订阅(字符串id)
{
subscriptionId=rosSocket.Subscribe(id,SubscriptionHandler);
start例程(WaitForKey());
}
私人IEnumerator WaitForKey()
{
Log(“按任意键关闭…”);
而(!Input.anyKeyDown)
{
收益返回空;
}
Debug.Log(“关闭”);
//rosSocket.Close();
}
私有void SubscriptionHandler(std_msgs.String消息)
{
Log(“收到消息!”);
Debug.Log(message.data);
}
}

在撰写本文时,RosWin不支持rosbridge,rosbridge是Rosharp可以与之通信的RosWebSocket桥。如果您必须使用roswin和RosSharp在unity中进行websocket通信,那么您需要等待或编写自己的rosbridge端口

如果可以用替换ros win,则可以执行以下操作:

安装ros websocket桥接套件。(注意:桌面已满不包括此项,因此请确保您实际获得此软件包)

使用
roslaunch rosbridge\u server rosbridge\u websocket运行它。启动
,以便web套接字消息到达ros网络

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


此外,您可能希望使用
localhost
,即
uri=“ws://localhost:9090”,以避免路由问题。

请回答您的问题,并包括您收到的任何相关日志消息以及您希望某些未打印的日志消息的位置。Unity和
roscore
是否在同一台机器上运行?您是否在同一台机器上测试
rostopic
?您使用什么命令启动
roslaunch
?Unity和roscore在同一台机器上运行。Rostopic也在同一台机器上进行了测试。我不是在使用roslaunch,我是在使用rostopic pub-r 10/testtopic std_msgs/String“whatever”发布。我只想从命令提示符下发布,并在Unity中订阅。感谢您的帮助您是否通过WSL运行ros,如中?当我尝试运行该命令时,您知道Windows是否支持rosbridge_服务器吗。我得到:[rosbridge_websocket.launch]既不是包[rosbridge_server]中的启动文件,[rosbridge_server]也不是启动文件名。@RickyAvina我编辑了我的答案,以包括如何安装rosbridge的说明,如果您使用WSL在Windows上运行ros,该说明应该可以工作。我还必须添加
9090
是您需要在
uri
中使用的websocket端口。我没有使用WSL来运行ROS。我使用ROS-Win@RickyAvina-ROS-Win-rosbridge套件作为它移植的东西,所以这似乎不是一个选项。如果你必须使用ros win,那么如果你想从unity继续进行websocket通信,你似乎需要制作自己的ros websocket桥接器。啊,是的,我错了,因为“桌面已满”并不是所有东西都有。“完整”一词具有误导性。除非你修改答案,否则我不会投票。我想你可以在某处添加或删除标点或空格。
sudo apt-get install ros-<rosdistro>-rosbridge-suite
sudo apt-get install ros-melodic-rosbridge-suite