微小型无人机载光电吊舱显控软件的设计与实现
2022-03-30王天澳黄书佳
王天澳,于 洵,朱 镭,王 刚,张 杨,黄书佳
(1.西安工业大学 光电工程学院,西安 710021; 2.西安工业大学 兵器科学与技术学院,西安 710021;3.西安应用光学研究所,西安 710021; 4.中国航天空气动力技术研究院,北京 100074)
0 引言
机载光电吊舱挂载于固定翼飞机、多轴旋翼飞机等常见机型,其集成了光电探测、稳像搜索、激光测照、光电图像处理等技术,可以完成目标跟踪/定位、疆场态势感知、军械引导与打击效果评估等作战任务[1]。当前,光电吊舱集多传感器于一体,并向着全天候、高分辨率、远距离、综合化、小型化发展[2]。微小型光电吊舱正是这种发展趋势下的产物,在敌情侦探、边疆巡检、火灾监控、海上救险等军民领域都发挥着重要的作用[3]。
目前,国内外的光电领域研究人员大多着重于光电吊舱的结构优化、光学性能提升等技术应用及发展趋势。如:王晨宇[4]等提出光电吊舱的分数阶鲁棒控制器设计与仿真,优化了光电吊舱控制系统的控制性能;王鹏鹏[5]等提出某无人机光电吊舱隔振机构设计和试验研究方法,提升了光电吊舱的隔振效果;魏志强[6]等研究了光电吊舱双路视频压缩存储方法,提高了双路视频压缩传输效率;张孟陶[7]等对光电吊舱的发展趋势做了深入的研究。
而与光电吊舱配套的地面显控软件则得到的关注较少,合理的地面显控软件同样对光电吊舱性能的发挥起着至关重要的作用[8]。地面操控人员通过地面显控软件,可以实时了解光电吊舱内部光电传感器的运行状态,电视/红外传感器实时拍摄的效果,并实现对光电吊舱的实时调整,以此提高任务的执行效率。
因此,开发一款高效的光电吊舱显控软件成为一种必要的需求。本文针对某微小型机载无人光电吊舱,设计了一款基于跨平台框架Qt的多模块集成光电吊舱显控软件。
1 显控软件系统概述
1.1 功能设计
本地面显控软件配套的微小型光电吊舱,主要挂载于微小型无人机、巡飞弹等平台,通过无线数传/图传构建数据链,将地面显控软件和机载光电吊舱相连接。根据微小型光电吊舱的任务需求,显控软件主要包含以下功能。
1)实时视频显示功能:通过千兆网口连接无线图传,使用UDP协议接收视频流,实时对视频流进行解码显示,并根据项目需要,在图像上叠加显示十字光标、跟踪框、测距值等辅助标识。
2)光电吊舱控制功能:获取地面人员的操作信息(调节电视、红外参数、电源通断、摇杆位移等),并转换为控制指令,发送给光电吊舱。
3)光电设备状态显示功能:地面设备连接无线数传,获取光电传感器的实时状态数据,软件实时解析数据,然后以文字、提示灯等多种形式展示。
4)数据记录功能:显控软件可以实时保存视频裸流和光电吊舱状态数据,以便后续的分析。
系统总体框图如图1所示。
图1 地面显控平台系统框图
1.2 模块设计
根据上述系统的功能要求,对显控软件的功能模块进行设计,具体设计如图2所示。同时,表1详细介绍了微小型光电吊舱显控软件组成模块的具体功能。
表1 显控软件模块功能表
图2 功能模块图
机载光电吊舱通过数据链路下行的视频流数据将被存入数据缓存,然后从缓存提取视频流,通过开源解码库FFmpeg的相关方法对获取的视频流进行解码,解码后得到YUV420P格式图像,此格式无法直接在Qt中使用控件显
示,故将其格式转变为RGB32[9],然后目标识别模块对图像中的特定目标进行标记,最后在Qt的控件上定时刷新显示。
光电吊舱通过无线数传下传光电传感器的状态信息,显控软件通过串口连接到地面无线数传,串口收发模块接收数据并根据相关算法进行解算,然后以数值或标记灯的形式在界面上显示。人机交互模块和摇杆响应模块,获取地面操作人员在显控软件上的操作(调节电视、红外参数、电源通断等)或摇杆移动动作,填入到传输报文中,然后通过串口收发模块发送到无线数传中,上行到光电吊舱,实现对光电吊舱的操控。
2 软件设计与实现
2.1 Qt开发环境简介
Qt是一款基于C++语言的跨平台图形界面开发,基于它开发的相关软件,源代码无需修改就可以在市面上绝大部分平台上运行,而且会自动适应相应操作系统的图形界面风格[10]。另一方面,Qt其独有的对象间信号槽通信机制取代了传统的回调函数机制,这降低了对象之间的耦合度,保证了传递参数的准确性。Qt同时有着全面又完善的C++图形库,其集成的模块有SQL模块、脚本模块、Network模块、XML模块等,并且这些模块都支持多线程操作,这显著提高了Qt开发复杂大规模工程的能力[11]。
QtCreator是由诺基亚公司研发的一款新的集成开发环境,功能齐全,开发界面简洁,环境配置简单,可以快捷的完成Qt项目的开发[12]。Qt Creator包括带语法标识的C++语言编辑器、GDB调试功能、源代码版本控制软件等。本文显控软件的设计基于Qt5.12.1版本下开发的,版本高包且包含模块丰富,能够满足项目开发的需要。
2.2 软件界面设计
本文基于QMainWindow主窗口类设计了显控软件。考虑到软件操作的便捷性和扩展性,在主窗口中添加了菜单栏、状态栏和工具栏等。在主窗口中添加界面基类QWidget,并将具体的功能组件,如QLabel、QGroupBox、QSpinBox等放入QWidget类中来实现具体的功能。另外,还使用了QTabWidget分页组件来切换不同传感器的控制页面,显控软件的主界面如图3所示。
图3 显控软件界面设计
该显控软件的主界面主要考虑到了易用性、合理性、可靠性等几方面的设计理念。显控软件主要分为:①控制分区:对小型光电吊舱(包括电视/红外传感器、吊舱伺服、记录仪/激光等组件)的实时控制;②视频显示分区:显示电视/红外视频(也可以开启目标识别、双击视频全屏等功能),并根据需要添加瞄准十字线、激光测距值、方位角等信息;③光电吊舱状态显示分区:显示光电吊舱的方位角、横滚角、系统模式、传感器选择、目标状态等信息;④操杆选项分区:配置操杆,选择启用实体操杆还是虚拟操杆等4个主要区域,合理的功能分区大大提高了显控软件的易用性。
2.3 多线程设计
本次设计显控软件采用多线程方式,从而实现各个模块的并行运行,软件设计流程图如图4所示。
图4 显控软件多线程设计
根据Qt的开发规则,主界面只能放在主线程中,所以将视频显示和人机交互放在主线程中。运行软件后,主线程启动,在其中创建5个子线程并启动,以此达到并行运行的效果。线程之前的通信,使用Qt独有的信号槽机制,并加互斥锁,保护共享数据。软件结束后,主线程中的析构函数内停止线程、销毁线程,释放内存资源[13]。
每个线程都对应一个模块的类,在相应的类里面启动线程,运行线程对应功能。以视频解码模块为例子,首先创建一个解码类VideoDecoder,继承于QObject,具有基类的特性。在解码类头文件中,定义所涉及到的变量和函数,包括解码起止函数decoderStart()、decoderStop()等。另外,需要注意的是要定义一个变量,如mflag来标记线程的状态,根据这个标记变量的值,运行线程需要执行的内容。定义的线程继承线程基类的开始和结束函数QThread::start()和QThread::stop()[14],通过信号槽关联到解码类中的起止函数。在VideoDecoder类的构造函数中需包含以下代码:
connect(&thread,&QThread::started,this, &VideoDecoder::decoderStart);
connect(&thread,&QThread::finished, this,&VideoDecoder::decoderStop);
moveToThread(&thread);
2.4 串口通信
显控软件通过串口与地面无线数传/图传相连接,天空端和地面端的无线数传/图传构成无线数据链路,实现数据的远程传输。考虑到需要实时上行和下行数据,采用RS422串口与无线数传相连进行通信。QT5提供了串口通信模块QtSerialPort模块,为硬件和虚拟的串口提供了统一接口[15]。使用Qt自带的串口模块,在开发需要串口通信模块的软件时,大大缩短了开发周期[16]。
在使用QtSerialPort模块时,只需在工程文件中加上代码Qt+=serialport。QtSerialPort提供了访问串口的接口函数,首先在主函数中创建一个QSerialPort类对象mySerialPort,其次,初始化串口,获取当前连接串口号;再次,设置串口连接模式为读写;最后将串口读取信号和对应的槽函数ReadData()相关联[17]。每当串口有新数据可从设备的当前读取通道读取时,该信号就会发出一次,接收到信号后,对应槽函数开始对串口数据进行读取。串口通信流程图如图5所示。
图5 串口通信流程图
串口相关代码如下:
mySerialPort = new QSerialPort(this); //新建一个串口对象,并初始化
mySerialPort->setPortName(ui->PortBox->currentText());
mySerialPort->open(QIODevice::ReadWrite)
mySerialPort->setBaudRate();//设置串口参数
mySerialPort->setParity();
mySerialPort->setDataBits();
mySerialPort->setStopBits();
mySerialPort->setFlowCtrl();
//连接信号和槽函数
connect(mySerialPort,SIGNAL(readyRead()), this, SLOT(ReadData()));
串口建立连接后,获取到光电吊舱下传的状态信息后,根据数据帧的帧头等校验信息,即可对封装数据进行解析,该软件设计的数据帧格式如表2所示。
表2 数据帧格式
由该数据帧结构可知,帧头固定值为0xDD;有效数据长度是除去:帧头字段,有效数据长度字段,通道标识字段,校验字段的内容,在报文中其值固定为0x1A,占两个字节;数据内容占用25个字节,包含飞载荷状态、自检结果、载荷轴角、目标距离、经纬度、高度等有效信息。通过对帧头、校验位等的验证获取一帧完整的数据包,然后将之解析,显示到主界面上。
2.5 视频解码显示
目前,微小型光电吊舱电视拍摄的视频分辨率为1 920*1 080p,直接对拍摄视频进行传输的话,理论上数据率为1.5 Gbps[18],当前市面上的无线数传/图传的带宽满足不了需求,必须要对拍摄视频进行压缩再传输。一般采用H.264或H.265压缩算法进行视频压缩,而开源解码库FFmepg(兼容linux等多个系统)对市面上大部分压缩算法有着良好的解码效率[19],视频解压后的图像数据为YUV格式。
视频解码的解码流程如图6所示,具体实现步骤如下讲述:
图6 视频流解码过程
图7 FFmpeg解码显示流程
1)开始/初始化阶段:调用注册函数,注册解码库中包含的文件格式和编码器。配置UDP连接参数,获取视频流;
2)取出包含在文件中的流信息:通过av_find_stream_info函数,获取数据流信息并存储。
3)寻找编码数据对应的解码器:根据第二步获取的数据流信息通过avcodec_find_decoder和avcodec_open函数,获取对应的解码器,打开解码器,为下面的视频解码做准备。
4)视频流解码:打开解码器后,使用av_read_frame函数读取一包未解码数据,把它解码成一帧图像,然后通过av_send_packet函数发送解码后图像,av_receive_frame函数接收解码后图像。
5)视频显示:调用sws_scale函数把解码后图像从原始格式转换成Qt支持的RGB格式,再调用OpenCV4.5.1视觉库在图像上叠加辅助线、文字等信息,最后通过定时刷新,实现视频解码后的播放。
2.6 目标检测和识别
传统光电吊舱中,目标检测和识别模块放在机载嵌入式模块里,而微小型光电吊舱体积小,重量轻,无法放置高性能目标识别模块,故将目标识别模块放在地面显控软件中实现[20]。地面站中专用服务器的算力相较机载嵌入式设备有着显著的提高,配合上目前市面上比较成熟稳定的目标检测和识别算法YOLOv3[21],显著提升了目标的检测速度和识别准确率。
2.6.1 Yolov3算法简介
Yolov3算法的基础网络由Darknet-53架构组成,Darknet-53 网络结构是在 Darknet-19和残差网络的两个网络的基础上做了改动。由表3可以看出,改进后的 Darknet-53 网络在精确率方面高于 Darknet-19 和 Resnt-10 网络,不过与 Resnt-152 网络相比略低,但是此网络每秒测量浮点运算的速度最高,比其他网络更快。
表3 Darknet-53网络与其他网络对比
2.6.2 软件中实现
由于本次项目针对的目标为民用车,官方训练的模型已经包括了这个类别,而且识别精度比较高,故直接使用了官方给的权重文件,这有效缩短了开发周期。在开发系统中配置CUDA环境,调用OpenCV4.5.1图像处理库读取YOLOv3训练后的权重文件,开启GPU加速,然后对实时接收、解码后的视频进行目标检测和识别。
// 载入权重文件
Net net = readNetFromDarknet(modelConfiguration, modelWeights);
net.setPreferableTarget(DNN_TARGET_CUDA);//使用GPU加速
net.setPreferableBackend(DNN_BACKEND_CUDA);
cv::rectangle(fpicture, Point(lef, top - 2 * labelSize.height - baseLine), Point(lef + round(labelSize.width), top - baseLine + 2), scalar, FILLED); //检测完成标记目标
putText(frame, label, Point(left, top - 0.5 * labelSize.height - baseLine - 1), FONT_HERSHEY_SIMPLEX, 0.8, Scalar(0, 0, 0), 1);
上述代码通过OpenCV读取Yolov3权重文件和对应标签文件,对视频图像逐帧检测,最后使用OpenCV中的画图库rectangle、putText等函数对识别后的目标进行框选。
2.7 摇杆操控模块
机载伺服控制模块通过获取的位移量去控制光电吊舱的横滚和俯仰角度。目前项目中,使用实体摇杆获取位移量发送给天空端。位移量的数值代表移动的速度,正负代表移动方向。同时可以在摇杆中定义一些快捷键,如跟踪和锁定,这样使地面人员的操作更加便捷。
该软件中摇杆控制使用的winmm.dll是Windows多媒体相关应用程序接口。如图8,通过QLibrary类,在程序运行时加载window动态链接库winmm.dll,通过resolve()解析并调用库中的具体方法,这样再下面的程序中可以直接调用qJoyGetPos这些解析过的方法了。摇杆数据获取编程设计流程如图8所示。
图8 摇杆数据获取流程
从图8可知,先检测当前系统是否有摇杆插入,然后检测是否按键按下,不然就一直循环查询,知道获取到数据为止,利用QT独有的槽函数,将摇杆数据结构joyinfoex_tag发射到主线程的display_slot_row(joyinfoex_tagstate_row)函数中。从joyinfoex_tag结构体,获取各种按键的信息,判断出是哪一个按键按下,再根据预先定义的功能,生成相应的指令。
3 软件测试
显控软件开发完成后,与某型微小型光电吊舱配套,在外场搭载于巡飞弹、某小型无人机等飞行器。对电视/红外探测器控制、激光照射等传感器指标进行完整测试,并基于目标的检测识别,对目标进行锁定、跟踪等测试。测试中,光电吊舱与地面站通过无线数传/图传相连接,选用的无线数传/图传最大支持6 Mb/s的传输速率。下面对各个模块进行一一测试。
3.1 串口通信测试
在测试中,将RS422 USB转串口连接电脑,波特率设置为115 200,数据位8位,停止位1,没有校验位和流控制位,对串口连接进行测试。读取串口接收的数据如图9所示。
图9 串口通信实测图
从图9可以看出,串口通讯稳定,数据发送,没有出现丢帧现象。获取数据后,就是对数据的解析和可视化显示,实验测试结果如图10所示。
图10 解析数据显示
解析后的数据显示正常,各个传感器状态显示正常,俯仰角、横滚角显示精确,并能在载荷状态改变时,实时刷新,满足系统需求。
3.2 摇杆测试
在实验中选用莱仕达的飞行模拟游戏摇杆PXN-2113进行实验,价格便宜,精度尚可,具有20个可自定义按键,满足实验中快捷键的设置数量。摇杆通过usb串口与电脑连接,如图11所示。
图11 摇杆调试场景
安装PXN-2113的驱动程序后,测试摇杆连接后,数据获取是否正确。摇杆获取到摇杆的状态信息,如图12所示。
图12 摇杆状态获取
dwXpos、dwYpos即为摇杆上下左右移动的位移量,dwButtonNumber代表按键数量,dwButton的值为被按下的按键的值。实测目前,这款摇杆功能还算满足要求,后面对经度要求高,会更换工业级别摇杆。
3.3 视频延时测试
视频延时对于实时侦察具有重要意义,在视频延时测试中,用网线将电脑与光电吊舱相连,在电脑上打开一个计时器,将光电吊舱转动,使电视对着电脑屏幕,然后开始以亳秒单位计时,此时可以同时观测到实际计时和显控软件中的计时。
这样电脑上运行的显控软件的显示时间,就是经过传输后在电脑界面上显示的时间,假设为T1,此时毫秒时钟时间为T2,则延时时差T=T2-T1。对测试延时进行多次记录,视频传输延时测试如表4。
实验中记录了多组数据,表4展示了7次延时时间的统计,通过计算得出延时时差平均为108.3 ms,后续再加上无线数传/图传的固定延时,延时时间在200 ms以内,满足目前项目的需求。
表4 视频传输延时测试
3.4 视频显示和目标识别测试
将光电吊舱连接软件后,对着窗外的典型目标民用车,测试视频的显示和目标识别,如图13所示。
图13 目标识别显示
经过室内的长期测试和多次外场挂飞实验,软件总体上运行平稳,没有卡死、崩溃等现象,光电载荷状态和控制指令收发显示正常,实时视频目标识别准确,画面显示流
畅,实时视频的延时在允许范围内,无明显掉帧卡顿现象,软件达到了各项设计要求。
4 结束语
本文设计了一种基于Qt框架的微小型无人机载光电吊舱显控软件,可通过串口实现光电传感器状态信息和控制指令的收发,通过网口通信实现视频流的接收和解码,通过YOLOv3算法模型实现对解码后图像中目标的实时检测和识别。该显控软件基于Qt和C/C++语言,具有良好的跨平台性,分模块和多线程的架构设计,使程序模块划分清晰,易读性强。但是,视频解码后,在地面进行目标检测、识别,进一步提高了实时视频的延时时间,在之后的工作中需继续研究,从而兼顾地面设备的高性能优势和实时视频的低延时需要。