通过ROS进行多机协同控制

远程通讯的建立

ros 本身就是一个分布式节点通讯架构,使节点之间进行信息通讯是其重要的作用。一般来说,我们都是在一个系统里进行ros系统的运行通讯的,其实一直这么做就有点让ros 的分布式通讯机制显得格局小了。其实ROS的这种分布式通讯机制是可以衍衍生到整个局域网的,处在同一个局域网中的设备都能进行通讯。下面就是对ros的多机通讯测试的说明:

在做这个之前,需要了解一下ROS的几个通讯配置,即ROS_MASTER_URI和ROS_IP

    URI 是什么,因为我不是做网络通讯的,讲不出多么正确的定义,知道它是个标识就行了,即身份标识。 ROS_MASTER_URI 是 ROS 启动 roscore 时的地址,就是 master 的 地址。 ROS_IP 为本地的 ip 地址

而这个两者的意义或者作用在哪?——通讯上,更准确的是 远程通讯

    有拉回到本片文章所说的 同于局域网张同时协同控制多个设备,控制的想法就是 利用电脑(作为ros master 的运行者)作为主机,而处在局域网中的 其他 ros 机器人(比如A 、B 、C 等)作为从机机器人。 此时ROS_MASTER_URI的地址就是主机的,即电脑

(1)连接到同一个wifi

    提示:两设备连接到同一个wifi后,使用ifconfig 查看两设备的各自 ip地址,最好再使用 ping + ip 方式 相互ping 一下,ping 通的情况下,后面的操作才能成功。

(2)如下方为例:

主机(虚拟机) ip :192.168.1.1 从机(jetson tx2) ip :192.168.1.2

(3)在主机和从机的环境配置文件 ~/.bashrc中添加: 11311 这个是端口号,roscore运行时的默认串口 主机:

export ROS_MASTER_URI=http://192.168.1.1:11311
export ROS_IP=192.168.1.1

从机

export ROS_MASTER_URI=http://192.168.1.1:11311
export ROS_IP=192.168.1.2

就是保证同一个master 地址

如何嫌使用ip麻烦,可以在 /etc/hosts 中声明

sudo gedit /etc/hosts

加入:

192.168.1.2	follow
192.168.1.1	master

中间使用 tab 键间隔,保存后,在使用ip时只需要用后面的名字就好了。

在测试中,我建议还是使用 jetson tx2 作为运行 master 的一方,因为使用了export ROS_MASTER_URI 后roscore的运行会被固定在这个ip上,但是当没有这个ip(也就是没有同一个wifi时),roscore就运行不了。这会给虚拟机独自运行产生不便。

启发

利用以上的方法,在同一局域网中,可以添加多个机器人,让一个机器人作为master运行者,其他只需设定ROS_MASTER_URI与ROS_IP 就可以实现多机器人系统控制了。

出现的问题

虚拟机的 ubuntu 能够 ping 通 处在同一局域网的 jetson tx2 设备,但是jetson tx2 只能 ping 通虚拟机所在主机window下的ip,但是ping 不通虚拟机的ip,从而导致了在进行ros通讯测试时,虚拟机只能作为一个订阅者接收到jetson tx2 作为发布者发送的消息,而虚拟机作为发布者时,jetson tx2作为订阅者却什么都接收不到。 通俗的讲,在同一局域网中,虚拟机找得到jetson tx2,但是jetson tx2找不到虚拟机 已经排除问题: (1)windows的防火墙已关闭,ubuntu 的防护墙也关闭 (2)虚拟机使用net模式

解决

最终在中提问得到了回答,虚拟机需要设置成桥接模式才行。

经验分享 程序员 微信小程序 职场和发展