ROS 2 Humble 多机通信配置:3步实现Ubuntu 22.04主机与Raspberry Pi协同

ROS 2 Humble 多机通信实战:Ubuntu 22.04与树莓派协同开发指南

当我们需要将复杂的机器人算法从开发环境部署到嵌入式硬件时,多机通信配置成为关键环节。本文将手把手教你如何在Ubuntu 22.04主机与运行ROS 2 Humble的树莓派(如4B型号)之间建立稳定可靠的分布式通信系统。

1. 环境准备与基础配置

在开始配置之前,我们需要确保所有设备都安装了相同版本的ROS 2 Humble。树莓派推荐使用64位Ubuntu Server 22.04 LTS作为操作系统,以获得最佳兼容性。

1.1 系统要求检查

  • 主机配置

    • Ubuntu 22.04 LTS
    • ROS 2 Humble Hawksbill
    • 稳定的网络连接(建议使用有线网络)
  • 树莓派配置

    • Ubuntu Server 22.04 LTS (64-bit)
    • ROS 2 Humble Hawksbill
    • 至少4GB内存(推荐8GB)

提示:可以使用lsb_release -a命令验证系统版本,ros2 -v验证ROS 2版本。

1.2 网络拓扑规划

典型的机器人开发网络拓扑如下:

设备类型IP地址范围角色说明
开发主机192.168.1.100主控制节点
树莓派192.168.1.101从节点/执行器
其他设备192.168.1.102+传感器/执行器等

确保所有设备在同一局域网内,并能互相ping通:

ping -c 4 192.168.1.101 # 从主机ping树莓派

2. 核心配置三步曲

2.1 网络设置与主机名解析

首先在所有设备上编辑/etc/hosts文件,添加主机名解析:

sudo nano /etc/hosts

添加以下内容(根据实际IP修改):

192.168.1.100 desktop-pc 192.168.1.101 raspberry-pi

验证解析是否生效:

ping raspberry-pi

2.2 环境变量配置

在每个设备的~/.bashrc文件末尾添加以下ROS环境变量:

# 设置ROS 2发行版 source /opt/ros/humble/setup.bash # 设置ROS_DOMAIN_ID(所有设备必须相同) export ROS_DOMAIN_ID=42 # 设置主控节点URI(仅在从节点上需要) export ROS_MASTER_URI=http://desktop-pc:11311

使配置立即生效:

source ~/.bashrc

2.3 防火墙与多播设置

Ubuntu默认的ufw防火墙会阻止ROS 2通信,需要开放相关端口:

sudo ufw allow 11311/tcp # ROS主端口 sudo ufw allow 7400:7500/udp # DDS发现端口 sudo ufw allow 19000:19100/udp # DDS数据端口

验证防火墙状态:

sudo ufw status verbose

3. 分布式通信验证

3.1 基础话题测试

在主机上启动一个简单的发布者:

ros2 topic pub /test_topic std_msgs/msg/String "data: 'Hello from Desktop'" -r 1

在树莓派上启动订阅者:

ros2 topic echo /test_topic

你应该能在树莓派终端看到来自主机的消息。

3.2 高级服务调用示例

创建一个简单的服务示例来验证双向通信:

服务定义 (srv/AddTwoInts.srv):

int64 a int64 b --- int64 sum

服务端 (Python) - 在树莓派运行:

from example_interfaces.srv import AddTwoInts import rclpy def handle_add_two_ints(request, response): response.sum = request.a + request.b return response rclpy.init() node = rclpy.create_node('add_two_ints_server') srv = node.create_service(AddTwoInts, 'add_two_ints', handle_add_two_ints) rclpy.spin(node)

客户端 (Python) - 在主机运行:

from example_interfaces.srv import AddTwoInts import rclpy rclpy.init() node = rclpy.create_node('add_two_ints_client') cli = node.create_client(AddTwoInts, 'add_two_ints') req = AddTwoInts.Request() req.a = 5 req.b = 7 cli.wait_for_service() future = cli.call_async(req) rclpy.spin_until_future_complete(node, future) if future.result() is not None: print(f"Result: {future.result().sum}") else: print("Service call failed")

4. 性能优化与故障排除

4.1 网络延迟优化

对于实时性要求高的应用,可以调整DDS QoS设置:

# 在发布者节点中添加 from rclpy.qos import QoSProfile, QoSReliabilityPolicy qos_profile = QoSProfile( depth=10, reliability=QoSReliabilityPolicy.RELIABLE # 或BEST_EFFORT )

4.2 常见问题解决

问题1:节点无法发现彼此

  • 检查ROS_DOMAIN_ID是否一致
  • 验证网络连接和防火墙设置
  • 尝试使用export ROS_LOCALHOST_ONLY=0

问题2:高延迟或丢包

  • 改用有线网络连接
  • 调整DDS配置(如切换Fast DDS或Cyclone DDS)
  • 减少话题数据量或降低发布频率

问题3:权限问题

  • 确保用户加入了dialout组:
    sudo usermod -aG dialout $USER

5. 实际应用案例:分布式机器人控制

一个典型的移动机器人系统可能包含以下节点分布:

  • 主机:运行SLAM、导航等计算密集型算法
  • 树莓派:处理传感器数据(如LiDAR、摄像头)和电机控制
  • 其他设备:专用传感器节点(如IMU、机械臂控制器)

通过合理的多机分工,可以显著提升系统整体性能。例如,在树莓派上运行传感器驱动,将处理后的数据通过高效的话题通信发送到主机进行融合计算,再将控制指令返回给树莓派执行。