文档创建日期:2023年3月27日

文档内容:将yolov5整合进ROS的过程记录

文档作者:RobotFreak

yolo系列是很方便的开源视觉识别检测算法,到目前为止已经更新到了yolov8,并且有很多相关资料,便于学习与部署。本文介绍了我将yolov5整合到ROS中的过程。

虚拟机调用本地摄像头

虚拟机->可移动设备->连接camera,camera前有勾则已经与虚拟机连接

yolov5本地部署

首先需要将yolov5源码下载或clone下来,最好测试在本地能用python跑通

部署参考:linux下yolov5环境配置

参考博客以及yolov5的README中都说的python版本>=3.7,但是实际在安装依赖的时候遇到过python版本不够的情况,所以可能需要安装python>=3.8

部署完跑通之后文件夹内状态如下:

将yolov5整合到ROS的功能包中

这里我是直接将yolov5文件夹都放到了功能包的scripts目录下。也可以选择将yolov5文件夹内的文件都直接复制到scripts文件夹下,但是考虑到scripts中一般都是只放.py和.sh文件,所以我选择了将整个文件夹放到scripts目录下,这样更整洁一点。

这里我的workspace使用的原生环境的python,不是anaconda的python。

给detec.py添加可执行权限:

chmod +x detect.py

编辑功能包的CMakeLists.txt:

 catkin_install_python(PROGRAMS scripts/yolov5/detect.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} )

进入工作空间目录进行编译:

catkin_make

开启roscore,运行节点:

rosrun yolo detect.py

整合完成

问题解决

(已解决)[WARN:0@12.936] global cap_v4l.cpp:1119 tryIoctl VIDEOIO(V4L2:/dev/video0): select() timeout.

将yolov5的检测改为实时检测之后,调用本地摄像头,运行detect.py,出现这个报错。

参考这个博客:(29条消息) tryIoctl VIDEOIO(V4L2:/dev/video0): select() timeout._一WILLPOWER一的博客-CSDN博客

直接运行以下命令:

ffplay -f video4linux2 -input_format mjpeg -framerate 30 -video_size 640*480 /dev/video0

调用摄像头效果如下:

按照博客中所说,虚拟机->设置->USB控制器,将USB兼容性选为USB3.1

再次使用命令调用摄像头:

再次运行detect.py没有问题

(已解决)ImportError: cannot import name ‘ParserError’ from ‘dateutil.parser’ (/usr/lib/python3/dist-packages/dateutil/parser/init.py)

运行detect.py时出现此报错

参考博客:(29条消息) 【Python】cannot import name ‘ParserError‘ from ‘dateutil.parser‘_Raurean的博客-CSDN博客

按照博客中所说,将python-dateutil更新到最新的2.8.2版本,再次运行detect.py,没问题。