LoongLee's blog

ROS2_Topic_Forwarding

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 stopsystemctl stop firewalld 临时关闭测试

相关页面


最后更新: 2026-04-30

ROS2 ROS2