ROS 2 集成概览
Gazebo 可以集成到 ROS 2 系统中。下面先介绍 Gazebo 与 ROS 之间可以实现的几种不同集成方式。
-
使用 ROS 启动 Gazebo:ROS 提供了一套特定的方式来启动系统中所需的全部组件,并有专门的 启动机制 来编排所有组件的启动,同时还提供了许多相关工具。Gazebo 也可以通过这种方式启动。
-
通过
ros_gzbridge(桥接) 使用 ROS 与 Gazebo 的 topic 交互:Gazebo 启动并运行后,与仿真进行通信是非常常见的需求,而 topic 是这种通信的常用方式。Gazebo 有自己的中间件 Gazebo Transport,它暴露了一组与 ROS 非常相似的 topic 和服务。ros_gzbridge 允许在 Gazebo 和 ROS 系统之间建立桥接,按需在 Gazebo Transport 和 ROS 2 之间进行转换。 -
使用 ROS 生成(spawn)Gazebo 模型:Gazebo world 可以包含启动时加载的模型。但有时需要在运行时生成模型,这项任务可以通过 ROS 2 完成。
在开始本教程之前,请先按照 安装 Gazebo 和 ROS 文档 操作。要继续后续内容,需要安装好可用的 ROS 2 和 Gazebo。
如果查看后续教程中提到的 launch 文件参数,会发现大多数情况下都包含两个参数:use_composition 和 create_own_container。当 use_composition 参数设置为 True 时,相关的 ROS node 会被加载到一个 ROS container(容器)中。此时,同一个 container 中的所有 node 共享同一个进程,可以利用进程内(intraprocess)通信。
create_own_container 参数只有在 use_composition 设置为 True 时才有意义。它用于决定是自己为可组合节点(composable node)启动一个 ROS container,还是使用外部已有的 container。
建议始终将 use_composition 参数设置为 True,然后根据配置决定是否需要创建自己的 container。通常,如果只处理自己的 launch 文件,可以将 create_own_container 设置为 True。另一方面,如果 launch 文件是一个更复杂启动流程的一部分,而该流程中已经存在一个 ROS container,那么应将 create_own_container 设置为 False,并把 container_name 参数设置为已有 container 的名称。
这样,Gazebo、bridge 以及其他潜在的 ROS node 之间的通信都将变为进程内通信。

该图展示了组合(composition)的概念。左侧示意图表示不使用组合的情况:三个示例 node 都是独立 node,它们可以通过 bridge 进行进程间(interprocess)通信。中间的示意图表示使用组合的场景:一个 ros_gz launch 文件创建了同时包含 Gazebo 和 bridge 的 ROS container,此外还有一个无法控制的外部消费 node。Gazebo 与 bridge 之间的所有通信都是进程内的,而外部消费 node 与 bridge 之间则是进程间通信。右侧示意图在全部 node 上都使用组合,但 ros_gz launch 文件不会直接启动自己的 container。仅凭这种配置本身无法工作,除非启动一个外部 ROS container(手动启动,或通过单独的 launch 文件启动)。在该示意图中,外部 ROS 消费 node 启动了 container。这里用 Nav2 的 logo 作为外部 ROS 2 消费 node 的示例。
更多关于 ROS 组合的知识,请参阅 此教程。
以下是后续教程,帮助进一步了解 Gazebo/ROS 集成。