我有一个C ++ ROS节点,它使用ROSBridge通过端口9090上的TCP WebSocket通过ROS字符串将ROS主题作为JSON字符串发送。在同一台计算机上,我有一个C#Unity程序,该程序需要访问JSON并发送它自己的一些内容。如果我将此程序放在另一台计算机上没有问题,那么我可以访问端口9090并查看JSON。但是,如果它与ROSBridge主机位于同一台计算机上,则使用同一端口会有冲突。因此,这两个应用程序不能在同一台PC上相互通信,但是可以在不同的PC上进行通信。
那我该怎么办?端口必须匹配并且总是冲突吗,或者我可以以某种方式使进程A在9090上发送但在9091与进程B上相反?还有其他选择吗?本质上,我正在尝试让Unity参与ROS通信,但它对此没有本地支持,因此没有使用ROSBridge JSON字符串的解决方法。
答案 0 :(得分:0)
根据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%20Tools的roslaunch
文档,您还可以在命令行上将参数传递给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
文件,如果这个答案不清楚,我可以为您提供更多有关如何编辑它们的建议。
答案 1 :(得分:0)
听起来我缺乏对端口的了解。 ROSBridge的主机已设置为使用端口9090,因此,希望连接到该主机的任何人都将请求主机的端口9090进行连接,但仍将使用其自己需要的任何端口。在这两个应用程序中,我都可以声明“主机”端口为9090,而不会发生冲突,因为客户端应用程序仍会打开一个随机的其他端口供自己连接到主机端口。因此,我遇到的麻烦不是“端口共享”,而是因为这不是正在发生的事情。 9090上只有一个主机。