APP下载

无人机载光电吊舱显控软件的设计与实现

2021-04-08马希超魏志强

电视技术 2021年1期
关键词:吊舱视频流线程

马希超,魏志强,葛 珊

(中国电子科技集团公司第三研究所,北京 100015)

0 引 言

随着无人直升机在侦察、监视、消防及安保等领域的推广应用,无人机载光电吊舱的重要性日渐凸显[1-2]。作为无人机的关键载荷之一,光电吊舱通常集成可见光相机、红外热像仪等传感器,在采集并记录实时视频图像的同时,可实现手动搜索、自动跟踪及扫描等功能[3-4]。通常,光电吊舱装载在无人直升机上,通过有线或无线传输链路与地面操控台通信,下传实时视频流和设备状态信息,并接收操控指令。运行于地面操控台的显控软件用于实时解码和显示下传的视频,并实现人机交互[5]。

除光电吊舱本身的设备性能外,显控软件的设计和性能也对设备的使用体验具有重要作用[6]。良好的软件设计可最大程度地发挥硬件设备的性能,提高设备的易用性和灵活性。显控软件在运行中需同时处理视频流的接收、解码及显示,设备状态的接收、解析及显示,控制指令的产生和发送,软件界面人机交互,外设操纵杆动作响应等多项任务。由于显控软件需要同时处理的流程和任务繁多,因此必须合理设计规划多线程执行方式,保证各项流程的实时并行处理。

为此,设计并实现了一种基于C++语言和Qt框架的无人机载光电吊舱显控软件,通过对多线程结构和数据传递流程的合理设计,实现了软件的高效、可靠、稳定运行,同时具有友好易用的人机交互界面。

1 软件设计

1.1 功能设计

根据光电吊舱的设备功能、传输链路的连接形式以及实际使用的需要,显控软件应具备如下功能:通过UDP 网络通信方式接收包含视频流的数据包,并从中提取可见光视频流和红外视频流;实时解码并显示可见光视频和红外视频;通过串口接收设备状态数据,并进行解析显示;通过串口发送设备控制指令;响应软件界面的人机交互操作;响应外设操纵杆的动作,并转换为设备控制指令;其他软件功能,如视频记录、数据记录等。

1.2 模块设计

根据功能要求进行软件的功能模块设计,如图1 所示。各模块的具体功能,如表1 所示。

图1 功能模块图

表1 软件模块功能表

光电吊舱下传的视频流数据中既包含可见光视频流也包含红外视频流,通过数据包帧头的状态字进行区分。因此,视频流接收模块需对数据包进行解析,将提取出的两路视频流分别存入各自的数据缓存中。可见,光视频解码模块和红外视频解码模块分别从各自的数据缓存中读取视频流数据,通过解码得到原始YUV 格式图像,再经过格式转换得到可显示的RGB 图像数据并传递至显示模块,进而在软件界面上实现实时显示。

光电吊舱通过串口下传设备状态信息,由串口收发模块接收并解析后,通过显示模块以字符或图形方式显示到软件界面上。人机交互模块和操纵杆响应模块捕获操作人员通过软件界面或操纵杆进行的操作动作,并生成对应的控制指令,然后由串口收发模块发送给光电吊舱。

2 软件实现

2.1 开发环境和界面设计

软件的开发环境为Visual Studio 2015,编程语言为C++,采用Qt 5.11作为图形界面设计开发框架。软件的界面设计如图2 所示。

图2 软件界面设计

软件界面分为传感器控制、吊舱控制、记录仪/激光控制、系统状态显示及软件启动控制等5 个主要区域,通过合理的功能分区提高软件的易用性。此外,视频显示为单独窗口,可切换可见光和红外显示,便于在多屏设备上实现分屏显示。

2.2 线程设计

软件采用多线程方式实现各个功能模块的并行处理,线程设计如图3 所示。

图3 线程设计

按照Qt 的规定,软件界面的显示和交互只能在主线程执行,因此主线程运行显示模块和人机交互模块。软件启动后,主线程开始运行,创建5 个子线程,以并行方式运行其余5 个功能模块。线程之间的数据通信采用Qt 的signal/slot(即信号/槽)机制实现。该机制灵活安全,可有效避免大量采用全局变量可能引起的线程冲突和代码混乱。在软件停止运行前,主线程停止并销毁各子线程,释放占用的资源。

各个线程的创建均在功能模块的类内实现。以可见光视频解码模块为例,首先定义解码器类Decoder。该类继承自QObject,具有signal/slot 机制。定义该类所需的成员变量和成员函数,如开始解码startDecoding、停止解码stopDecoding 等。此外,需定义一个线程变量,即QThread thread,线程的起止函数分别为void start()和void stop()。在Decoder 类的构造函数中需包含以下处理:

connect(&thread, &QThread::started, this,&Decoder::startDecoding);

connect(&thread, &QThread::finished, this,&Decoder::stopDecoding);

moveToThread(&thread);

上述代码首先将线程的启动信号started 和Decoder 的开始执行函数startDecoding 相关联,将线程的停止信号finished 和Decoder 的结束执行函数stopDecoding 相关联,然后将Decoder 类移动到线程thread 中执行。这样对于Decoder 类的对象如tvDecoder,在需要启动解码器时,只需启动线程thread.start()。线程将发送启动信号started,进而触发startDecoding 函数,开始在thread 线程中执行。当需要停止解码器时,只需调用thread.quit(),线程会发送停止信号finished,并触发stopDecoding 函数执行相关的释放操作。

类内线程创建处理不影响模块类的各项功能实现,简化了程序设计,使得程序结构清晰易懂。

3 软件测试

软件设计开发完成后,与光电吊舱配合搭载于某型无人直升机。吊舱与地面操控台的通信采用无线传输链路,最大支持8 Mb/s 的传输速率。经多次挂飞实验验证,软件运行稳定,可同时解码并显示可见光视频和红外视频(视频截图如图4 和图5 所示),延迟较低,无明显卡顿现象,同时设备状态和控制指令收发正常,软件无闪退、报错等现象。

图4 可见光视频截图

图5 红外视频截图

4 结 语

本文设计了一种用于无人机载光电吊舱地面操控台的显控软件,可通过网络通信接收视频流数据并解码显示,通过串口收发设备状态和控制指令。软件采用C++语言和Qt 框架编程实现,采用多线程架构,通过功能模块类内创建线程,并充分发挥signal/slot 机制的灵活性,使得程序结构清晰易懂。经挂飞实验验证,本软件运行稳定,各项功能正常有效,无闪退、报错等现象。

猜你喜欢

吊舱视频流线程
基于有限元的吊舱内部温度场仿真分析与优化
边缘实时视频流分析系统配置动态调整算法研究
战机吊舱火力赋能“神器”
基于视频流传输中的拥塞控制研究
NEO—2X光电吊舱
浅谈linux多线程协作
美国视频流市场首现饱和征兆
吊舱式电力推进船舶螺旋桨匹配设计仿真研究
Linux线程实现技术研究
视频网格中流媒体业务的流量模型