ROS2自定义包安装后执行ros2 launch报错问题排查
问题根源
你的自定义ROS2包里,带__init__.py的launch文件夹被识别为Python包安装,与ROS2官方的launch核心包重名。Python导入模块时会优先加载你这个自定义的launch包,但它没有官方launch模块中的launch_description_sources子模块,因此运行ros2 launch时触发错误。
原因拆解
- 你的
setup.py使用了find_packages(exclude=["test"]),该函数会自动将所有包含__init__.py的文件夹识别为Python包,包括同级的launch文件夹。 - 编译安装后,这个自定义的
launch包会被放到Python的site-packages路径中,导入优先级高于ROS2官方的launch包。 - 执行
ros2 launch时,Python优先导入你自定义的launch包,找不到所需的子模块,最终抛出KeyError: 'launch'。
修复方法
两种简单方案任选其一:
方案1:删除launch文件夹中的__init__.py
直接删掉launch目录下的__init__.py文件,这样find_packages就不会将其识别为Python包,仅会按照setup.py的配置,把launch文件作为资源文件安装到share/my_package/launch路径下,不会与官方模块冲突。
方案2:在find_packages中排除launch文件夹
修改setup.py中的packages参数,明确排除launch目录:
packages=find_packages(exclude=["test", "launch"]),
这样即使launch文件夹里有__init__.py,也不会被当作Python包安装,仅会被处理成数据文件。
验证步骤
修复后重新编译安装:
colcon build --packages-select my_package source install/setup.bash
再执行ros2 launch即可正常使用,同时可以通过ros2 launch my_package app_1.launch.py启动自定义launch文件。
内容的提问来源于stack exchange,提问作者bgyooPtr
相关产品推荐
相关产品推荐

