详细介绍colcon和ament的关系,以及它们在 ROS 2 构建系统中的角色和区别
Colcon 与 Ament 的关系详解
在 ROS 2 的构建系统里,两个名字经常同时出现:ament 和 colcon。很多初学者会混淆它们的作用。实际上,它们处在不同的层级:ament 是构建工具链(build system),colcon 是构建任务管理器(build orchestration tool)。
本文将从发展历史、功能定位、关系逻辑、使用场景等方面详细阐述。
1. 背景与历史
ROS 1时代
- 使用的是 catkin 构建系统(基于
CMake+ Python 工具)。 - 使用
catkin_make或catkin build(来自catkin_tools)进行工作空间编译。 - 一次编译时可以处理多个包,但对跨语言、多种构建类型的支持有限。
ROS 2的过渡
- 需要更加灵活、可扩展的构建系统,支持:
- CMake、Python、非ROS软件包的混合
- 更强的依赖管理
- 更好的可扩展性和插件机制
- 因此诞生了 ament,对应的是 ROS 2 的核心构建架构。
- 随着项目规模扩大,开发了 colcon 来替代 ROS 2 早期的
ament_tools,实现更强的批量构建与任务调度能力。
2. 两者的功能定位
Ament
- 性质:一种构建系统(build system)和包管理框架,专为 ROS 2 定制。
- 核心作用:
- 定义 ROS 2 软件包的构建规则(CMake 宏、Python 构建支持等)。
- 提供
ament_cmake,ament_python等插件来支持不同类型的包。 - 管理包的元数据(
package.xml),并生成安装结构、测试规则等。
- 底层构建依赖:
- C++/C 项目 → 调用
CMake - Python 项目 → 调用
setuptools
- C++/C 项目 → 调用
- 本质角色:构建单个软件包的工具链。
Colcon
- 性质:批量构建工具(multi-package build tool)。
- 核心作用:
- 读取工作区(workspace)的多个包,根据依赖拓扑决定构建顺序。
- 调用特定的构建系统(例如
ament、cmake、setuptools)来构建每个包。 - 提供并行构建、增量构建、日志管理、测试批量运行等功能。
- 可扩展插件以支持非ROS项目。
- 本质角色:任务调度器 + 构建流程管理器。
3. 关系逻辑
我们可以把两者的关系类比成 “高铁调度系统” 和 “造车厂”:
- ament = 工厂:定义如何制造一辆车(即构建一个 ROS 2 包),包括用什么零件(CMake宏)、装配顺序、测试流程等。
- colcon = 高铁调度中心:负责在一个大地图(workspace)上安排多辆车的生产和出厂顺序,调度并行任务,按依赖图排序。
具体关系:
colcon build启动构建流程。- colcon 扫描工作区内所有包及其依赖关系。
- 对于每个包,colcon 会调用它对应的构建系统插件:
- ROS 2 C++包:
ament_cmake - ROS 2 Python包:
ament_python - 其他类型包:
cmake,setup.py, 甚至是make(如果插件支持)
- ROS 2 C++包:
ament实际执行构建动作,生成二进制文件、安装目录、测试目标等。- colcon 收集日志、处理错误、控制并发和增量编译。
4. 使用场景示例
构建 ROS 2 工作区:
# 假设 src/ 下有多个 ROS 2 软件包
colcon build --symlink-install
- colcon:
- 找到所有包,分析依赖。
- 调度不同构建任务(可能是 ament 或其他系统)。
- ament:
- 按包类型执行
ament_cmake或ament_python宏来构建每个包。
- 按包类型执行
测试:
colcon test
- colcon 批量运行测试
- ament 提供测试集成(
ament_lint,ament_cmake_gtest等)
5. 总结对照表
| 方面 | ament | colcon |
|---|---|---|
| 角色 | 构建系统(单包构建工具链) | 批量构建工具(多包任务调度) |
| 主要职责 | 定义和执行单个 ROS 2 包的构建规则 | 在整个工作区中协调构建所有包 |
| 能否单独使用 | 可以(只构建一个包时) | 不行,需要依赖实际构建系统(ament/cmake等) |
| 可扩展性 | 支持不同类型的包构建插件 | 支持多种构建系统插件 |
| 与 ROS 关系 | ROS 2 核心构建系统 | ROS 2 官方推荐的批量构建工具 |
6. 关系一句话总结
Colcon 是 orchestrator(调度器),Ament 是 builder(构建器)。在 ROS 2 中,colcon 负责总体构建任务,而 ament 决定每个 ROS 2 包如何具体构建。
