ROS 2 Humble 多机通信配置:3步实现Ubuntu 22.04主机与Raspberry Pi协同
📅 2026/7/9 21:15:44
👁️ 阅读次数
📝 编程学习
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-pi2.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 ~/.bashrc2.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 verbose3. 分布式通信验证
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、机械臂控制器)
通过合理的多机分工,可以显著提升系统整体性能。例如,在树莓派上运行传感器驱动,将处理后的数据通过高效的话题通信发送到主机进行融合计算,再将控制指令返回给树莓派执行。
编程学习
技术分享
实战经验