基于YOLOv5与Tello TT的无人机视觉追踪与测距全流程实战
2026/9/3 7:25:24 网站建设 项目流程

简介:本资源是一套面向K12教育与高校课程设计、毕业设计的计算机视觉实战项目,基于YOLOv5深度学习框架与大疆Tello TT教育无人机,完整实现旗标与圆圈目标的实时检测、动态追踪及单目测距功能。适用于深度学习、CV图像识别、模式识别方向的学习者与毕设开发者,尤其适合需快速落地的工程实践场景。压缩包共1679个文件(249.27MB),含775张标注图像(jpg)、694份标签文本(txt)、94个配置文件(yaml)、46个核心Python脚本(py)及8个训练好的.pt模型,覆盖数据采集、模型训练、无人机通信控制、测距算法集成与可视化全流程。已有2185人学习下载,配套详尽操作说明文档,目录结构模块清晰,支持开箱即用;同时保留TensorBoard日志(events.out.tfevents)便于训练过程复盘与调优,具备良好可扩展性,可快速迁移适配其他目标类别。

1. 项目概述:当YOLOv5遇见Tello TT,一个完整的端侧AI视觉项目

如果你手头有一台大疆Tello TT教育无人机,又对计算机视觉和目标检测感兴趣,那么这个项目可能就是为你量身定做的。它不是一个简单的Demo,而是一个从模型训练、部署到实际飞行控制与测距的完整闭环解决方案。核心思路非常清晰:利用YOLOv5这个当下最流行、最易上手的实时目标检测框架,训练一个能够识别特定目标的模型,然后将其部署到一台能够运行Python的电脑或开发板上,通过Wi-Fi与Tello TT无人机建立连接,实时接收无人机摄像头回传的视频流,进行目标检测与追踪,并基于简单的几何关系估算出目标与无人机之间的距离,最终通过发送控制指令,让无人机实现自动追踪飞行。

这个项目的价值在于它的“完整性”和“可复现性”。它打包了从数据集、训练好的模型、完整的源代码到详细操作说明的一切,省去了你从零开始搜集数据、标注、调试代码、解决环境依赖的漫长过程。对于想快速上手AI+无人机应用开发的学生、创客或研究者来说,这是一个极佳的切入点。你可以直接运行它,看到无人机追着一个球或一个人跑,然后基于这个成熟的框架,去修改识别目标(比如换成你的宠物、特定的手势或工具),调整追踪算法,甚至集成更复杂的路径规划逻辑。

2. 核心组件深度解析:YOLOv5与Tello TT的协同工作流

要理解这个项目,我们需要拆解它的两个核心:算法端的YOLOv5和硬件端的Tello TT无人机,并理清它们是如何协同工作的。

2.1 YOLOv5:为何是快速入门的首选?

YOLOv5并非官方YOLO系列,而是由Ultralytics公司维护的一个非常成功的开源实现。它之所以成为众多入门项目和工业级应用的首选,原因在于其极致的易用性和优秀的性能平衡。

项目结构清晰:YOLOv5的代码库结构非常规整。models/目录下定义了不同大小的网络模型(如yolov5s, yolov5m, yolov5l, yolov5x),data/目录下存放数据集配置文件,utils/目录包含了大量工具函数,从数据加载、指标计算到日志记录一应俱全。这种结构让你很容易找到需要修改的部分。

训练流程高度自动化:这是YOLOv5最大的魅力之一。你只需要准备好符合YOLO格式的数据集(图片+对应的txt标注文件),然后修改一个data.yaml配置文件,指定你的类别名称和训练/验证集路径,一行命令python train.py --img 640 --batch 16 --epochs 100 --data data.yaml --weights yolov5s.pt就可以开始训练。它自动处理了数据增强、学习率调度、模型保存、可视化等几乎所有繁琐的步骤。对于新手,这避免了在训练脚本里挣扎于各种参数和bug。

灵活的部署选项:训练完成后,YOLOv5提供了export.py脚本,可以轻松地将PyTorch模型转换为多种格式,如ONNX、TensorRT、CoreML等,方便部署到不同的硬件平台(如NVIDIA Jetson、苹果设备、移动端)。在本项目中,由于是在PC端运行,直接使用PyTorch模型是最简单的。

关于“热词”中训练单通道图像的说明:YOLOv5默认输入是3通道(RGB)图像。如果你有红外或深度等单通道图像数据,确实需要修改数据加载和模型输入层。这通常涉及在数据预处理时将单通道图像复制成3通道,或者更彻底地,修改模型第一层卷积的输入通道数。但这属于进阶操作,本项目提供的预训练模型和数据集大概率是基于常规RGB图像的。

2.2 大疆Tello TT:不只是玩具,更是AI实验平台

Tello TT是大疆针对教育市场推出的可编程无人机。它基于经典的Tello,但增加了更多的扩展接口和编程支持。

核心通信机制:Wi-Fi与SDK:Tello TT通过创建一个Wi-Fi热点,让控制端(你的电脑或树莓派)连接上去。控制端通过UDP协议向无人机发送指令,并接收无人机返回的状态信息和视频流。大疆提供了官方的Tello SDK,其中包含了一系列简单的文本指令,如command(进入SDK模式)、takeoff(起飞)、land(降落)、rc a b c d(发送遥控器通道值)等。本项目的源码核心之一,就是封装了与Tello TT通信的模块,实现了指令发送、状态接收和视频流解码。

视频流获取:这是实现实时检测的关键。Tello TT的视频流默认是H.264编码的UDP流。在Python中,通常使用cv2.VideoCapture并指定一个特殊的URL(如udp://0.0.0.0:11111)来捕获这个流。这里有一个常见的坑:视频流的解码和读取可能会阻塞主线程,导致控制指令发送不及时。成熟的代码会采用多线程或异步IO,将视频捕获、图像处理和飞行控制逻辑分离。

控制与稳定性:Tello TT的飞行控制精度和抗风能力无法与专业无人机相比,这恰恰是项目需要处理的实际问题。简单的“检测到目标在画面左侧就向左飞”逻辑,很容易导致无人机剧烈振荡。因此,项目中通常会实现一个简单的PID控制器,根据目标在画面中的位置偏差(例如,距离画面中心的x,y像素差),计算出平滑的速度控制指令,再通过rc命令发送给无人机。

2.3 系统工作流串联

整个系统的工作流可以概括为以下闭环:

  1. 初始化:程序启动,连接Tello TT Wi-Fi,发送commandstreamon等指令开启视频流。
  2. 视频捕获线程:一个独立的线程持续从UDP地址抓取H.264码流,解码为OpenCV可处理的帧(frame)。
  3. 目标检测线程:主线程或另一个线程获取最新的视频帧,将其缩放至YOLOv5模型所需的输入尺寸(如640x640),进行归一化,然后送入模型进行推理。
  4. 后处理与追踪:解析模型的输出,得到边界框(Bounding Box)、置信度(Confidence)和类别(Class)。应用非极大值抑制(NMS)去除重叠框。为了在帧与帧之间关联同一目标,通常会引入一个追踪器(如简单的IOU追踪,或集成SORT、DeepSORT等算法)。本项目可能采用了相对简单但有效的基于位置和特征匹配的追踪。
  5. 测距计算:这是项目的亮点之一。单目测距通常需要一个已知的参考尺寸。例如,如果检测目标是一个人,且你知道人的平均肩宽或身高,那么根据目标在图像中的像素宽度和相机的焦距,可以利用小孔成像原理估算距离。公式大致为:距离 = (实际物体宽度 * 焦距) / 图像中物体像素宽度。焦距需要事先通过相机标定获得,或者进行估算。项目文档中应明确说明其测距所基于的假设和参考尺寸。
  6. 控制决策与指令发送:根据追踪到的目标在画面中的位置(是否居中?),结合估算出的距离(是否太近或太远?),通过PID控制器或其他控制算法,计算出前后、左右、上下、旋转四个通道的速度值。最后,将这些速度值封装成rc指令,通过UDP发送给无人机。
  7. 可视化与日志:在电脑屏幕上实时显示视频流,并绘制出检测框、追踪ID、置信度和估算距离,同时可能记录飞行日志和数据,便于调试和分析。

3. 环境搭建与源码运行:避开依赖地狱的实战指南

拿到一个包含完整源码的压缩包,第一步不是急着运行,而是仔细阅读操作说明文档(通常为README.md)。但即使有文档,环境搭建仍是新手最容易踩坑的地方。下面我结合常见问题,给出一个更详细的指引。

3.1 Python环境与核心依赖隔离

强烈建议使用Anaconda或Miniconda创建独立的Python虚拟环境。这能避免与系统Python或其他项目的包版本冲突。

# 创建并激活一个名为tello_yolo的Python3.8环境(3.8是一个兼容性较好的版本) conda create -n tello_yolo python=3.8 conda activate tello_yolo

接下来安装PyTorch。这里需要根据你的电脑是否有NVIDIA GPU来选择不同版本。去PyTorch官网查看安装命令是最稳妥的。

# 例如,对于CUDA 11.3的Windows系统,可能使用: pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113 # 对于只有CPU的机器: pip install torch==1.12.1+cpu torchvision==0.13.1+cpu torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cpu

关键点:PyTorch版本与后续一些包的兼容性有关。如果项目代码较旧,使用最新的PyTorch可能会报错。操作说明文档里应该指明了推荐的版本。如果没有,尝试使用1.7-1.12之间的版本。

然后安装YOLOv5的核心依赖。通常项目里会有一个requirements.txt文件。

pip install -r requirements.txt

常见坑点1:opencv-python安装失败或版本冲突requirements.txt里可能写的是opencv-python。如果安装慢或失败,可以尝试使用国内镜像源,或者安装精简版opencv-python-headless。确保安装成功,因为它是视频流解码和图像显示的关键。

常见坑点2:protobuf版本冲突。在安装某些包时,可能会遇到protobuf版本过高导致的错误。如果遇到TypeError: Descriptors cannot not be created directly.这类错误,可以尝试降级:pip install protobuf==3.20.*

3.2 项目源码结构解读

解压后的项目文件夹,结构可能如下:

Tello_YOLOv5_Tracking/ ├── README.md # 操作说明文档,务必先读 ├── requirements.txt # Python依赖包列表 ├── data/ │ ├── dataset/ # 训练用的图像和标注文件 │ │ ├── images/train/ │ │ ├── images/val/ │ │ ├── labels/train/ │ │ └── labels/val/ │ └── dataset.yaml # 数据集配置文件,定义了类别和路径 ├── models/ │ ├── yolov5s_custom.pt # 训练好的自定义模型权重 │ └── ... # 可能还有其他模型文件 ├── utils/ # 工具函数,可能包含通信、追踪、测距模块 │ ├── tello_controller.py │ ├── tracker.py │ └── distance_estimator.py ├── runs/ │ └── train/ # 训练结果(如果包含),有损失曲线、验证结果等 └── main.py # 主程序入口

关键文件说明

  • data/dataset.yaml:这是YOLOv5训练和验证时读取的数据集配置文件。你需要确认里面的path(数据集根路径)、trainval的路径是否正确指向你本地的data/dataset目录。有时压缩包解压后路径层级变了,需要手动修改。
  • models/yolov5s_custom.pt:这是项目的核心资产,即针对特定目标(比如“球”、“人”)训练好的模型权重。它是在官方yolov5s.pt预训练权重基础上微调得到的。
  • utils/下的模块:这些是项目自定义的代码。tello_controller.py负责所有与无人机的通信;tracker.py实现了目标追踪逻辑;distance_estimator.py包含了测距算法。理解这些模块是二次开发的基础。
  • main.py:主循环。它通常会初始化Tello连接、启动视频流线程、加载YOLOv5模型,然后进入一个while循环,在循环中执行检测、追踪、测距、控制决策和发送指令。

3.3 连接无人机与首次运行

  1. 给Tello TT充电:确保电池电量充足。
  2. 开启无人机:短按一下电源键,听到提示音,指示灯闪烁。
  3. 连接Wi-Fi:在电脑的网络设置中,找到名为“TELLO-XXXXXX”的Wi-Fi热点,点击连接。密码通常是固定密码。
  4. 运行程序:在激活的conda环境中,切换到项目根目录,运行主程序。
python main.py

首次运行预期行为与问题排查

  • 正常情况:命令行会输出连接成功的信息,然后弹出一个窗口显示无人机摄像头的实时画面。当你把目标物体(比如项目训练时用的红色小球)放在镜头前,画面中应该会出现一个框将其框住,并显示标签和距离。按键盘上的‘T’键(具体看说明文档)可能控制无人机起飞并开始追踪。
  • 常见错误1:连接超时。程序无法连接到无人机。检查电脑是否真的连接到了Tello的Wi-Fi,有时需要禁用其他网络连接。检查代码中Tello的IP地址和端口是否正确(通常是192.168.10.1,端口8889)。
  • 常见错误2:无法获取视频流。画面窗口是黑的。检查是否发送了streamon指令。检查OpenCV的VideoCapture是否成功打开了UDP流地址。有时防火墙或安全软件会拦截UDP数据包,可以暂时关闭试试。
  • 常见错误3:模型加载失败。提示找不到模型文件或加载出错。检查models/文件夹下权重文件的路径和名称是否与代码中torch.hub.load()torch.load()调用时指定的一致。确保PyTorch版本兼容。
  • 常见错误4:检测不到目标。模型没有反应。确认你拿的目标物体与训练数据集中的物体是否类似(颜色、形状、大小)。光照条件差异过大也可能影响检测效果。可以尝试用手机拍一张包含目标的照片,用项目里的检测代码单独测试一下模型是否正常工作。

4. 从使用到理解:拆解核心算法模块

要真正掌握这个项目,不能只满足于运行。我们需要深入几个核心模块,理解其实现原理,这样才能在出问题时调试,或按自己需求修改。

4.1 目标追踪模块的实现逻辑

对于无人机追踪,一个稳定的追踪器至关重要。简单的每帧独立检测会导致框体闪烁、ID跳变,无法提供平滑的位置信号给控制器。

基于IOU的简单追踪:这是最基础的追踪方法。在连续两帧中,计算当前帧所有检测框与上一帧所有追踪框的交并比(IOU)。IOU最大的且超过一定阈值(如0.3)的,被认为是同一个目标,并更新该追踪框的位置。如果某个检测框与所有现有追踪框的IOU都低于阈值,则将其初始化为一个新的追踪目标。如果一个追踪框连续若干帧没有匹配到检测框,则将其删除。这种方法计算量小,但对于快速移动、遮挡或外观变化大的目标容易跟丢。

集成SORT/DeepSORT:更鲁棒的方案是集成成熟的追踪算法,如SORT(Simple Online and Realtime Tracking)或DeepSORT。SORT在IOU匹配的基础上,引入了卡尔曼滤波来预测目标在下一帧的位置,然后用预测位置与检测位置进行匹配,这能更好地处理匀速运动。DeepSORT进一步加入了外观特征(通过一个深度学习网络提取),在IOU匹配失败时,可以依靠外观相似度进行匹配,大大提高了对遮挡后重现目标的追踪能力。本项目如果追求稳定性,很可能会采用或借鉴DeepSORT的思想。

在代码中的体现:在utils/tracker.py中,你可能会看到一个Tracker类。它内部维护着一个track_list,每个track包含:唯一ID、最近的位置(框坐标)、一个卡尔曼滤波器实例(如果有)、一个外观特征向量(如果有)、以及丢失帧数计数器。在每一帧,update(detections)方法被调用,传入当前帧的所有检测框。方法内部完成预测、匹配、更新、创建新轨迹、删除旧轨迹等一系列操作,最后返回当前活跃的追踪列表。

4.2 单目视觉测距的原理与校准

单目测距是一个有挑战但很有趣的话题。它基于透视投影中的几何关系。

核心公式D = (F * W_real) / W_pixel

  • D:相机到物体的真实距离(单位:米)。
  • F:相机的焦距(单位:像素)。注意,这里的焦距不是物理焦距(毫米),而是以像素为单位的焦距,它包含了传感器尺寸和图像分辨率的信息。
  • W_real:物体的实际物理宽度(单位:米)。
  • W_pixel:物体在图像中的像素宽度。

如何获取焦距F?有两种常见方法:

  1. 相机标定:使用棋盘格等标定板,通过OpenCV的cv2.calibrateCamera函数进行相机内参标定,可以直接得到焦距fxfy(以像素为单位)。这是最准确的方法。Tello TT的摄像头参数可能在网上能找到,但不同批次可能有微小差异。
  2. 参照物估算:这是项目中更可能采用的方法。在已知距离D_known的地方,放置一个已知宽度W_real的物体,测量它在图像中的像素宽度W_pixel_known。然后反推焦距:F = (D_known * W_pixel_known) / W_real。将这个计算出的F作为常数写入代码。

实际操作中的问题

  • 物体宽度W_real的确定:如果目标是“人”,宽度变化很大。通常可以取一个平均值,如肩宽0.5米。这会导致测距有系统误差,但对于追踪控制来说,相对距离的变化趋势比绝对精度更重要。
  • 像素宽度W_pixel的测量:直接取检测框的宽度。但检测框的宽度并不完全等于物体的实际成像宽度,尤其是当物体不是正面面对相机时。这引入了另一个误差源。
  • 俯仰角的影响:当无人机有俯仰角度时,测距公式需要修正。对于教育项目,通常假设无人机近似水平飞行。

utils/distance_estimator.py中,你会看到一个DistanceEstimator类,初始化时可能就设定了FOCAL_LENGTHKNOWN_WIDTH这两个常数。它的calculate_distance(box_width)方法就是简单套用上述公式。

4.3 飞行控制策略:从像素偏差到速度指令

这是将视觉信息转化为行动的桥梁。一个糟糕的控制策略会让无人机像醉汉一样摇晃,甚至失控。

位置偏差计算:首先,我们需要定义一个“期望位置”,通常是图像的中心点(frame_center_x, frame_center_y)。对于每个被追踪的目标,计算其边界框的中心点(obj_center_x, obj_center_y)。那么偏差就是:

error_x = obj_center_x - frame_center_x # 水平偏差,正数表示目标在中心右侧 error_y = obj_center_y - frame_center_y # 垂直偏差,正数表示目标在中心下方 error_z = current_distance - desired_distance # 深度偏差,当前距离减去期望距离

error_y通常用于控制无人机的前后飞行(因为相机画面上下对应实际世界的前后),error_x用于控制左右平移,error_z用于控制升降。

PID控制简介:比例-积分-微分控制器是工业界最经典的控制算法。在本项目中,可能只使用了比例(P)控制,或者比例微分(PD)控制。

  • 比例控制speed = Kp * error。偏差越大,输出速度越大。简单直接,但容易在目标点附近振荡。
  • 积分控制:解决稳态误差(即始终无法完全对准中心的问题),但可能引入超调和震荡。
  • 微分控制:根据偏差的变化率来输出,可以抑制振荡,增加稳定性。

一个简单的P控制器实现可能如下:

# 假设我们只为左右平移设计控制器 Kp = 0.05 # 比例系数,需要手动调试 max_speed = 30 # Tello TT的速度上限 error_x = obj_center_x - frame_center_x speed_x = int(Kp * error_x) # 限制速度范围 speed_x = max(-max_speed, min(max_speed, speed_x))

然后将speed_x转换为Tello的rc命令中的左右通道值。

调试心得:调试PID参数(尤其是Kp)是个耐心活。一开始把Kp设得非常小(如0.01),观察无人机的反应。如果反应太慢,缓慢增大Kp;如果开始剧烈振荡,说明Kp太大了,需要减小。同时,一定要设置一个合理的速度死区(dead zone),比如当abs(error_x) < 20像素时,不发送移动指令,避免无人机在中心点附近高频微抖。

5. 模型训练与自定义:打造你自己的“眼睛”

项目提供的预训练模型可能只针对特定目标(如网球)。如果你想让它识别你的水杯、你的猫,或者某个特定的手势,就需要训练自己的模型。这是项目最具扩展性的部分。

5.1 数据准备:质量胜过数量

  1. 收集图像:用Tello TT的摄像头拍摄是最佳选择,因为光照、角度、背景与最终应用场景一致。围绕你的目标物体,从不同距离、不同角度、不同光照条件下拍摄几百张到上千张图片。背景尽可能多样化。也可以从网上搜集相关图片,但要注意域适应问题(网络图片和无人机实拍图的分布差异)。
  2. 数据标注:使用标注工具,如LabelImg、CVAT、Roboflow等。标注格式必须为YOLO格式:每个图像对应一个同名的.txt文件,文件每一行代表一个标注框,格式为:<class_id> <x_center> <y_center> <width> <height>。其中坐标和宽高都是相对于图像宽度和高度的归一化值(范围0-1)。例如,一个在图片正中央,占图片一半宽高的物体,其标注为:0 0.5 0.5 0.5 0.5
  3. 数据集划分:将标注好的数据按大约8:2或7:2:1的比例划分为训练集(train)、验证集(val)和测试集(test)。验证集用于训练过程中评估模型性能,调整超参数;测试集用于最终模型性能的客观评价。

5.2 配置文件修改与训练启动

  1. 创建dataset.yaml:在data/目录下,仿照已有的yaml文件,创建一个新的配置文件,例如my_custom_data.yaml
# 数据集根目录路径(可以是绝对路径或相对于train.py的相对路径) path: ../datasets/my_custom_data # 训练集和验证集图像目录(相对于path的路径) train: images/train val: images/val # 类别数 nc: 1 # 例如,只识别‘cup’这一类 # 类别名称列表 names: ['cup']
  1. 开始训练:使用YOLOv5提供的训练脚本。关键参数需要理解:
python train.py \ --img 640 \ # 训练图像尺寸,必须是32的倍数 --batch 16 \ # 批次大小,根据你的GPU显存调整 --epochs 100 \ # 训练轮数 --data data/my_custom_data.yaml \ # 你的数据集配置文件 --weights yolov5s.pt \ # 使用预训练权重进行迁移学习,加速收敛 --name cup_detection_exp1 # 本次实验的名称,结果会保存在 runs/train/cup_detection_exp1/
  • --weights yolov5s.pt:这是关键。从预训练模型开始训练(迁移学习),比从零开始训练快得多,效果也好得多,尤其在小数据集上。
  • --batch:越大训练越稳定、越快,但需要更多显存。如果出现CUDA out of memory错误,就减小这个值,或减小--img尺寸。
  • --epochs:不是越多越好。观察验证集上的指标(如mAP),当指标不再上升甚至下降时,就可以提前停止,防止过拟合。

5.3 训练过程监控与模型评估

训练开始后,YOLOv5会在终端打印日志,并在runs/train/实验名/目录下生成丰富的可视化结果:

  • results.png:损失函数曲线和性能指标(精确度、召回率、mAP)随训练轮次的变化图。这是判断训练是否正常、是否过拟合的核心依据。理想的曲线是训练损失和验证损失都平稳下降并趋于平缓,mAP稳步上升。
  • confusion_matrix.png:混淆矩阵,看模型是否容易混淆不同类别。
  • val_batchX_labels.jpgval_batchX_pred.jpg:验证集批次的真实标签和模型预测结果对比,直观看到检测效果。

训练完成后,最佳模型权重会自动保存为runs/train/实验名/weights/best.pt。你可以用这个权重文件替换项目中原有的模型文件,你的无人机就拥有了识别新目标的能力。

一个重要的经验:在用自己的数据训练前,先用项目提供的预训练模型在你自己采集的几张图片上跑一下推理,确保整个数据流和代码是通的。然后,用训练好的新模型在验证集图片上测试,最后才放到真实的无人机视频流中测试。步步为营,能有效定位问题是出在数据、训练还是部署环节。

6. 项目优化与二次开发思路

当你能成功运行项目并完成自定义训练后,可以考虑从以下几个方向进行优化和深化,这会让你的项目从“能用”变得“好用”甚至“专业”。

6.1 提升追踪的鲁棒性

  • 集成更先进的追踪器:将项目中的简单追踪器替换为DeepSORT。你需要引入一个ReID(重识别)网络来提取外观特征。虽然计算量会增加,但对于存在部分遮挡、快速旋转的目标,追踪稳定性会大幅提升。网上有大量YOLOv5+DeepSORT的开源实现可供参考集成。
  • 多目标追踪:当前项目很可能只追踪置信度最高的一个目标。修改逻辑,使其能同时追踪多个目标,并为每个目标分配独立的ID。这在群体监控等场景下有应用价值。
  • 轨迹预测与滤波:对于卡尔曼滤波,可以尝试调整其过程噪声和测量噪声矩阵,使其更适应无人机和目标运动的动力学特性。也可以尝试使用更复杂的滤波器,如扩展卡尔曼滤波(EKF)或无迹卡尔曼滤波(UKF)。

6.2 改进测距精度

  • 多假设融合:如果目标具有相对稳定的长宽比(比如人),可以同时利用检测框的高度和宽度进行测距,然后取平均值或加权平均,能在一定程度上抵消单一边缘测量不准的影响。
  • 基于地面假设的测距:如果目标是停留在地面上的,并且知道无人机的相对高度(Tello TT没有气压计,但可以通过初始化时的高度设为0,并结合自身升降指令来估算),可以利用相机成像几何和地面平面假设,推导出更精确的距离。这需要一定的数学推导。
  • 引入传感器融合:Tello TT本身没有深度传感器。但如果未来使用带有TOF或双目视觉的无人机,可以直接获取深度信息,替代单目测距。

6.3 增强飞行控制与智能行为

  • 分层状态机:引入一个简单的状态机来管理无人机的行为。例如:SEARCH(搜索目标)、TRACK(追踪目标)、APPROACH(接近目标)、LAND(降落)等状态。使无人机的行为更有逻辑性。
  • 避障功能:这是极具挑战性但价值很高的扩展。可以尝试在YOLOv5中增加“障碍物”类别进行训练,或者在检测到前方过近有物体时,触发一个“急停”或“绕行”的指令。这需要非常谨慎的测试,以防炸机。
  • 航点追踪:不单纯让目标居于画面中心,而是让无人机按照预设的路径(如围绕目标转圈)飞行,同时保持目标在视野内。这需要结合目标的位置信息和预设的轨迹方程来生成控制指令。

6.4 性能优化与部署

  • 模型轻量化:如果部署在树莓派或Jetson Nano等边缘设备上,YOLOv5s可能仍显笨重。可以尝试使用更小的模型如YOLOv5n,或者使用模型剪枝、量化等技术来压缩模型,提升推理速度。
  • 使用TensorRT加速:如果你有NVIDIA Jetson平台,将PyTorch模型转换为TensorRT引擎,可以获得数倍的推理速度提升。YOLOv5官方提供了export.py脚本支持导出为ONNX,进而转换为TensorRT。
  • 通信优化:评估视频流传输的延迟。尝试降低视频流的分辨率或帧率,以减轻网络带宽和计算解码的压力。也可以探索使用更高效的编解码器。

这个基于YOLOv5和Tello TT的项目,就像一把钥匙,为你打开了嵌入式AI和机器人视觉控制的大门。从环境搭建、源码运行,到理解追踪、测距、控制的每一行代码,再到训练自己的模型并优化整个系统,每一步都充满了学习的乐趣和实用的价值。它最可贵的地方在于提供了一个完全可运行、可修改的基线,让你能快速验证想法,并将理论知识与动手实践紧密结合。在操作过程中,耐心阅读错误信息、善用搜索引擎、并且大胆地修改代码和参数进行实验,是掌握它的不二法门。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询