admin 管理员组

文章数量: 886992

一、简介

在ROS1中由主节点(master)负责其它从节点的通信,在同一局域网内通过设置主节点地址也可以实现多机通讯,但是这种多机通讯网络存在一个严重的问题,那就是所有从节点强依赖于主节点,一旦运行主节点的设备离线,整个网络就完全瘫痪了,在ROS2中取消了主节点,通讯系统是基于DDS(Data Distribution Service)实现的,具有实时性、嵌入式、分布式、支持多操作系统等特性,下文我们将简单介绍ROS2多机通讯的配置方式。

ROS2本身就是一个分布式通信框架,局域网内多台机器上的节点默认即可实现互相通信,而实际控制节点是否可以互相通信是通过域ID(ROS_DOMAIN_ID)来控制的,同一域内的ROS2节点之间可以自由发现和发送消息,而不同域内的ROS2节点之间则不能。所有ROS2节点默认使用域 ID 0,所以默认即可互相通信

二、安装ROS2

我们使用的是树莓派5,由于树莓派5目前只支持Ubuntu23.04和24.04,因此我们安装24.04,且24.04只能安装Jazzy和Rolling版本(如果使用其他硬件的话最好选择humble版本)

所以我们最终选择的树莓派5+Ubuntu24.04+Rolling

笔记本的话我们选择Ubuntu22.04和Humble版本

因为不同版本之间的ROS2是可通信的且Humble的开源代码更多一点,我们只是将树莓派作为消息发布的平台,具体的计算还是需要笔记本来完成的。

比如rolling目前不支持NAV2建图

1. 树莓派安装ROS2

一键安装ROS2

打开终端,输入下面的指令。

wget http://fishros/install -O fishros && . fishros

输入密码,在选项界面选择1-一键安装ROS,接着根据你的情况选择是否更换系统源,接着等待一会就会让你选择要安装的ROS2版本了。这里选择rolling版本的ROS2即可。

接着会问你安装桌面版还是基础版,我们选择桌面版,包含可视化工具,如果是在树莓派上装可以使用基础版。

2. 笔记本安装ROS2

一键安装ROS2

打开终端,输入下面的指令。

wget http://fishros/install -O fishros && . fishros

输入密码,在选项界面选择1-一键安装ROS,接着根据你的情况选择是否更换系统源,接着等待一会就会让你选择要安装的ROS2版本了。这里选择humble版本的ROS2即可。

输出ros2可以看到如下内容

ROS2都安装好后,接下来就可以开始配置分布式通信了。

3. 出现问题可以这样卸载

sudo apt remove ros-humble-*
sudo apt autoremove

三、分布式通信

1. 什么叫分布式?

在ROS系统中,机器人功能是由各种节点组成的,这些节点可能位于不同的计算机中,这种结构可以将原本资源消耗较多的任务,分配到不同的平台上,减轻计算压力,这就是分布式通信框架的典型应用之一。

比如这款机器人系统中,有两个计算平台。

机器人体积比较小,不适合放一个笔记本电脑在上边,于是采用树莓派作为控制器,主要实现传感器驱动和电机控制等功能,不过视觉处理和应用功能就不适合在树莓派里运行了,我们放在另外一个性能更强的笔记本电脑中,此外我们还需要在电脑上监控机器人的传感器信息,并且远程控制机器人运动。

两个电脑之间的通信,看上去还有点复杂,毕竟相互传输的数据还挺多的,不过ROS系统都已经为我们设计好了,我们只需要在每一个电脑上配置好ROS环境,功能开发上完全不需要做任何变化,实现非常方便。

接下来,我们就带领大家一起来感受下ROS分布式系统的魅力

在学习ROS的过程中,如何通过树莓派作为主机,PC作为从机(安装的是windows+ubuntu双系统,当然虚拟机也可以),实现分布式通信。以下关于分布式框架的搭建流程。

2. 分布式网络搭建。

2.1 将设备连接同一个Wifi

首先将树莓派和PC都连接到手机的Wifi,这样IP是固定的且可以从手机上看到这两个设备的IP。

只要在树莓派开机前打开手机热点,树莓派开机后就会自动连接,不再需要配置。
打开热点界面即可看到,准备好这两个IP地址

2.2 修改配置文件

分别修改不同计算机的 /etc/hosts 文件,在该文件中加入对方的IP地址和计算机名:
@前面的为用户名,@后面的为计算机名

PC端打开终端输入如下

sudo nano /etc/hosts

下图为PC,即树莓派的IP为:192.168.43.179 计算机名:LAJ

PC端打开终端输入如下

sudo nano /etc/hosts

下图为树莓派端,即从机的IP为:192.168.43.235 计算机名为:LLL

设置完毕,可以通过 ping 命令测试网络通信是否正常。如图所示

ping 计算机名orIP地址


出现如图所示,说明主机与从机端的通信已经成功建立。

因为系统中只能存在一个Master,所以从机需要知道Master的位置。
在从机的.bashrc隐藏文件(ctrl+h打开)中添加如下内容:
ROS_HOSTNAME添加的是从机地址;
ROS_MASTER_URI添加的是主机地址。
打开终端输入:

sudo nano ~/.bashrc

在末尾插入
export ROS_MASTER_URI=http://主机IP:11311
export ROS_HOSTNAME=从机IP


在此,主从分布式框架已经搭建好了。

2.3 测试

树莓派配置完成后,确保已经和你所使用的电脑连接到了同一个局域网络中。接下来我们打通两个计算平台的通信能力。具体需要做什么呢?

简而言之,什么都不需要做。我们直接用命令行测试一下话题通信的效果。

在树莓派端,使用如下命令启动一个发布者节点:

ros2 run demo_nodes_cpp talker  #树莓派端

接下来在电脑端,使用如下命令启动一个订阅者节点:

ros2 run demo_nodes_py listener #PC端


神奇的事情就这样发生了,只要两个计算机安装好ROS2,并且处于同一网络中,他们就可以实现之前讲过的话题、服务、动作等通信了,感觉就像在一个电脑里一样。

不过这也会带来一个问题,如果一个网络中有很多个计算机,我们并不希望他们都可以互通互联,而是可以分组通信,小组之间是无法实现通信的。

2.4 分布式网络分组

没问题,ROS2提供了一个DOMAIN的机制,就类似分组一样,处于同一个DOMAIN中的计算机才能通信,我们可以在电脑和树莓派端的.bashrc中加入这样一句配置,即可将两者分配到一个小组中:

export ROS_DOMAIN_ID=<your_domain_id>


如果分配的ID不同,则两者无法实现通信。

本文标签: 通信 树莓派