ROS2 Topic 数据转发
来源:
sources/ROS2 topic数据转发.md
方案对比
| 转发方式 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
| DDS 原生跨机通信 | 零代码、实时性强、ROS2 默认支持 | 需要多播、网络必须通、路由器可能屏蔽 | 同局域网 / Tailscale 局域网 |
| rosbridge / WebSocket 网关 | 不依赖多播、穿透能力强 | 稳定性略差于 DDS、需要中间节点 | 跨公网、跨子网、VPN、多播不通 |
DDS 原生跨机通信
环境要求
- 两台主机处于同一局域网或 VPN(如 Tailscale)
- 都已安装 ROS 2(Humble / Iron)
- 防火墙可开放 DDS/RTPS 端口
设置 ROS_DOMAIN_ID
export ROS_DOMAIN_ID=10
# 持久化
echo "export ROS_DOMAIN_ID=10" >> ~/.bashrc
source ~/.bashrc
范围:0–232。确保 Host A 与 Host B 一致。
测试多播(必须)
# Host A 发
iperf -s -u -B 239.255.0.1 -i 1
# Host B 收
iperf -c 239.255.0.1 -u -T 32 -t 30 -i 1 -B x.x.x.x
防火墙开放 DDS 端口
sudo firewall-cmd --add-port=7400/udp --permanent
sudo firewall-cmd --add-port=7410/udp --permanent
sudo firewall-cmd --add-port=7411-7420/udp --permanent
sudo firewall-cmd --reload
跨机通信测试
# Host A(发布者)
ros2 topic pub /chatter std_msgs/String "{data: 'hello'}"
# Host B(订阅者)
ros2 topic echo /chatter
验证 DDS 是否正常工作
ros2 multicast receive
ros2 multicast send
常见问题
| 问题 | 表现 | 解决 |
|---|---|---|
| 多播不通 | ros2 topic list 看不到对方 topic |
VPN 开启多播转发;云服务器必须使用方法 2 |
| Docker 隔离 | 容器内无法通信 | docker run --net=host ... |
| DOMAIN_ID 不一致 | 完全无法通信 | 确保两台机器一致 |
| 跨子网 | RTPS 依赖广播/多播 | 使用 Tailscale + subnet router 或方法 2 |
| 防火墙 | 连接被拒绝 | ufw stop 或 systemctl stop firewalld 临时关闭测试 |
相关页面
- ROS2_Introduction - ROS2 简介
- ROS2_Commands - ROS2 常用命令
最后更新: 2026-04-30