5分钟快速搭建:使用ros1_bridge实现ROS2容器与ROS1主机的无缝通信
最近在做一个机器人原型验证项目,硬件平台跑的是经典的ROS Noetic,但新开发的感知模块是基于ROS2 Foxy写的。团队里有人提议干脆把整个系统都升级到ROS2,但考虑到硬件驱动和大量已有节点的稳定性,这个方案风险太高。另一个方案是重写感知模块,时间成本又让人头疼。就在纠结的时候,我想起了ros1_bridge这个官方工具。它就像一个翻译官,能让ROS1和ROS2这两个“说不同语言”的系统直接对话。更妙的是,我们可以把ROS2环境封装在Docker容器里,实现与宿主机ROS1的隔离与通信。这样一来,既不用动老代码,又能用上新框架的特性。下面我就把这次快速搭建的实战经验,特别是那些容易踩坑的细节,完整地分享出来。
1. 核心思路与环境准备
为什么要把ROS2放在容器里?这其实是一种非常实用的工程策略。ROS1(Noetic)和ROS2(Foxy/Humble)在底层架构(如DDS vs. ROS Master)、通信模型(话题/服务/动作)上存在根本差异,直接在同一系统上安装共存,很容易导致环境变量冲突、依赖库版本打架等问题。使用Docker容器化ROS2,相当于为它创建了一个独立的、纯净的沙箱环境。我们的ROS1主机(通常是稳定的生产或开发环境)完全不受影响,而ros1_bridge则作为一座精心设计的桥梁,只负责在两者之间转发特定的消息数据。
这种架构带来了几个明显的好处:
- 环境隔离:ROS1和ROS2的安装包、库、Python版本互不干扰。
- 部署便捷:ROS2容器可以作为一个标准镜像,在不同机器上快速复制和启动。
- 降低风险:即使ROS2侧的实验性代码出现问题,也不会导致ROS1主系统崩溃。
- 灵活性:可以轻松切换不同的ROS2发行版(如Foxy, Humble, Iron)进行测试。
在开始动手之前,你需要确保基础环境就绪。这里假设你的主机已经安装了ROS Noetic。
主机(ROS1侧)基础检查清单:
- Ubuntu 20.04(ROS Noetic的官方支持系统)。
- ROS Noetic 已正确安装并配置(
source /opt/ros/noetic/setup.bash后能运行roscore)。 - Docker 引擎已安装并运行。可以通过以下命令验证:
docker --version sudo systemctl status docker | grep Active
关于网络模式的选择:为了让容器内的ROS2节点能方便地与主机ROS1通信,我们通常使用 --network host 模式启动容器。这意味着容器与主机共享网络命名空间,容器内的服务直接使用主机的IP和端口。这样,ros1_bridge就能直接连接到主机上运行的 roscore(ROS Master)。如果你对Docker网络不熟悉,记住这一点:在本次搭建中,使用host网络模式是最简单直接的选择。
2. 构建ROS2容器并配置桥梁
我们的第一步是创建一个包含ROS2和ros1_bridge的Docker容器。虽然可以从头构建,但为了真正实现“快速”,我们选择利用ROS官方镜像和预编译的二进制包。
2.1 启动基础容器并注入ROS2
首先,从Docker Hub拉取ROS Noetic的基础镜像并启动一个容器。这里选择noetic-ros-core作为基础,因为它体积相对
244




被折叠的 条评论
为什么被折叠?



