概述
远程通讯的建立
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模式
解决
最终在csdn中提问得到了回答,虚拟机需要设置成桥接模式才行。
最后
以上就是爱撒娇钢铁侠为你收集整理的通过ROS进行多机协同控制的全部内容,希望文章能够帮你解决通过ROS进行多机协同控制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复