ROS是一种分布式软件框架,节点之间通过松耦合的方式进行组合。

如何实现分布式多机通信

(1)设置IP地址,确保底层链路的联通

在 ubuntu 下输入如下指令,查询 ubuntu 的ip地址:

ifconfig

ROS 分布式通信_ip地址

在树莓派的终端中输入如下指令

sudo vi /etc/hosts

Ubuntu vi文本编辑器使用方法​

在 hosts 文件中添加ubuntu的ip地址和名称
ROS 分布式通信_ip地址_02

测试配置的地址是否联通

ping [配置的计算机名称]

例如:

ping ubuntu

ROS 分布式通信_ip地址_03

在 树莓派 下输入如下指令,查询 树莓派 的ip地址:

ifconfig

ROS 分布式通信_ip地址_04

然后在树莓派的终端中输入如下指令

sudo gedit /etc/hosts

添加树莓派的ip地址 和名称
ROS 分布式通信_ubuntu_05

测试配置的地址是否联通

ping [配置的计算机名称]

例如:

ping huike

ROS 分布式通信_ubuntu_06

做完以上操作,如果双向网络畅通,说明底层网络通信已经没有问题,主机与树莓派之间的网络已经联通。

设置ROS_MASTER_URI

接下来是如何实现分布式多机通信
(2)在从机端设置ROS_MASTER_URI,让从机找到ROS Master

主机端 ubuntu 启动ROS Master 与海龟仿真节点

roscore

然后在树莓派编辑 .bashrc 文件 设置ROS Master的位置

vi .bashrc

在 .bashrc 文件最后一行添加以下代码中的任意一个。

export ROS_MASTER_URI=http://ubuntu:11311                          #(当前终端有效)
export ROS_HOSTNAME=ubuntu

或在终端中输入,以下指令在所有终端都有效。

echo "export ;ROS_MASTER_URI=http://hcx-pc:11311">> ~/.bzshrc  
echo "export ;ROS_HOSTNAME=ubuntu">> ~/.bzshrc

注:ROS Master 默认的端口号为:11311
ROS 分布式通信_ip地址_07

从机终端输入:

source ~/.bashrc
source /etc/init.d/networking

注意:当设置从机 ROS_MASTER_URI 为主机(不为从机本机)后,从机上是不能运行 roscore 的。

主机 ubuntu 启动海龟节点

rosrun turtlesim turtlesim_node

ROS 分布式通信_树莓派_08
在从机树莓派上输入:

rostopic list

若能成功显示话题名,则说明成功。

ROS 分布式通信_ip地址_09

查看具体的节点信息

rosnode info /rosout

ROS 分布式通信_ubuntu_10

问题解决

注意:在使用树莓派ping 虚拟机中的 ubuntu ping不通的情况下,显示如下:
ROS 分布式通信_ubuntu_11

如果 ping 不通则关闭 ubuntu 的防火墙或者更改VMware网络连接模式,就可以ping通。以下是解决 ping 不通的方法。

如果linux虚拟机可以ping通树莓派,树莓派无法ping通虚拟机

更改VMware网络连接模式

  • 将VMware的网络连接模式修改为 桥接模式
    ROS 分布式通信_ip地址_12
  • 查看是否安装 VMware Bridge Protocol

ROS 分布式通信_ip地址_13

查看当前防火墙状态

在Ubuntu中 我们使用以下命令查看当前防火墙状态。

sudo ufw status
  • inactive状态是防火墙关闭状态
  • active是防火墙开启状态。

ROS 分布式通信_ubuntu_14

开启防火墙

在Ubuntu中 使用以下命令来开启防火墙

sudo ufw enable

开启后,查看当前防火墙状态

sudo ufw status

开启防火墙后的状态为active,说明防火墙开启成功。
ROS 分布式通信_ip地址_15

关闭防火墙

在Ubuntu中 使用以下命令来关闭防火墙。

sudo ufw disable

关闭后,查看当前防火墙状态

sudo ufw status

如果是显示的状态位 inactive 说明防火墙已经关闭掉了。
ROS 分布式通信_ubuntu_16
完成以上操作,可以使树莓派ping 通设置的 ubuntu 的 IP 地址