【ROS】分布式通信架构

发布于:2025-04-09 ⋅ 阅读:(70) ⋅ 点赞:(0)

前言

在使用 ROS 时,我们常常会遇到某些设备计算能力不足的情况。例如,一辆搭载 ROS 的智能车,可能无法独立完成所有计算任务。此时,可以通过 ROS 的分布式通信架构,让其他设备协助其完成部分功能。


  • 什么是 ROS 分布式通信?

ROS 支持多个设备协同工作。通过网络连接,它们可以组成一个更大的 ROS 系统,实现节点之间的通信与协作。

  • 主机(Master):负责管理整个 ROS 系统,协调各个节点。
  • 从机(Slave):通过网络连接到主机,参与数据通信和处理任务。

本文示例说明

  • ROS 智能车(主机):运行激光雷达节点,发布激光数据。
  • 本地计算机(从机):运行 rviz,订阅并显示智能车的激光雷达数据。

通过这个例子,我们将介绍如何搭建一个简单的 ROS 分布式通信系统,让多台设备协同完成任务。


参考资料:

环境要求

  1. 所有设备需处于同一局域网中
  2. 各设备之间通过 IP 地址互相 ping 通,确保网络连接正常
  3. 建议安装相同版本的 ROS,以避免不必要的兼容性问题(ROS1 和 ROS2 各版本之间通常也具备一定兼容性)

主机设置(Master)

本文中,主机为 ROS 智能车,运行环境为 Ubuntu 18.04 + ROS Melodic

在 ROS 分布式系统中,主机就是运行 roscore 的设备roscore 可以理解为 ROS 的“心脏”,即使有多个设备参与,一整个 ROS 系统也只需要一个 roscore 实例。

下面先通过命令行手动设置环境变量,测试无误后可将其写入 ~/.bashrc 中以便自动加载。

# 设置 ROS Master 的地址(即运行 roscore 的设备 IP,端口默认 11311)
export ROS_MASTER_URI=http://<ROS智能车IP>:11311  

# 设置当前设备的 IP 地址(确保其他设备能访问到它)
export ROS_IP=<ROS智能车IP>   

# 可选项:设置当前设备的主机名,通常与 ROS_IP 一致
export ROS_HOSTNAME=<ROS智能车IP>

设置完成后,运行 roscore,并观察终端输出中的 ROS_MASTER_URI。只要它与我们之前通过 export 设置的地址一致,说明配置成功。

在这里插入图片描述

测试无误后,将上述环境变量写入主机的 ~/.bashrc 文件,以便每次开机自动加载


从机设置(Slave)

本文中,从机为本地计算机,运行环境为 WSL2 + Ubuntu 20.04 + ROS Noetic

在 ROS 的分布式系统中,从机依赖主机运行的 roscore 来完成 ROS 通信。可以理解为从机共享主机的“心脏”,协同处理任务,共同构成一个完整的 ROS 系统。

我们先通过命令行手动设置以下环境变量,测试无误后再将其写入 ~/.bashrc,实现自动加载:

# 设置 ROS Master 的地址(即主机设备 IP,端口默认 11311)
export ROS_MASTER_URI=http://<主机设备IP>:11311  

# 设置当前设备的 IP 地址(确保其他设备能访问到它)
export ROS_IP=<本地计算机IP>   

# 可选项:设置当前设备的主机名,通常与 ROS_IP 一致
export ROS_HOSTNAME=<本地计算机IP>

配置完成后,运行 rostopic list,检查终端输出中的当前正在运行的节点。如果能看到主机上的 roscore 发布的 rosout 话题,说明配置成功。

在这里插入图片描述
测试无误后,将上述环境变量添加到从机的 ~/.bashrc 文件中,以便每次开机自动加载


主机与从机通信测试

- 在主机上发布话题(确保 roscore 正在运行):

rostopic pub /test_topic std_msgs/String "Hello from Master" -r 1

- 在从机上订阅该话题:

rostopic echo /test_topic

如果从机能够接收到数据(如下图),则说明主机与从机的通信正常。

在这里插入图片描述


本文示例

启动ROS智能车激光雷达节点

在 ROS 智能车上启动激光雷达节点,该节点将负责发布激光雷达的数据。
在这里插入图片描述

本地计算机配置与订阅

在本地计算机上的 ROS 系统中,启动 rviz,并订阅来自智能车的激光雷达数据。
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到