恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

YOLOv5与ROS结合:从零搭建目标识别跟随无人小车全流程实战

  • 首页
  • 资讯中心
  • /
  • YOLOv5与ROS结合:从零搭建目标识别跟随无人小车全流程实战

相关资讯

第5章,[Win32 章节] :Arc、Chord 和 Pie 教学插图 2026/9/8 15:37:05
C# 图像实现亚像素精度:使用OpenCvSharp实现亚像素精度的定位 2026/9/8 15:37:05
OpenCode:终端里的开源AI编程代理,灵活接入多模型实战指南 2026/9/8 15:32:05

最新资讯

手操器能通讯却不能校准?DD文件版本不匹配的排查与修复
Hugging Face Transformers 中的 Ministral:交替注意力架构解析、MinistralConfig 参数说明与文本生成实战
裸机编程不求人:开源嵌入式Skill一条龙实战指南
WandEnhancer 本地补丁如何解除 WeMod 免费时长限制?附完整使用指南
深入解析Arm Trusted Firmware:架构、安全审计与平台移植实战
反欺诈里那些抓不到的团伙,交给图神经网络:PyG GraphSAGE 交易反欺诈实战

今日推荐

Redis缓存与离线预计算在大数据处理中的实战应用
Android 12热启动闪屏排查:从冷热启动差异到官方SplashScreen避坑指南
加密资产价值投资:原理、方法与实战策略

本周热门

超人会飞不算本事:系统稳定依赖清晰规则与边界设计
超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论
基于CNN的调制信号识别:MATLAB实现时频图分类实战

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

YOLOv5与ROS结合:从零搭建目标识别跟随无人小车全流程实战

发布时间:2026/9/8 15:37:05
YOLOv5与ROS结合:从零搭建目标识别跟随无人小车全流程实战 简介基于YOLOv5与ROS的无人小车目标跟随系统是一套面向机器人方向毕业设计及目标检测跟踪学习者的完整工程包。系统将YOLOv5目标识别算法集成到ROS无人小车平台实现从摄像头图像捕获、目标检测、运动规划到执行控制的完整跟随流程可应用于盲人辅助出行、物流配送、安防监控等真实场景。压缩包共176个文件大小约104.96MB主要包含38个Python源码、42个YAML参数配置、PyTorch模型权重、Docker部署与依赖文件、Markdown说明文档以及演示GIF与MP4视频另有ipynb教程笔记和ROS节点C源码目录按功能模块划分便于按需查阅和二次开发。资源附带测试图片与配置文件可帮助快速验证识别效果并结合launch启动文件理解YOLOv5与ROS的通信机制。目前已有508人学习下载适合需要快速搭建目标跟随原型或深入理解视觉识别与底层控制集成的学习者。1. 项目概述与整体思路拆解先说结论这套“YOLOv5目标识别 ROS无人小车”的组合本质上是把视觉感知和移动控制两条技术栈串成一条完整的闭环链路。我从拿到这个项目源码到实车跑通大概花了三天中间踩了不少坑写这篇文章就是希望把整条链路讲透帮你少走弯路。先说一个容易混淆的点标题里写的“YOLO5”其实指的就是 Ultralytics 开源的 YOLOv5。在 YOLOv5 官方仓库的表述中v5 这个版本号已经去掉了字母 “v”但社区里叫 YOLOv5 的人更多你搜资料的时候两个关键词都要用。我下面统一写成 YOLOv5。这套系统适合谁我觉得最适合两类人一类是刚学完 ROS 基础、想找一个综合项目练手的机器人方向学生另一类是已经在做视觉检测、想把手里的算法真正落到移动平台上跑起来的开发者。它解决的核心问题很明确让一台普通差速驱动的小车通过摄像头识别到目标物体之后自动调整姿态并保持跟随机动。这个项目的核心链路其实只有四环图像采集 → 目标检测 → 坐标换算 → 速度控制。听起来简单但每一环都有它的坑。图像采集合不合适检测精度再高也白搭坐标换算不准确PID 再稳也追不上目标速度指令发得再快底层驱动响应跟不上一样失效。所以我在拆解这套源码的时候会着重讲每一环的工程实现而不是只停留在算法原理层面。从方案选型上看YOLOv5 ROS 这套组合之所以能成为主流有几个很现实的原因YOLOv5 本身在算力要求、检测精度和推理速度上做到了一个不错的平衡点比 YOLOv3/v4 精度更好比 YOLOv8 部署更简单特别是配合它的 export 工具可以轻松转到 TensorRT 或 ONNX在嵌入式设备上跑非常合适。ROS我建议用 Noetic 或者 Foxy 版本则提供了相机驱动、节点通信、坐标变换、速度发布这一整套现成的机器人大脑骨架。两者通过一个“桥接节点”连接ROS 拿图像送入 YOLOv5 推理推理结果转成控制指令再发回 ROS。这已经是目前视觉跟随项目里最标准的架构。2. 系统架构与核心原理2.1 数据流全景从相机画面到电机转动我把这套系统的完整数据流画在脑子里是这样的USB 摄像头或者 ROS 的 usb_cam 节点输出 /camera/image_raw 话题 → YOLOv5 检测节点订阅图像推理出目标框坐标 → 计算目标中心点相对图像中心的像素偏移 → 结合相机内参把像素偏差转换为偏航角偏差 → 通过 PID 控制器计算角速度同时根据目标框大小估算距离、计算线速度 → 发布 /cmd_vel 速度指令 → 小车底层驱动板Arduino、STM32 或树莓派 GPIO 电机驱动板执行转向和加减速。这一步就是整套系统的“脊髓反射弧”。很多新手会把注意力全放在“把 YOLOv5 跑起来”这件事上但实际上真正决定跟随效果好不好用的是坐标换算和控制策略那一段代码。前面检测环节只要能稳定输出目标框后面怎么把这个目标框变成车轮转动才是项目的核心价值。2.2 YOLOv5 在跟随场景中的选型逻辑YOLOv5 官方提供了 n/s/m/l/x 五个尺寸的预训练模型。在这套项目中我强烈建议用YOLOv5s这也是源码里默认的配置。原因很简单yolov5s 在 COCO 数据集上 mAP 达到 37.4%而模型体积只有 14MB 左右在 Jetson Nano 或者树莓派 4B 上跑FP16 精度下推理耗时能控制在 30~50ms 之间。如果换成了 yolov5m精度确实更高一点但推理时间几乎翻倍跟随的实时性会大打折扣。还有一个容易被忽略的细节就是输入分辨率。YOLOv5 默认训练时输入是 640×640但推理时你可以通过 --img 参数调整为 320 或者 416。我实测下来在跟随这个场景下不需要追求小目标的检测精度用 416 分辨率反而能把推理速度拉高不少目标框的抖动也会减少。原因很简单分辨率低了像素级的噪声对目标框中心点的影响比例也变小了。YOLOv5 的检测头输出是 (x_center, y_center, width, height, confidence, class_probabilities)这是一个相对坐标需要乘上图像宽高才能得到像素坐标。源码里通常会写一个后处理函数把 tensor 格式的检测结果解析成 Python 的 list[dict] 结构再传给控制模块。这一步给自己留好接口后面加多目标追踪或者动态目标预测就方便了。2.3 ROS 节点通信设计与话题设计这套系统的节点划分我建议这样规划/camera节点驱动摄像头发布图像话题。如果用的是 USB 摄像头直接用 usb_cam 包就行如果是 RealSense 或奥比中光深度相机就换成对应的官方 ROS 驱动同时还能额外获得深度信息。/detector节点订阅图像话题加载 YOLOv5 模型执行推理发布检测结果话题。检测结果我建议先发布成自定义消息或者标准的 BoundingBoxes 消息而不是直接发布速度指令这样解耦后方便调试。/controller节点订阅检测结果结合 PID 算法计算线速度和角速度发布 /cmd_vel。/cmd_vel话题本身ROS 里移动机器人速度控制的标准接口。硬件端只需要做一个节点订阅 /cmd_vel把它解析成 PWM 占空比输出给电机就行。话题设计听起来简单实际调试中有个很隐蔽的坑图像话题的频率和检测到控制指令的发布频率如果不匹配会导致控制信号时断时续小车走起来一卡一卡的。我建议在 detector 节点里加一个队列或者直接做同步控制节点的订阅队列长度设成 1只取最新一帧避免累计延迟。3. 环境搭建与实操过程3.1 ROS 与 Python 环境的搭建心得这是整个项目新手最容易卡死的环节我多写几句。先讲 ROS 版本选择。如果你用的是 Ubuntu 20.04就装ROS NoeticUbuntu 22.04 就装ROS 2 Humble。这套源码的主体逻辑在 ROS 1 和 ROS 2 下都能跑差别主要在话题 API 上比如 ROS 2 里用的是 rclpy 而不是 rospy。如果是第一次装我建议先用 ROS 1 Noetic教程最多遇到问题好搜。ROS 的安装过程对新手不太友好但有一个叫“鱼香ROS一键安装”的社区工具小鱼的 ros 一键配置脚本一条命令就能完成 rosdep 更新、依赖安装和开发环境配置实测非常省心。你搜“鱼香 ros 一键安装”就能找到对应的脚本它本质上就是把手工安装 ROS 过程中的所有步骤自动化了对于不想折腾环境的人来说是真正的救星。需要注意一键安装脚本只是帮你装了 ROS 主程序后续还需要你自己安装摄像头驱动、YOLOv5 的 Python 依赖torch、opencv-python、numpy 等。Python 版本方面ROS Noetic 默认绑定的是 Python 3.8所以你的 YOLOv5 代码必须保证在 Python 3.8 下能运行。现在网上很多 YOLOv5 教程默认用的是 Python 3.10对应的是更新的 PyTorch 版本这就会出现莫名其妙的版本冲突。我的建议是ROS 本体用 Python 3.8 不乱动YOLOv5 的推理部分用虚拟环境管理。实测下来Python 3.8 装 PyTorch 1.12 CUDA 11.6跑 YOLOv5 完全没问题。如果你用的是 ROS 2 HumblePython 3.10那 PyTorch 版本就选 2.0 以上的。3.2 数据集准备与模型训练这套跟随系统默认用的 YOLOv5 预训练模型COCO 数据集可以直接检测人、车、猫、狗、瓶子等 80 类常见物体。如果你想做“跟随特定目标”而不是跟随“任意人”那你需要自己准备数据集微调模型。我这次项目里做了一个记号识别的扩展在目标背上贴一个彩色圆形标志采集了大约 1000 张样本图像用 LabelImg 打标注XML 格式转 YOLO 格式然后在 YOLOv5 基础上微调训练。训练命令很标准python train.py --img 640 --batch 16 --epochs 100 --data dataset.yaml --weights yolov5s.pt训练完成之后模型文件输出在 runs/train/exp/weights/best.pt这个 best.pt 就是你部署到小车上的最终模型。有个实战细节标注的时候目标框不要标得太紧留 2%~3% 的边缘余量否则后续计算目标中心点时会因为框边界抖动而出现中心点跳变。这个细节在跟随控制里影响非常大因为中心点跳变直接导致 PID 输出突变小车会走得非常神经质。3.3 核心代码实现与逐段解析我把这套项目的核心控制代码拆成三个关键片段来讲。检测结果解析片段import cv2 import torch # 加载模型 model torch.hub.load(ultralytics/yolov5, custom, pathbest.pt, force_reloadTrue) model.conf 0.5 # 置信度阈值 model.iou 0.45 # NMS IoU阈值 # 从ROS图像消息转OpenCV格式 def ros_image_to_cv2(msg): return cv2.cvtColor(np.frombuffer(msg.data, np.uint8).reshape(msg.height, msg.width, -1), cv2.COLOR_RGB2BGR) # 推理 frame ros_image_to_cv2(img_msg) results model(frame, size416) detections results.pandas().xyxy[0] # x1, y1, x2, y2, confidence, class, name这段代码的核心是 torch.hub.load 的 custom 参数加载自定义权重。有一个坑要注意如果小车端不能联网torch.hub 默认会去 GitHub 拉取代码必须提前把 ultralytics/yolov5 仓库克隆到本地然后通过 sourcelocal 或者设置环境变量来指向本地路径否则在嵌入式设备上会因为网络问题卡死。坐标换算与控制量计算片段def compute_control(target_center_x, target_center_y, target_w, target_h, img_w, img_h): # 计算目标中心相对画面中心的像素偏移 dx target_center_x - img_w / 2 dy target_center_y - img_h / 2 # 像素偏移到角速度的映射简化为线性比例系数Kp_ang需要实车调参 angular_z -Kp_ang * dx / img_w # 目标框面积反推距离目标框越大距离越近速度应该越小或者做大取决于跟随逻辑 area_ratio (target_w * target_h) / (img_w * img_h) distance_estimate K_dist / (area_ratio ** 0.5) linear_x Kp_lin * (distance_estimate - desired_distance) return linear_x, angular_z这就是全系统最核心的几行逻辑。angular_z 是转向速度通过目标中心在画面中的水平像素偏移量乘以一个比例系数得到linear_x 是前进速度通过估算距离与期望距离的偏差乘以比例系数得到。这里用的 Kp_ang 和 Kp_lin 是比例控制系数这套代码里其实就是一个最简化的 P 控制器进阶版本会替换成完整 PID。实车调整这两个系数非常关键调大了小车左右甩头调小了又跟不上目标。ROS 节点发布速度指令片段from geometry_msgs.msg import Twist def publish_cmd(self, linear_x, angular_z): twist Twist() twist.linear.x linear_x twist.angular.z angular_z self.cmd_pub.publish(twist)这是发布到 /cmd_vel 的标准格式。底层驱动板收到这个 Topic 后解析 linear.x 和 angular.z再通过差速模型换算成左右轮的目标转速左轮转速 (linear_x - angular_z * wheel_base / 2) / wheel_radius 右轮转速 (linear_x angular_z * wheel_base / 2) / wheel_radius这组公式里 wheel_base轮距和 wheel_radius轮半径必须填入你的实车参数否则小车转起来要么过慢跟不上要么疯狂原地旋转。3.4 硬件连接与底层驱动硬件方面我用的是四轮差速底盘前两轮驱动、后两轮从动或者直接四轮驱动主控用的树莓派 4B运动控制板用的 STM32 通过串口通信。ROS 主控树莓派负责跑相机驱动和 YOLOv5 推理算好速度后通过串口把速度指令发给 STM32STM32 再把速度换算成 PWM 输出驱动电机。如果你的底盘只带一个串口协议模组那通常可以通过串口发特定格式的帧来控制比如0xFF 0x01 0x5A 0x20 0x1E ...这种带校验的协议帧。这个部分不同底盘差异很大需要看你的底盘厂商文档。我在源码的 hardware_driver.py 里预留了一个解析协议帧的类拿到你的底盘协议后替换里面的封包函数就行。驱动调试阶段先用最基础的开环测试只发一个固定的 linear.x看看轮子是不是在转、转向是否为预定方向确认没问题后再跑完整的跟随逻辑。4. 常见问题与调试技巧实录4.1 问题排查速查表我在调试这套系统整整两天的过程中整理了一张高频问题排查表应该能省下你大量掉头发的时间现象直接原因排查与解决方法相机节点启动报错摄像头权限被占用或设备号不对sudo chmod 777 /dev/video0或者用 ls /dev/video* 查看设备号YOLOv5 推理慢到只有 2~3 FPS没有使用 GPU 推理Jetson 设备启用 TensorRT 导出树莓派可尝试 ONNX 或降低输入分辨率到 320小车只在原地旋转不走直线angular_z 比例系数过大降低 Kp_ang 到原来的 1/3重新标定目标明明在前面小车却停下来目标框过大导致估算距离小于期望距离调整 K_dist 或者直接改用目标框高度作为距离参考检测框抖动特别严重摄像头帧率低或曝光时间过高固定曝光时间不要用自动曝光把视频流强制到 30FPS串口发送速度指令没反应波特率不匹配或协议帧校验出错确认 STM32 端波特率打印一段已知协议的十六进制帧手动对照摄像头画面发绿/偏色CODEC 配置错误对于 usb_cam手动设置 pixel_formatyuyv4.2 目标跟随失效的几种典型场景跑实车测试时你会发现桌子上测试和地板上测试完全是两回事。光照变化导致检测置信度下降是最常见的跟随失败原因所以我强烈建议开启 YOLOv5 的--augment推理参数或者训练时加入mosaic数据增强能大幅提升光照变化的鲁棒性。动态目标的速度突变也是个大坑。目标突然加速跑出画面PID 控制会因为误差瞬间拉大而输出一个剧烈的转向小车会突然甩头。我在源码中加了一个“目标丢失保持”策略当连续 10 帧检测不到目标时执行原地旋转搜索直到重新找回目标如果超过 3 秒仍找不到则停车等待。这个策略非常关键否则小车会在目标短暂被遮挡时疯狂乱转甚至撞墙。还有一个经验是摄像头安装位置的问题。摄像头安装高度我建议在 30~50cm俯视角略微向下倾斜 10 到 15 度。如果摄像头装得太高且平视近距离目标的框会占据画面大半个区域像素偏移很小但目标其实已经贴脸了控制就会失灵。这个物理安装问题很多时候没法靠代码完美补偿。4.3 PID 参数调试的实操思路我最终采用的调参方法是从 P 控制开始而不是直接上完整 PID。步骤如下第一步固定一个距离只调转向。把 linear_x 设成一个固定值 0.15 m/s手动左右移动目标观察车身响应。逐渐增大 Kp_ang直到目标移动 20cm 时小车能在 1 秒内完成对准此时记录 Kp_ang。第二步固定转向只调直线速度控制。让目标静止小车从 1.5 米外出发调整 Kp_lin观察小车是否在接近目标到期望距离时能平稳减速。如果减速过猛就减小 Kp_lin。第三步加入积分项 I用来消除稳态误差。例如当目标长时间保持在小幅度偏移状态时P 控制的输出可能不足以让车身完全对准这时候 I 项就能发挥作用。但 I 项设置太大容易引起振荡所以 I 的值最好设置为 P 的 1/20 到 1/10 作为起始值。D 项在速度控制里尽量不要加因为视觉检测本身有噪声D 项会把噪声放大成电机抖动的直接来源。有一组可以作为起点的参考参数针对普通 20~30cm 轮距的小型底盘Kp_ang 1.2Kp_lin 0.6Ki 0.08期望距离 0.8m。但一定要在你的车架上重新标定直接照搬往往会发现转向速度过猛。4.4 实车测试中的安全准则这个必须单独拿出来强调一下。目标跟随系统涉及自主移动实车测试有非常大的翻车风险我说的不只是摔坏小车还有撞到人、撞坏家具的风险。第一永远在封闭、空旷的环境中测试地面平整无障碍物。第二首次跑通全流程时把小车拿在手里做“悬空测试”先确认速度指令输出的方向正确、大小合适再放地上跑。第三在代码里写一个“看门狗”机制如果 /cmd_vel 话题在 0.5 秒内没有更新说明主控可能死机或者推流中断底层驱动必须自动停车。这个机制非常重要因为 ROS 节点崩溃时小车不会自动刹车它只会保持着最后一条速度指令一直冲出去。我遇到过的情况是YOLOv5 推理时内存被占满树莓派直接 OOMROS 节点全部死掉但小车还在继续跑。如果没有看门狗后果就是撞墙。所以这一步绝对不能省。5. 源码工程结构解读源码解压之后主要目录结构如下我挑关键文件说明一下├── launch/ │ └── follow.launch # 一键启动相机、检测、控制节点的launch文件 ├── scripts/ │ ├── detector.py # YOLOv5检测节点发布检测框消息 │ ├── controller.py # PID控制节点订阅检测框发布速度 │ ├── camera_node.py # 相机驱动节点发布图像消息 │ └── hardware_driver.py # 串口通信驱动接收速度指令下发至底盘 ├── models/ │ └── best.pt # 训练好的模型权重 ├── config/ │ ├── pid_params.yaml # PID参数配置文件 │ └── camera_params.yaml # 相机内参、安装高度等配置 └── README.md # 环境依赖、编译和运行说明launch 文件的价值在于一键启动。你不需要手动开三个终端分别运行 camera_node、detector.py 和 controller.py直接roslaunch follow.launch就行。实际我在调试中使用的是单独的终端窗口分别启动这样可以随时观察各个节点的日志输出。调稳定之后再改用 launch 一键启动效果更好。config 里用 yaml 管理参数是个好习惯强烈建议沿用这个设计。PID 参数、相机安装高度、期望距离这类经常需要调整的数值全部从代码里抽出来放到 yaml 里这样调参时只需要改文件然后重新加载不需要频繁改代码。整个源码里我认为设计最巧妙的地方是 detector.py 和 controller.py 之间通过消息解耦。你可以在不修改控制逻辑的前提下把检测模型从 YOLOv5 换成其他算法只要输出格式保持x1, y1, x2, y2, confidence, classcontroller 就能无缝衔接。这个松耦合的架构思路是所有机器人项目的通用最佳实践。6. 我的实操心得这套项目跑通之后我最大的体会是算法本身不难难的是让所有环节在物理世界里协同工作。YOLOv5 在笔记本上跑出 99% 的检测准确率一点也不稀奇但放到小车上面对抖动、模糊、光照变化、实时性要求你才会真正理解工程化调优的分量。如果你是在校学生我建议你务必亲手把硬件、ROS、深度学习三样东西串起来跑一遍哪怕只是用一个最简单的玩具车底盘。这个过程里学到的东西比你在课程里写十次大作业都管用。如果你已经工作了想把它往深了做可以考虑几个扩展方向加入 DeepSORT 做多目标追踪解决目标遮挡和身份切换问题加一个深度相机RealSense D435 或奥比中光获得真实距离替代面积估距法把 YOLOv5 换成 YOLOv8 或 RT-DETR 并在 TensorRT 上部署换取更高的帧率和更低延迟。最后再分享一个细节项目跑通之后别忘了把视频录下来。录一下 ROS 的话题数据rosbag record和屏幕画面这不仅是你以后写论文或者做案例展示的第一手资料更是你回顾问题、做参数回归测试的重要依据。我在调 PID 的时候就是靠对比历史 rosbag 数据才最终定位到噪声放大问题。数据和日志永远是调试路上最忠实的伙伴。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号