ROS2订阅节点集成YOLOv5遇模块缺失问题及外部算法集成咨询
ROS2中集成YOLOv5解决
ModuleNotFoundError的方案 问题核心原因
ROS2的Python节点执行上下文与ROS1存在差异:ROS1会直接从脚本所在目录加载同级依赖,而ROS2经colcon编译后,可执行文件会被放到install/<package_name>/lib/<package_name>/路径下,导致节点脚本无法直接找到同级的yolov5文件夹,从而触发ModuleNotFoundError: No module named 'yolov5'。
具体解决步骤
1. 规范包目录结构
确保你的ROS2包结构符合以下格式,让yolov5源码文件夹与节点脚本处于同一Python包目录下:
yolov5_detect/ ├── yolov5_detect/ │ ├── __init__.py │ ├── webcam_yolo_sub.py # 你的订阅节点脚本 │ └── yolov5/ # YOLOv5源码文件夹(需包含__init__.py) ├── setup.py ├── package.xml └── ...
2. 修改setup.py,将yolov5纳入安装资源
ROS2通过setup.py管理包的安装资源,需配置将yolov5文件夹同步安装到节点执行路径下。修改setup.py的相关字段:
from setuptools import setup import os package_name = 'yolov5_detect' setup( name=package_name, version='0.0.0', packages=[package_name], # 配置package_data,将yolov5下所有文件纳入安装 package_data={ package_name: ['yolov5/**/*'], }, data_files=[ ('share/ament_index/resource_index/packages', ['resource/' + package_name]), ('share/' + package_name, ['package.xml']), ], install_requires=['setuptools'], zip_safe=True, maintainer='Jun Meng', maintainer_email='your_email@example.com', description='YOLOv5 detection node for ROS2', license='Apache License 2.0', tests_require=['pytest'], entry_points={ 'console_scripts': [ 'webcam_yolo_sub = yolov5_detect.webcam_yolo_sub:main', ], }, )
3. 调整节点脚本中的导入路径
将原有的import yolov5改为基于ROS2包的相对或绝对导入:
# 相对导入(推荐,适合同包内模块) from .yolov5 import detect # 或绝对导入 import yolov5_detect.yolov5 as yolov5
如果脚本中需要加载YOLO权重文件,需通过包路径动态获取,避免硬编码:
from ament_index_python.packages import get_package_share_directory import os package_path = get_package_share_directory('yolov5_detect') weight_path = os.path.join(package_path, 'yolov5', 'weights', 'yolov5s.pt')
4. 重新编译并运行
执行以下命令完成编译与测试:
colcon build --packages-select yolov5_detect source install/setup.bash ros2 run yolov5_detect webcam_yolo_sub
额外注意事项
- 确保yolov5文件夹下存在空的
__init__.py文件,让Python将其识别为合法模块。 - 若yolov5依赖torch、opencv-python等第三方库,需在
package.xml中添加<exec_depend>标签声明,或让用户手动通过pip install安装。
内容的提问来源于stack exchange,提问作者Jun Meng
相关产品推荐
相关产品推荐

