【问题标题】:Using ROSBridge Between Two Processes on the Same Computer在同一台计算机上的两个进程之间使用 ROSBridge
【发布时间】:2019-06-09 12:09:09
【问题描述】:

我有一个 C++ ROS 节点,它使用 ROSBridge 通过 TCP WebSocket 在端口 9090 上将 ROS 主题作为 JSON 字符串发送。在同一台计算机上,我有一个 C# Unity 程序需要访问 JSON 并发送它自己的一些。如果我把这个程序放在另一台计算机上没有问题——我可以访问端口 9090 并查看 JSON。但是如果和ROSBridge Host在同一台电脑上,那么使用同一个端口就会有冲突。因此,这两个应用程序无法在同一台 PC 上相互通信,但它们可以在不同的 PC 上进行通信。

那我该怎么办?端口是否必须匹配并因此总是发生冲突,或者我可以以某种方式使进程 A 在 9090 上发送但在 9091 上接收而进程 B 正好相反或什么?还有其他选择吗?从本质上讲,我正在尝试让 Unity 参与 ROS 通信,但它没有对此的原生支持,因此没有使用 ROSBridge JSON 字符串的解决方法。

【问题讨论】:

    标签: c# c++ tcp websocket ros


    【解决方案1】:

    根据http://wiki.ros.org/rosbridge_suite/Tutorials/RunningRosbridge,您可以在.launch 文件中设置Rosbridge 通话的端口。

    如果您使用的是示例rosbridge_websocket.launch 文件,则文件的第二行包含<arg name="port" default="9090" /> 形式的端口号。 您可以更改9090 来更改它使用的默认端口。


    根据http://wiki.ros.org/roslaunch/Commandline%20Toolsroslaunch 文档,您还可以在命令行上将参数传递给roslaunch

    rosbridge_websocket.launch 文件根据参数“port”设置端口,因此如果您像这样运行 roslaunch,它将使用端口 8080:

    roslaunch rosbridge_server rosbridge_websocket.launch port:=8080


    您可以在https://github.com/RobotWebTools/rosbridge_suite/blob/develop/rosbridge_server/launch/rosbridge_websocket.launch查看完整的 rosbridge_websocket.launch 文件

    查看该文件中的<param name="port" value="$(arg port)"/> 行,我知道它使用“port”参数来设置端口。


    如果您发布您的 .launch 文件,如果此答案不清楚,我可以就如何编辑它们提供更多建议。

    【讨论】:

    • 嗨,克里斯。这不会改变两个进程访问同一端口的固有问题。如果我告诉 RosBridge 使用端口 8080 而不是 9090,那么我仍然必须告诉我的第二个进程使用 8080 而不是 9090,并且它们现在都再次使用相同的端口。如果我将进程 2 留在 9090,那么他们将永远无法连接。
    • 我只是误解了套接字的工作原理吗?这两个进程是否可以拥有不同的套接字并且仍然能够以某种方式进行通信?
    • @CodeMonkey 是的,我认为你误解了一些东西。只有 SERVER 需要位于已知端口上。客户端将与该端口通信以获取数据。客户端确实使用了一个端口,但它只是在启动时选择了一个空端口。即使双方都有一个端口,你设置的端口始终是 LISTENING 端口。因此,如果一个在 9090 上收听,另一个在 8080 上收听,那么它们可以共存,并且可以相互通话。同样,当他们说话时,他们将使用与他们监听的端口不同的端口。我猜你只需要这两个中的一个来听,但我不知道是哪个。
    • @CodeMonkey 当你告诉 Unity 如何与 Rosbridge 对话时,地址的格式是什么?很酷的是,您只需将端口号添加到地址中即可告诉 Unity 在不同的端口上呼叫,然后将 Rosbridge 放在该端口上。
    • 好的,在 Unity 应用程序中,我为它连接的“主机”选择一个 IP 和一个端口。因此,也许我仍然为此说 9090,但这不一定是它本身正在使用的那个。我尝试交换我正在使用的计算机,这可能不是我想的共享端口的问题。 Unity 似乎仍然无法访问该特定(Ubuntu)机器上的网络。所以我认为我缺少某种权限。不知道是什么! Unity 可以从另一台进来的机器连接,但不能从那台出去的机器上连接。
    【解决方案2】:

    听起来我缺乏对端口的理解。 ROSBridge 的主机被设置为使用端口 9090,因此任何希望连接到它的人都将请求主机的端口 9090 进行连接,但仍将使用它自己想要的任何端口。在这两个应用程序中,我可以声明“主机”端口是 9090 没有冲突,因为客户端应用程序仍然会打开一个随机的其他端口供自己使用以连接到主机端口。因此,我遇到的麻烦不是“端口共享”,因为这不是正在发生的事情。只有一个在 9090 上托管。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-08
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多