如何实现ROS1 Noetic与ROS2 Humble跨机器话题发布订阅通信?
ROS1 Noetic与ROS2 Humble跨机器话题通信方案
可行,官方提供的ros1_bridge工具可以实现ROS1和ROS2跨版本跨机器的话题通信,以下是具体实现步骤和注意事项:
一、前提准备
- 两台机器处于同一局域网,能互相ping通,建议在各自的
/etc/hosts文件中添加对方的IP与主机名映射,避免DNS解析问题。 - 选择一台机器(可以是机器1、机器2或第三台独立机器)作为桥接节点,该机器需要同时安装ROS1 Noetic和ROS2 Humble环境。
二、桥接节点配置
安装双ROS环境:
在桥接机器上分别安装ROS1 Noetic和ROS2 Humble,可临时手动加载环境变量:source /opt/ros/noetic/setup.bash source /opt/ros/humble/setup.bash安装ros1_bridge:
通过apt安装适配ROS2 Humble的桥接工具:sudo apt install ros-humble-ros1-bridge
三、启动通信流程
机器1(ROS1 Noetic)操作:
- 设置ROS环境变量,启动roscore和Publisher1节点:
export ROS_MASTER_URI=http://<机器1IP>:11311 export ROS_IP=<机器1IP> roscore & # 启动你的Publisher1节点,示例: rosrun <你的包名> Publisher1
- 设置ROS环境变量,启动roscore和Publisher1节点:
桥接节点操作:
- 配置ROS1环境变量指向机器1的roscore,同时配置ROS2环境变量:
export ROS_MASTER_URI=http://<机器1IP>:11311 export ROS_IP=<桥接机器IP> export ROS_DOMAIN_ID=0 # 需与机器2的ROS2环境DOMAIN_ID一致 export ROS_LOCALHOST_ONLY=0 - 启动动态桥接(自动识别并桥接所有兼容的话题):
若仅需桥接指定话题,可使用静态桥接(以ros2 run ros1_bridge dynamic_bridgestd_msgs/String类型为例):ros2 run ros1_bridge ros1_bridge --bridge-topic /sampletopic std_msgs/String
- 配置ROS1环境变量指向机器1的roscore,同时配置ROS2环境变量:
机器2(ROS2 Humble)操作:
- 设置ROS2环境变量,启动Subscriber1节点:
export ROS_DOMAIN_ID=0 export ROS_LOCALHOST_ONLY=0 # 启动你的Subscriber1节点,示例: ros2 run <你的包名> Subscriber1
- 设置ROS2环境变量,启动Subscriber1节点:
四、关键注意事项
- 消息类型兼容性:仅支持ROS1和ROS2中定义一致的消息类型(如标准消息
std_msgs、sensor_msgs等)。若使用自定义消息,需在ROS1和ROS2环境中分别编译相同的消息包,确保消息字段、类型完全匹配。 - 网络稳定性:跨机器通信依赖局域网稳定性,若出现丢包延迟,需检查网络连接质量。
- 环境变量冲突:同时加载ROS1和ROS2环境时,部分命令可能存在命名冲突,建议通过终端临时加载环境变量,而非长期写入
~/.bashrc。
内容的提问来源于stack exchange,提问作者NatiCog
相关产品推荐
相关产品推荐

