提问
ROS2 工作空间中, CMakeLists.txt, setup.py和 package.xml的作用分别是?
回答
在一个 ROS 2 包(package)里,这三个文件各司其职:
-
package.xml
-
作用:声明包的元信息和依赖关系,是 ROS 构建系统和生态工具(如
rosdep
、vcs
)识别、安装和管理包的依据。 -
主要内容:
<name>
、<version>
、<description>
、<license>
、<maintainer>
、<author>
等元数据<depend>
、<build_depend>
、<exec_depend>
等依赖声明- 导出项(
<export>
),如是否启用动态链接库、插件描述器等
-
-
CMakeLists.txt
-
作用:用 CMake 语法定义包的“构建规则”(build rules),告诉
colcon
(背后调用 ament_cmake)怎样编译 C/C++ 代码、生成接口(messages/services/actions)、安装可执行文件和资源。 -
常见流程:
find_package(ament_cmake REQUIRED)
、find_package(rclcpp REQUIRED)
等:找到所需的 ament/C++ 库- 对于自定义消息:调用
rosidl_generate_interfaces()
add_executable()
/ament_target_dependencies()
:定义可执行节点及其依赖install()
:指定要安装的二进制、库、资源目录ament_package()
:标记 CMake 包的结束,注册给 ament
-
注意:即使是纯 Python 包,也需要一个最小化的
CMakeLists.txt
来激活 ament_python(通常只包含find_package(ament_python REQUIRED)
和ament_python_install_package()
)。
-
-
setup.py
-
作用:Python 标准的打包脚本,告诉
setuptools
(由ament_python
调用)如何安装你的 Python 模块、数据文件及定义命令行入口(console scripts)。 -
主要内容:
name
、version
、packages
、install_requires
(对应 package.xml 中的 exec_depend)entry_points={'console_scripts': [...]}
:将脚本安装为可执行命令(如ros2 run my_pkg talker
)data_files
:安装 launch 文件、配置文件、参数包等非代码资源
-
它们之间的配合
-
当你在工作空间根目录执行
colcon build
时:colcon
扫描每个 package 目录,读取其package.xml
判断是否要构建,并收集依赖关系。- 如果包声明使用 ament_cmake(在
CMakeLists.txt
中出现find_package(ament_cmake ...)
),就走 CMake 流程;如果声明使用 ament_python,就会调用setup.py
。 - CMake 流程中,
package.xml
也会被安装到最终的安装目录中,以便运行时和上层工具再次读取依赖。
-
简单对比:
文件 用途 构建时机 典型使用场景 package.xml 元信息 + 依赖管理 colcon
扫描依赖所有 ROS 2 包 CMakeLists.txt C/C++ 构建脚本 + 自定义接口生成 ament_cmake C++ 节点、接口包、自定义消息包 setup.py Python 安装脚本 + console entry points ament_python 纯 Python 节点包
这样分工明确,才能保证 ROS 2 包既能被正确地发现和管理,又能根据你所写的 C++、Python 代码或自定义消息去编译/安装。