ros2 python 包的 setup.cfg, setup.py 语法详细解释
在ROS2中,Python功能包的setup.py
和setup.cfg
是构建系统的核心配置文件,两者协同工作定义包的元数据、依赖关系、安装规则及可执行节点注册。以下是详细解析:
一、setup.py:动态构建脚本
核心作用:通过setuptools
库定义Python包的元数据、依赖关系及入口点,是Python包的标准配置方式。
关键参数详解
-
元数据定义
name
:包名,需与package.xml
中的<name>
一致。version
:版本号,遵循主版本.次版本.修订号
格式(如0.1.0
)。description
:包功能简述。maintainer
/author
:维护者/作者信息(含邮箱)。license
:许可证类型(如BSD
、Apache 2.0
)。
-
依赖管理
install_requires
:声明运行时依赖的Python库(如rclpy
、numpy
)。
示例:install_requires=["rclpy", "numpy>=1.20"]
。- ROS2特殊依赖:核心库(如
rclpy
)需在package.xml
中通过<exec_depend>
声明,确保ROS2工具链识别。
-
入口点注册
entry_points
:定义可执行命令与Python函数的映射,使ros2 run
能调用节点。
示例:
此处entry_points={'console_scripts': ['talker = my_package.talker_node:main','listener = my_package.listener_node:main'] }
talker
命令会调用my_package/talker_node.py
中的main()
函数。
-
包结构配置
packages
:自动发现子模块(如find_packages()
)。package_dir
:指定源码目录(如{'': 'src'}
表示根目录为src
)。
二、setup.cfg:静态配置补充
核心作用:作为setup.py
的补充,静态化配置安装路径、资源文件及入口点,确保ROS2规范兼容性。
关键配置段解析
-
[metadata]
同步setup.py
的元数据(如name
、version
),确保与package.xml
一致。 -
[options]
zip_safe = False
:禁用压缩安装(ROS2推荐)。include_package_data = True
:启用非代码文件(如配置文件、启动文件)的安装。packages
:自动发现子包(需配合setup.py
的find_packages()
)。
-
[options.entry_points]
与setup.py
的entry_points
等效,定义可执行命令。
示例:[options.entry_points] console_scripts =publisher = my_package.publisher_node:main
-
资源文件安装路径
通过data_files
在setup.py
中指定非代码文件安装到ROS2标准路径:data_files=[# 注册到ament资源索引('share/ament_index/resource_index/packages', ['resource/my_package']),# 安装package.xml('share/my_package', ['package.xml']),# 安装launch文件('share/my_package/launch', glob('launch/*.launch.py')) ]
三、两者协同与ROS2集成
- 依赖管理:
package.xml
声明ROS2依赖(如rclpy
、std_msgs
),setup.py
的install_requires
声明Python库依赖。 - 节点执行:
entry_points
(无论在setup.py
或setup.cfg
中定义)使ros2 run <包名> <命令>
能调用对应节点。 - 资源安装:
data_files
确保配置文件、启动文件等安装到share/<包名>/
目录,符合ROS2文件结构规范。 - 构建工具:
ament_python
构建类型依赖setuptools
,通过colcon build
调用setup.py
完成构建。
四、最佳实践与常见问题
-
一致性检查
- 确保
setup.py
的name
、version
与package.xml
完全一致。 entry_points
中的命令名需唯一,避免冲突。
- 确保
-
依赖声明
- 在
package.xml
中声明所有ROS2依赖(如<exec_depend>rclpy</exec_depend>
)。 - 在
setup.py
的install_requires
中声明纯Python依赖(如numpy
)。
- 在
-
资源文件管理
- 使用
data_files
将launch
、config
等目录安装到share/<包名>/
下。 - 避免硬编码路径,使用
glob
自动匹配文件。
- 使用
-
调试技巧
- 若
ros2 run
无法找到命令,检查entry_points
是否正确定义,并确保colcon build
成功。 - 使用
ros2 pkg prefix <包名>
验证安装路径。
- 若
五、完整示例
setup.py
from setuptools import setup, find_packagessetup(name="ros2_demo",version="0.1.0",packages=find_packages(),install_requires=["rclpy", "numpy"],entry_points={'console_scripts': ['talker = ros2_demo.talker:main','listener = ros2_demo.listener:main']},data_files=[('share/ros2_demo', ['package.xml']),('share/ros2_demo/launch', glob('launch/*.py'))]
)
setup.cfg
[metadata]
name = ros2_demo
version = 0.1.0[options]
zip_safe = False
include_package_data = True[options.entry_points]
console_scripts =talker = ros2_demo.talker:main
通过合理配置setup.py
和setup.cfg
,ROS2 Python包可实现标准化构建、依赖管理及节点注册,确保与ROS2生态无缝集成。