【ROS】分布式通信架构
- 前言
- 环境要求
- 主机设置(Master)
- 从机设置(Slave)
- 主机与从机通信测试
- 本文示例
- 启动ROS智能车激光雷达节点
- 本地计算机配置与订阅
前言
在使用 ROS 时,我们常常会遇到某些设备计算能力不足的情况。例如,一辆搭载 ROS 的智能车,可能无法独立完成所有计算任务。此时,可以通过 ROS 的分布式通信架构,让其他设备协助其完成部分功能。
- 什么是 ROS 分布式通信?
ROS 支持多个设备协同工作。通过网络连接,它们可以组成一个更大的 ROS 系统,实现节点之间的通信与协作。
- 主机(Master):负责管理整个 ROS 系统,协调各个节点。
- 从机(Slave):通过网络连接到主机,参与数据通信和处理任务。
本文示例说明:
- ROS 智能车(主机):运行激光雷达节点,发布激光数据。
- 本地计算机(从机):运行
rviz
,订阅并显示智能车的激光雷达数据。
通过这个例子,我们将介绍如何搭建一个简单的 ROS 分布式通信系统,让多台设备协同完成任务。
参考资料:
- ROS分布式部署通信
环境要求
- 所有设备需处于同一局域网中
- 各设备之间通过 IP 地址互相 ping 通,确保网络连接正常
- 建议安装相同版本的 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
,并订阅来自智能车的激光雷达数据。