无人机跟踪器——介绍和展示
项目介绍
考虑到未来低空经济不断发展,无人机智能化是未来所趋,加上导师的吩咐,我的课题应运而生。之前实验室的跟踪器基本只是一个demo(在开发板上跑个模型识别下视频就算完成),而导师对我的要求是将其做成一个产品(此时我的小脑袋瓜充满问号),所以我费劲脑汁,从产品的三要素出发(用户需求,功能,性能)开始了我的RK3588机载跟踪器开发。欢迎各位大佬们一起进行技术交流。
设备选型
1. 机载电脑
本项目采用Rockchip RK3588作为机载电脑,原因有以下几点:
国产化(实验室性质较为特殊)
RK3588有RGA(2D硬件加速),MPP(视频编解码硬件加速)和NPU(神经网络加速器)
- RGA可以优化视频拉流时的色域转换(NV12转RGB),图像变换(resize)等功能
- MPP可以实现硬件H264, H265的编解码,实现视频拉流和视频存储功能
- NPU可以加速神经网络推理速度,但需注意RK3588的NPU有三个核心,每个核心2TOPS, 核心之间没法共享算力。
RK3588配备4个2.4GHz的A76核心与4个1.8GHz的A55核心,可以处理一些复杂任务
SDK相对还算完善,可以通过瑞芯微的SDK自定义Linux镜像

2. 图传模块
本项目采用开源图传方案(经费不足),使用的是RunCam家的WifiLink1代,可以提供1080p90fps/720p120fps的视频推流能力。跟踪器的性能好坏主要和跟踪延迟和跟踪帧率有关。
跟踪延迟:由于跟踪器需要控制云台进行跟踪,若延迟较大,云台的控制延迟会过大,非常影响用户体验。
跟踪帧率:本项目采用单目标跟踪算法,跟踪算法是一种局/部区域跟踪,若帧与帧之间物体位移较大会对跟踪性能产生较大影响。

3. 无人机和跟踪云台
无人机是我自己买零件组装,采用的是ZD550尺寸的四轴飞行器,不得不说这无人机是真烧钱呀。
云台部分是直接淘宝买的一个二自由度的舵机云台, 只要轻点就行(无人机载重不太够)。

产品三要素
1.用户需求
我将用户分成使用用户和开发用户
- 使用用户:只关心跟踪效果,希望拿到跟踪器导入提供的Linux镜像开机即可自动运行
- 开发用户:需要对跟踪器的功能进行二次开发,自行构建Linux操作系统镜像
针对上述两个用户群体,我构建了两套框架,第一个框架采用QEMU+CHROOT+Makefile再结合瑞芯微的SDK对Linux的根文件系统镜像进行自动化部署,最后直接打包成Linux镜像。第二个框架将跟踪器的功能分解成视频处理模块,目标检测模块,目标跟踪模块,云台控制模块和通用模块,这些模块都提供了动态/静态链接库,用户可以直接调用这些模块的接口进行二次应用开发,这些模块的接口都被设计的非常容易使用,比如视频处理模块,用户调用gread函数即可读取一帧图像数据,gwrite函数即可保存一帧图像数据。
2. 功能
跟踪器目前通过部署OpenIPC地面站进行视频采集,需要移植RTL8812AU驱动进行视频拉流,主要功能目前如下:
- 视频处理模块: 基于Gstreamer开发,采用内存池和无锁队列减少系统调用和提高吞吐量
- 支持V4L2(摄像头)和UDP(图传)视频流输入,支持硬件编解码(MPP)和色域转换(RGA)
- 支持对用户程序的输入图像序列进行MP4存储
- 提供可拓展接口,用户可以自定义注册信号(视频通道关闭信号等),自定义视频缓存区模式和自定义缓冲区读取方式
- 目标检测模块: 目前支持yolov8进行目标检测,提供基于目标检测结果的跟踪功能,推理速度在45FPS(yolov8n量化模型)
- 目标跟踪模块: 目前支持nanotrack进行单目标跟踪,通过RKNPU进行推理加速,推理速度可达200FPS(只考虑推理部分)
- 云台控制模块: 云台控制需要先对跟踪结果进行滤波,然后输入云台控制算法(PID)进行计算,最后用PWM控制舵机
- 滤波模块:采用卡尔曼滤波平滑跟踪轨迹,涉及矩阵运算,但我不想额外加第三方库,就自己实现了一个简单的矩阵类
- 云台算法:提供线性控制和PID控制,将二维跟踪坐标转化成两个舵机的控制量
- 舵机控制:提供基于UART的命令控制,RK3588通过该模块对stm32进行通信,由stm32对舵机进行控制
- 通用模块: 该模块为用户或其他模块提供了一些方便的功能,如图像缩放,坐标框绘制等功能
3. 性能
跟踪器的性能优化主要集中在跟踪延迟和跟踪帧率两个指标,其影响在上文已经说明,这里介绍一些我做过的性能优化。
- 硬件加速: 凡是能用硬件加速的我都尽可能,这样可以大幅降低CPU负载,提高系统响应速度。
- 内存池: 由于视频采集速度很快,需要频繁申请和释放大内存块,通过内存池减少系统调用次数
- 无锁队列: 采集的图像会被存储在队列中,其他线程会从该队列获取图像,无锁队列可以提高队列吞吐量(高并发的时候)
- OpenMP: 将一些耗时的操作进行并行优化,如图像缩放和图像填充。
- 定点数优化:将一些浮点数运算进行优化,如0-1区间的浮点数变成0-255区间的整数,通过位移运算提高运算速度。
效果展示
这是之前录的视频,图传设置为720p60fps, 所以跟踪器频率也是60帧,下次再录一个120帧(视频上传到B站好像变成30帧了)