无法订阅节点 RosSharp C# Unity
Can't Subscribe to Nodes RosSharp C# Unity
我无法使用 RosSharp 订阅任何主题。我完全在本地工作——在同一台机器上。我相当确定我有正确的 uri 和正确的端口,但无法进行任何通信。我通过 Win-ROS 运行ning ROS:https://ros-win.visualstudio.com/_git/ros-win?path=%2Fdoc%2FSetup.md&version=GBmaster
在我的本地 Windows 主机上,我正在 运行ning 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
以下是我附加到游戏对象的代码,如有任何帮助,我们将不胜感激。谢谢。
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);
}
}
在撰写本文时,ros-win 不支持 rosbridge,这是 rosSharp 可以与之通信的 ros-websocket 桥。如果unity一定要用ros-win和用RosSharp做websocket通讯,那就需要等待或者自己写rosbridge的端口
如果你能把ros-win换成ros on WSL,那么你就可以这样做:
安装 ros-websocket 桥接套件。 (注意:desktop-full 不包括这个,所以请确保你真的得到这个包)
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";
,以避免路由问题。
我无法使用 RosSharp 订阅任何主题。我完全在本地工作——在同一台机器上。我相当确定我有正确的 uri 和正确的端口,但无法进行任何通信。我通过 Win-ROS 运行ning ROS:https://ros-win.visualstudio.com/_git/ros-win?path=%2Fdoc%2FSetup.md&version=GBmaster
在我的本地 Windows 主机上,我正在 运行ning 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
以下是我附加到游戏对象的代码,如有任何帮助,我们将不胜感激。谢谢。
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);
}
}
在撰写本文时,ros-win 不支持 rosbridge,这是 rosSharp 可以与之通信的 ros-websocket 桥。如果unity一定要用ros-win和用RosSharp做websocket通讯,那就需要等待或者自己写rosbridge的端口
如果你能把ros-win换成ros on WSL,那么你就可以这样做:
安装 ros-websocket 桥接套件。 (注意:desktop-full 不包括这个,所以请确保你真的得到这个包)
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";
,以避免路由问题。