yolov5实现Tello TT无人机目标识别追踪与测距完整方案

发布时间:2026/10/10 13:52:42

yolov5实现Tello TT无人机目标识别追踪与测距完整方案 简介一套基于YOLOv5与大疆教育无人机Tello TT的完整目标识别、检测、追踪与测距项目资源面向K12阶段学生及AI入门开发者旨在通过真实飞行场景激发学习兴趣将深度学习理论与无人机实际操控相结合。压缩包共1667个文件其中包含758张JPG图像、694个TXT标注文件、94个YAML配置、46个Python脚本和9个训练好的PT模型另含说明文档、运行脚本及容器配置整体约269MB便于环境部署与二次开发。目前已有681人学习下载适合课堂演示与个人实践。资源内置了‘旗’和‘圈’两类目标的数据集配合训练好的模型可免除从头训练的时间成本操作说明文档详细覆盖环境配置、模型加载、无人机控制与视频流处理等环节适合课堂教学、社团项目或STEM科创实践助力学习者掌握深度学习与无人机编程的完整链路。1. 从yolov5到Tello TT的完整闭环这套无人机目标识别追踪方案到底在解决什么做一套基于大疆教育无人机Tello TT的目标识别检测与追踪测距方案看起来像是把两个成熟的东西拼在一起yolov5负责看Tello TT负责飞。真做过的人都知道最难的不是让模型认出目标而是让目标一直留在画面里、让实时推理别把图传拖垮、让测距数字不跳。标题背后其实是一整套闭环从采集数据、训练yolov5模型到通过UDP指令接管TT的飞控再到用PID把“像素偏差”变成“飞行速度”最后用视觉测距稳定输出距离。适合三类人交课设毕设需要完整交付的人、想从“单跑yolov5”升级到“无人机自主跟目标”的人、以及竞赛里被“模型能检出但飞机追不上”折腾过的队伍。这套做法的核心判断是TT机载算力不够没关系PC端推理加遥控指令回传是最稳的落地路径。2. yolov5目标识别模型先让“眼睛”认得目标2.1 为什么选yolov5做无人机场景的目标识别Tello TT的主控是嵌入式级别的算力跑不了完整yolov5模型真正跑推理的通常是电脑或者边缘盒子TT只负责飞。这个前提下目标检测模型的选择标准就变了精度优先还是速度优先我倾向于选yolov5原因有三条。第一条是生态成熟。yolov5的训练脚本、数据格式、导出工具链都是现成的网上踩坑记录也多遇到问题搜得到答案。第二条是精度速度平衡。yolov5s在640x640输入下RTX 3060级别显卡能跑上百帧CPU也能跑到10帧上下配合跳帧策略足够支撑追踪控制。第三条是部署链路短。训练好的pt权重可以直接转ONNX之后转成边缘设备需要的格式不会卡在“训练完没法上线”这一步。要泼一盆冷水的是不要一上来就上yolov5x或大模型无人机画面的目标通常不大但场景单一yolov5s往往就够。真正影响识别率的是训练数据是否贴近无人机视角而不是模型大小。后面第三节会讲怎么用Tello TT的视角数据喂模型。2.2 用yolov5训练自己的数据集目录结构、标注格式与首次训练命令标题里带了“数据集”实际交付时数据集质量比模型结构更值钱。Tello TT飞在1到3米高度视角俯视为主和普通地面摄像头采集的数据差异很大。我一般会先用TT录一段视频抽帧成图片再标注而不是直接拿网上的通用数据集。先按yolov5要求的目录结构整理数据这是第一个能抄作业的步骤your_data/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── data.yamlimages和labels下各自放train、val两个子目录图片和标注文件一一对应文件名相同标注文件是.txt后缀。data.yaml内容如下train: ./your_data/images/train val: ./your_data/images/val nc: 1 names: [target]这里nc是类别数names是类别名列表。如果是多目标比如你的人形和车辆那就nc: 2names加一项。路径建议用相对路径因为yolov5会在不同目录下训练绝对路径换机器就断。标注格式是YOLO格式每个txt里每一行代表一个目标框class_id x_center y_center width height注意x_center、y_center、width、height都是归一化到0到1的小数不是像素坐标。最容易翻车的地方是类别id从0开始不是1。我见过不少人在label里写1而names只有一类结果模型什么都学不到。首次训练跑下面这条命令python train.py --data your_data/data.yaml --weights yolov5s.pt --epochs 100 --batch-size 16 --img 640--weights指定预训练权重yolov5s.pt需要先下载也可以直接用官方默认让它自动拉取。--img 640表示训练输入尺寸无人机目标偏小低于416会损失小目标召回不建议再往下压。训练结束后best.pt保存在runs/train/exp/weights/目录下。2.3 训练参数怎么调yolov5超参数这样设不是玄学很多人把yolov5超参数当成黑匣子其实是有一组默认参考值的。yolov5的data/hyps/hyp.scratch-low.yaml里包含学习率、数据增强强度等参数我一般只动其中几个。重点看三个lr0: 0.01 mosaic: 1.0 hsv_h: 0.015lr0是初始学习率训练数据少的时候降到0.005更稳否则loss容易震荡。mosaic是四张图拼一张的数据增强建议保持1.0无人机数据量少mosaic能显著提升泛化。hsv_h是色调增强幅度如果你要识别的目标是颜色敏感的标志物把hsv_h调小到0.005防止颜色被增强改到认不出。训练时我习惯用默认训练轮数先跑100轮然后看runs/train/exp/results.png里的曲线。val mAP如果持续上升、最后没平台期就加到200轮如果早期就过拟合说明数据量不够优先补数据而不是加正则。这步不花时间但能避免一次训练看不到方向。2.4 导出ONNX为边缘部署做准备的必选项训练完的best.pt是PyTorch格式要部署到Tello TT之外的边缘设备或者单纯想在非PyTorch环境里加速推理先导出ONNX。python export.py --weights best.pt --include onnx --opset 12导出的best.onnx可以用onnxruntime直接加载推理不依赖PyTorch。需要注意opset版本低版本可能不支持某些算子12是比较稳的选择。导出后建议跑一遍推理对比pt和onnx的输出框是否一致浮点误差导致的差异一般在一个像素以内。如果发现ONNX输出的框偏了多半是模型里用了动态尺寸导出时固定输入尺寸能解决。3. Tello TT端实时检测DJITelloPy接入与推理落地3.1 TT怎么被“接管”UDP指令通道与图传协议Tello TT和电脑之间走的是WiFi直连SSID一般是TELLO-开头连接后TT的IP固定为192.168.10.1。控制指令通过UDP端口8889下发图传视频流走RTSP端口1111。Python生态里最常见的库是DJITelloPy封装了底层协议你不需要自己拼指令。接管的第一步是进入SDK模式。TT默认App模式只有收到“command”指令并返回“ok”后才接受后续控制指令。用DJITelloPy时connect()就是在做这一步。后续所有操作包括起飞、降落、发送遥控速度都是往8889端口发ASCII文本指令。from djitellopy import Tello tello Tello() tello.connect() tello.streamon()connect()成功后会打印电池电量、飞行时间等状态。streamon()打开图传之后程序就可以持续读取摄像头帧。这里有个顺序问题必须先connect成功再streamon否则TT不会建立视频流通道。连接失败时常见原因不在库而是电脑WiFi切到了别的网络TT的AP信道被路由器干扰。解决办法是给电脑WiFi固定别让它自动跳网。3.2 读取画面并用yolov5跑推理的最小代码图传打开后DJITelloPy的get_frame_read().frame会返回H264解码后的BGR帧尺寸默认是960x720。把帧交给yolov5模型推理这一步可以写得很短import cv2 import torch from djitellopy import Tello model torch.hub.load(ultralytics/yolov5, custom, pathbest.pt, sourcelocal, devicecpu) tello Tello() tello.connect() tello.streamon() frame_read tello.get_frame_read() while True: frame frame_read.frame results model(frame, size416) rendered results.render()[0] cv2.imshow(Tello Detection, rendered) if cv2.waitKey(1) 0xFF ord(q): break逻辑说明frame_read是后台线程持续拉流的结果主循环只用等现成帧不会因为推理阻塞丢帧。model(frame, size416)把输入缩放到416x416推理速度比640快一倍以上代价是小目标召回下降。results.render()把检测框直接画在图上返回ndarray。这段代码已经能跑通“图像端到端”但还只是看着飞机不会动。注意device参数如果电脑有NVIDIA显卡就传cuda:0没有就传cpu。yolov5s在CPU上单帧大约100到200ms肉眼有延迟但配合跳帧还能控制。3.3 让检测帧率够用的三个实用设置无人机追踪最怕的是推理太慢控制指令输出频率跟不上飞机会像喝了酒一样左右晃。三个设置组合起来能把有效控制频率拉到5到10Hz。第一个是跳帧检测。图传本身就有20到30帧检测模型跑不完每一帧所以规定每3帧推理一次中间2帧沿用上一帧框。视觉上平滑算力消耗降低三分之二。frame_id 0 DETECT_EVERY 3 while True: frame frame_read.frame if frame_id % DETECT_EVERY 0: results model(frame, size416) last_dets results.xyxy[0] else: frame None # 不处理第二个是推理尺寸降到416。刚才讲过对720p图传先缩放到416检测时间显著减少丢掉的精度在追踪场景里通常可以容忍因为PID控制本身对框的抖动不敏感。第三个是固定CPU线程数yolov5在PyTorch下默认会抢占多核和DJITelloPy的拉流线程抢CPU导致视频帧读取卡顿。加上线程限制import torch torch.set_num_threads(2)以上三个设置都改完后TT的实时检测才算真正能拿来控飞。4. 追踪与测距从“看得见”到“跟得住、报得准”4.1 追踪控制回路PID把像素偏差变成飞行速度YOLO输出的每一帧里有目标的中心坐标画面中心是期望值两者之差就是偏差。追踪的本质是让偏差归零。直接用偏差当速度会让飞机猛摆最常见做法是用PID控制器把偏差变化平滑成遥控速度再通过send_rc_control发给TT。class PID: def __init__(self, kp0.30, ki0.001, kd0.20): self.kp kp self.ki ki self.kd kd self.last_error 0.0 self.integral 0.0 def compute(self, error, dt0.05): self.integral error * dt derivative (error - self.last_error) / dt output self.kp * error self.ki * self.integral self.kd * derivative self.last_error error return output参数说明kp是比例项决定响应快慢ki是积分项消除稳态误差kd是微分项抑制过冲。无人机这类惯量小的系统kp在0.2到0.4比较合理超过0.5会震荡。dt这里固定0.05秒如果你实际控制循环是0.1秒就要改成0.1。主循环里把水平偏差和高度偏差分别交给YAW和上下速度pid_yaw PID(0.30, 0.001, 0.20) pid_ud PID(0.25, 0.001, 0.15) fb_speed 0 ud_speed 0 yaw_speed 0 while True: frame frame_read.frame if frame_id % DETECT_EVERY 0: results model(frame, size416) dets results.xyxy[0] if dets is not None and len(dets) 0: best dets[0] x1, y1, x2, y2, conf, cls best[:6] target_cx (x1 x2) / 2 target_cy (y1 y2) / 2 frame_cx frame.shape[1] / 2 frame_cy frame.shape[0] / 2 yaw_speed pid_yaw.compute(frame_cx - target_cx) ud_speed pid_ud.compute(frame_cy - target_cy) yaw_speed max(-60, min(60, yaw_speed)) ud_speed max(-50, min(50, ud_speed)) tello.send_rc_control(0, fb_speed, ud_speed, yaw_speed) else: tello.send_rc_control(0, 0, 0, 0) # 目标丢失立即悬停 frame_id 1这里send_rc_control的四个参数依次是左右速度、前后速度、上下速度、偏航速度范围都是-100到100。目标丢失时立即输出全0让TT原地悬停这是安全底线千万不能保持上一帧速度。取置信度最高的框是dets[0]因为yolov5默认按置信度降序排列。框的选择还可以加一个conf过滤低于0.35的直接当没有目标。4.2 测距的两种实现视觉测距为主TT的ToF为辅标题里的“追踪测距”测距部分是很多人直接放弃的地方。Tello TT的扩展模块上有红外ToF传感器但不同固件版本的读取指令不一样依赖它做主测距容易踩版本坑。我一般做主方案用视觉测距它的原理很直接假设目标真实宽度已知比如你要追踪的是一个宽30厘米的标志物那么它在画面里占的像素宽度和实际距离成反比。公式是def estimate_distance(bbox_width_px, real_width_m, focal_px): if bbox_width_px 5: return -1.0 # 框太小放弃 return real_width_m * focal_px / bbox_width_px参数说明focal_px是焦距的像素单位不用真的查相机参数标定一次就行。把目标放在距离相机1米的位置量一下框宽比如测出250像素目标宽0.3米则focal_px 250 * 1.0 / 0.3 ≈ 833。这个标定值在Tello TT摄像头固定焦距下是稳定的。在追踪循环里加入测距REAL_WIDTH 0.30 FOCAL_PX 833.0 frame_width_px int(x2 - x1) dist estimate_distance(frame_width_px, REAL_WIDTH, FOCAL_PX) print(f当前目标距离: {dist:.2f} m)这个距离在2米外噪声很小在近距离反而会跳原因后面避坑章节细说。ToF作为辅助校验我通常在近距离1.2米内用它来校准视觉测距的结果而不是直接驱动控制逻辑。4.3 距离触发的安全动作让无人机学会刹车视觉测距算出来后最实用的落地是把它当作安全阀。比如你想让TT跟到目标1米前自动停住避免撞上去可以这样控制前后速度SAFE_DIST 1.2 STOP_DIST 0.8 if dist 0: if dist STOP_DIST: fb_speed 0 elif dist SAFE_DIST: fb_speed 40 else: fb_speed 15 else: fb_speed 0 tello.send_rc_control(0, fb_speed, ud_speed, yaw_speed)这段逻辑的好处是把控制规则完全拆开转向归PID管进退归测距管二者互不污染。实际飞行中TT在1米以内转向会受气流影响严重所以STOP_DIST定在0.8以上比较稳妥。5. 避坑5个让我翻过车的常见问题与排查这章是我自己的血泪经验每个坑都真金白银炸过机。按“现象、原因、解决”三条写方便你直接对照。5.1 connect()超时或飞行中掉线现象tello.connect()一直卡住直到超时或者飞机飞着飞着突然丢失所有响应画面卡死。原因电脑防火墙拦了UDP 8889端口或者WiFi切到了别的网络还有可能是TT的AP信道被人挤了。解决飞行前给防火墙加规则放行UDP 8889和1111端口把电脑无线网络设为“按需连接”禁止自动跳网如果Tello和路由器共用2.4G信道把路由器关掉或者换5G频段。最稳的是笔记本插网线负责其他网络需求WiFi只连TT。5.2 目标居中后飞机还在左右摆头现象检测框明明已经对准画面中心yaw速度输出也接近0但TT机头就是小幅度来回摆。原因是PID参数过强kd太小导致微分作用压不住比例项带来的过冲。解决把kp从0.3降到0.2kd调到0.3以上同时把输出限幅从60降到40。如果还摆把控制循环dt从0.05改成实际测量的循环耗时dt不对会让KD计算失真这是很多人忽略的。5.3 白天训练的模型傍晚识别率暴跌现象上午训练和测试都很完美傍晚或室内开暖光灯时同一个目标的检测置信度从0.8掉到0.3以下。原因是训练数据全在单一光线条件下采集模型把光线特征当成了目标特征。解决训练数据里加不同时段、不同朝向、不同光照方向的图片同时把hyp里的hsv_h、hsv_s增强打开。重新训练后傍晚识别率能回到能用的水平但做不到全天候别指望一个模型包打天下。5.4 视觉测距在近处跳变严重现象目标在2米外时距离读数平稳靠近到1米以内距离值上下跳0.3米以上。原因是近距离时目标宽度占画面比例大检测框宽度几个像素的抖动会被放大计算到距离上。解决对距离输出做EMA平滑也就是新值等于旧值乘以0.8加新测量值乘以0.2。另外设置一个最小框宽低于阈值时维持上一次有效距离而不是输出一个毛刺值。smooth_dist 0.8 * smooth_dist 0.2 * raw_dist5.5 loss下降正常但实际检测漏框现象训练曲线很漂亮loss降到0.02但拿到Tello实拍画面里检测框偏一半或者根本漏检。原因标注格式或类别id用错最常见的是用voc格式标注却存成txt或者类别id从1开始写。另一个隐蔽原因是train和val的图片存在风格差异模型被验证集“骗”了。解决打开标注文件检查确认是归一化坐标用评估脚本统计每个类别的mAP发现某类明显低就重点看该类标注最后把验证集换成图传抽帧的数据让评估反映真实场景。6. 进阶离线回放验证、模型量化与端侧部署调追踪参数最怕的是每次都要起飞试既费电又容易炸。我习惯先录一段24帧的飞行画面配上同时刻的飞控指令日志然后离线回放。回放脚本用cv2.VideoCapture读MP4每帧喂给模型算出框中心后套PID公式输出“如果当时用这个参数速度指令是多少”。这样调PID参数不用起飞十分钟能测完一套参数组。import cv2 import torch cap cv2.VideoCapture(flight_record.mp4) model torch.hub.load(ultralytics/yolov5, custom, pathbest.pt, sourcelocal, devicecpu) pid PID(0.30, 0.001, 0.20) while cap.isOpened(): ret, frame cap.read() if not ret: break results model(frame, size416) dets results.xyxy[0] if len(dets) 0: x1, y1, x2, y2 dets[0][:4] cx (x1 x2) / 2 yaw pid.compute(frame.shape[1] / 2 - cx) print(fyaw{yaw:.1f}, dist{estimate_distance(int(x2 - x1), 0.30, 833.0):.2f}m)回放验证通过后模型部署还有两件事值得做。一是模型量化为FP16或INT8PyTorch导出ONNX后用onnxruntime的GraphOptimizationLevel配合fp16推理能快30%左右RTX显卡上效果更明显。如果目标是RK3568这类边缘盒子还需要把模型继续转成rknn格式量化时优先用混合量化避开敏感层。二是在树莓派4B上做端侧推理4B跑416输入的yolov5s大约能到5到8帧加上跳帧策略勉强够低速追踪。这套方案值不值得投入我的判断是如果目标是交付一个“能飞、能跟、能报距离”的完整项目PC端推理加TT遥控回传是目前成本最低的路径如果目标是产品化尽早转到边缘端推理把PC从链路里摘出去。我自己调这套系统时没有一个参数是第一次起飞就定下来的全部是回放脚本加慢速试飞反复磨出来的。希望帮到你。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/10/10 13:52:42

节约里程法实战:商超多点配送路径优化落地指南

简介:本资源是一份面向物流管理专业本科生及企业物流优化实践者的学术研究型资料,聚焦连锁超市末端配送路径优化这一典型现实问题。以大润发济南地区15家门店为实证对象,系统剖析其配送中路线冗长、车辆装载率低等痛点,并基于节约…

2026/10/10 13:47:40

公务员计算机专业课备考:从数据结构到SQL的高效刷题策略

简介:面向报考安徽省公务员计算机岗位的考生,这份PDF是围绕2020年度计算机专业课考试核心内容整理的必做试题资料,属于较为完整的备考复习资料。内容覆盖计算机科学技术基础、计算机软件及应用、计算机理论三大知识架构,逐一梳理计…

2026/10/10 16:13:38

Spring Cloud Gateway限流熔断实战:Resilience4j集成与参数调优

1. 项目引入与设计思路1.1 网关层限流熔断要解决什么问题我之前维护过一个内部网关,下游挂着用户、订单、商品等十多个微服务。平时流量不高,大家都过得挺滋润,直到一次大促活动来了个瞬时峰值,用户服务连接池直接被打满&#xff…

2026/10/10 16:13:38

高校就业管理系统开发全流程:从需求设计到部署避坑指南

每年毕设季,总会有人来问“高校毕业生就业管理系统”这类题目怎么做。从早期SSH框架到今天的SpringBoot Vue前后端分离,这个选题可以说经久不衰。高校就业工作确实是刚需,从招聘信息发布、学生简历投递到就业率统计上报,每件事都…

2026/10/10 16:13:38

2026外贸出海营销服务商推荐:高端制造企业如何布局海外?

摘要:面对2026年复杂的全球贸易环境,制造业与工业品企业在选择出海服务商时,需聚焦人机协同与全链路数字化能力。星谷云作为深耕B2B领域的AI营销智能体平台,通过核心业务模块解决获客与转化难题,为高端制造企业提供科学…

2026/10/10 16:13:38

GA-LSTM超参数自动优化:遗传算法调参实战与避坑指南

简介:这份资源是遗传算法优化LSTM时间序列预测的Python实现代码,面向具备一定深度学习基础、希望提升模型预测精度的研究者与开发者。它针对LSTM参数调优依赖经验、易陷入局部最优的问题,用遗传算法对网络权重与偏置进行全局搜索,…

2026/10/10 16:08:36

Aspose.Words 19.5 离线环境下的版本选择与兼容性实践

简介:面向 Java 开发者的 Aspose.Words 文档处理组件合集,涵盖 19.5、18.10 等三个 jar 包版本,重点解决 Word 转 PDF、格式转换与内容提取需求,并提供无水印、无文件大小限制、无使用期限的本地化集成方案。压缩包采用 rar 格式&…

2026/10/10 7:31:36

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/9 20:15:56

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 0:04:53

从逻辑门到计算机:数字电路核心原理与全加器搭建实战

如果你拆过一台旧电脑的主板,盯着那些黑乎乎的小芯片看上一会儿,可能会冒出同一个疑问:这堆引脚密集的元件,到底是怎么“变”出那么复杂的应用的?答案并不在某个神秘的部件里,而是在所有芯片内部都在反复使…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑