王天澳,于 洵,朱 鐳,王 剛,張 楊,黃書佳
(1.西安工業大學 光電工程學院,西安 710021; 2.西安工業大學 兵器科學與技術學院,西安 710021;3.西安應用光學研究所,西安 710021; 4.中國航天空氣動力技術研究院,北京 100074)
機載光電吊艙掛載于固定翼飛機、多軸旋翼飛機等常見機型,其集成了光電探測、穩像搜索、激光測照、光電圖像處理等技術,可以完成目標跟蹤/定位、疆場態勢感知、軍械引導與打擊效果評估等作戰任務[1]。當前,光電吊艙集多傳感器于一體,并向著全天候、高分辨率、遠距離、綜合化、小型化發展[2]。微小型光電吊艙正是這種發展趨勢下的產物,在敵情偵探、邊疆巡檢、火災監控、海上救險等軍民領域都發揮著重要的作用[3]。
目前,國內外的光電領域研究人員大多著重于光電吊艙的結構優化、光學性能提升等技術應用及發展趨勢。如:王晨宇[4]等提出光電吊艙的分數階魯棒控制器設計與仿真,優化了光電吊艙控制系統的控制性能;王鵬鵬[5]等提出某無人機光電吊艙隔振機構設計和試驗研究方法,提升了光電吊艙的隔振效果;魏志強[6]等研究了光電吊艙雙路視頻壓縮存儲方法,提高了雙路視頻壓縮傳輸效率;張孟陶[7]等對光電吊艙的發展趨勢做了深入的研究。
而與光電吊艙配套的地面顯控軟件則得到的關注較少,合理的地面顯控軟件同樣對光電吊艙性能的發揮起著至關重要的作用[8]。地面操控人員通過地面顯控軟件,可以實時了解光電吊艙內部光電傳感器的運行狀態,電視/紅外傳感器實時拍攝的效果,并實現對光電吊艙的實時調整,以此提高任務的執行效率。
因此,開發一款高效的光電吊艙顯控軟件成為一種必要的需求。本文針對某微小型機載無人光電吊艙,設計了一款基于跨平臺框架Qt的多模塊集成光電吊艙顯控軟件。
本地面顯控軟件配套的微小型光電吊艙,主要掛載于微小型無人機、巡飛彈等平臺,通過無線數傳/圖傳構建數據鏈,將地面顯控軟件和機載光電吊艙相連接。根據微小型光電吊艙的任務需求,顯控軟件主要包含以下功能。
1)實時視頻顯示功能:通過千兆網口連接無線圖傳,使用UDP協議接收視頻流,實時對視頻流進行解碼顯示,并根據項目需要,在圖像上疊加顯示十字光標、跟蹤框、測距值等輔助標識。
2)光電吊艙控制功能:獲取地面人員的操作信息(調節電視、紅外參數、電源通斷、搖桿位移等),并轉換為控制指令,發送給光電吊艙。
3)光電設備狀態顯示功能:地面設備連接無線數傳,獲取光電傳感器的實時狀態數據,軟件實時解析數據,然后以文字、提示燈等多種形式展示。
4)數據記錄功能:顯控軟件可以實時保存視頻裸流和光電吊艙狀態數據,以便后續的分析。
系統總體框圖如圖1所示。

圖1 地面顯控平臺系統框圖
根據上述系統的功能要求,對顯控軟件的功能模塊進行設計,具體設計如圖2所示。同時,表1詳細介紹了微小型光電吊艙顯控軟件組成模塊的具體功能。

表1 顯控軟件模塊功能表

圖2 功能模塊圖
機載光電吊艙通過數據鏈路下行的視頻流數據將被存入數據緩存,然后從緩存提取視頻流,通過開源解碼庫FFmpeg的相關方法對獲取的視頻流進行解碼,解碼后得到YUV420P格式圖像,此格式無法直接在Qt中使用控件顯
示,故將其格式轉變為RGB32[9],然后目標識別模塊對圖像中的特定目標進行標記,最后在Qt的控件上定時刷新顯示。
光電吊艙通過無線數傳下傳光電傳感器的狀態信息,顯控軟件通過串口連接到地面無線數傳,串口收發模塊接收數據并根據相關算法進行解算,然后以數值或標記燈的形式在界面上顯示。人機交互模塊和搖桿響應模塊,獲取地面操作人員在顯控軟件上的操作(調節電視、紅外參數、電源通斷等)或搖桿移動動作,填入到傳輸報文中,然后通過串口收發模塊發送到無線數傳中,上行到光電吊艙,實現對光電吊艙的操控。
Qt是一款基于C++語言的跨平臺圖形界面開發,基于它開發的相關軟件,源代碼無需修改就可以在市面上絕大部分平臺上運行,而且會自動適應相應操作系統的圖形界面風格[10]。另一方面,Qt其獨有的對象間信號槽通信機制取代了傳統的回調函數機制,這降低了對象之間的耦合度,保證了傳遞參數的準確性。Qt同時有著全面又完善的C++圖形庫,其集成的模塊有SQL模塊、腳本模塊、Network模塊、XML模塊等,并且這些模塊都支持多線程操作,這顯著提高了Qt開發復雜大規模工程的能力[11]。
QtCreator是由諾基亞公司研發的一款新的集成開發環境,功能齊全,開發界面簡潔,環境配置簡單,可以快捷的完成Qt項目的開發[12]。Qt Creator包括帶語法標識的C++語言編輯器、GDB調試功能、源代碼版本控制軟件等。本文顯控軟件的設計基于Qt5.12.1版本下開發的,版本高包且包含模塊豐富,能夠滿足項目開發的需要。
本文基于QMainWindow主窗口類設計了顯控軟件。考慮到軟件操作的便捷性和擴展性,在主窗口中添加了菜單欄、狀態欄和工具欄等。在主窗口中添加界面基類QWidget,并將具體的功能組件,如QLabel、QGroupBox、QSpinBox等放入QWidget類中來實現具體的功能。另外,還使用了QTabWidget分頁組件來切換不同傳感器的控制頁面,顯控軟件的主界面如圖3所示。

圖3 顯控軟件界面設計
該顯控軟件的主界面主要考慮到了易用性、合理性、可靠性等幾方面的設計理念。顯控軟件主要分為:①控制分區:對小型光電吊艙(包括電視/紅外傳感器、吊艙伺服、記錄儀/激光等組件)的實時控制;②視頻顯示分區:顯示電視/紅外視頻(也可以開啟目標識別、雙擊視頻全屏等功能),并根據需要添加瞄準十字線、激光測距值、方位角等信息;③光電吊艙狀態顯示分區:顯示光電吊艙的方位角、橫滾角、系統模式、傳感器選擇、目標狀態等信息;④操桿選項分區:配置操桿,選擇啟用實體操桿還是虛擬操桿等4個主要區域,合理的功能分區大大提高了顯控軟件的易用性。
本次設計顯控軟件采用多線程方式,從而實現各個模塊的并行運行,軟件設計流程圖如圖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);
顯控軟件通過串口與地面無線數傳/圖傳相連接,天空端和地面端的無線數傳/圖傳構成無線數據鏈路,實現數據的遠程傳輸。考慮到需要實時上行和下行數據,采用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個字節,包含飛載荷狀態、自檢結果、載荷軸角、目標距離、經緯度、高度等有效信息。通過對幀頭、校驗位等的驗證獲取一幀完整的數據包,然后將之解析,顯示到主界面上。
目前,微小型光電吊艙電視拍攝的視頻分辨率為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視覺庫在圖像上疊加輔助線、文字等信息,最后通過定時刷新,實現視頻解碼后的播放。
傳統光電吊艙中,目標檢測和識別模塊放在機載嵌入式模塊里,而微小型光電吊艙體積小,重量輕,無法放置高性能目標識別模塊,故將目標識別模塊放在地面顯控軟件中實現[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等函數對識別后的目標進行框選。
機載伺服控制模塊通過獲取的位移量去控制光電吊艙的橫滾和俯仰角度。目前項目中,使用實體搖桿獲取位移量發送給天空端。位移量的數值代表移動的速度,正負代表移動方向。同時可以在搖桿中定義一些快捷鍵,如跟蹤和鎖定,這樣使地面人員的操作更加便捷。
該軟件中搖桿控制使用的winmm.dll是Windows多媒體相關應用程序接口。如圖8,通過QLibrary類,在程序運行時加載window動態鏈接庫winmm.dll,通過resolve()解析并調用庫中的具體方法,這樣再下面的程序中可以直接調用qJoyGetPos這些解析過的方法了。搖桿數據獲取編程設計流程如圖8所示。

圖8 搖桿數據獲取流程
從圖8可知,先檢測當前系統是否有搖桿插入,然后檢測是否按鍵按下,不然就一直循環查詢,知道獲取到數據為止,利用QT獨有的槽函數,將搖桿數據結構joyinfoex_tag發射到主線程的display_slot_row(joyinfoex_tagstate_row)函數中。從joyinfoex_tag結構體,獲取各種按鍵的信息,判斷出是哪一個按鍵按下,再根據預先定義的功能,生成相應的指令。
顯控軟件開發完成后,與某型微小型光電吊艙配套,在外場搭載于巡飛彈、某小型無人機等飛行器。對電視/紅外探測器控制、激光照射等傳感器指標進行完整測試,并基于目標的檢測識別,對目標進行鎖定、跟蹤等測試。測試中,光電吊艙與地面站通過無線數傳/圖傳相連接,選用的無線數傳/圖傳最大支持6 Mb/s的傳輸速率。下面對各個模塊進行一一測試。
在測試中,將RS422 USB轉串口連接電腦,波特率設置為115 200,數據位8位,停止位1,沒有校驗位和流控制位,對串口連接進行測試。讀取串口接收的數據如圖9所示。

圖9 串口通信實測圖
從圖9可以看出,串口通訊穩定,數據發送,沒有出現丟幀現象。獲取數據后,就是對數據的解析和可視化顯示,實驗測試結果如圖10所示。

圖10 解析數據顯示
解析后的數據顯示正常,各個傳感器狀態顯示正常,俯仰角、橫滾角顯示精確,并能在載荷狀態改變時,實時刷新,滿足系統需求。
在實驗中選用萊仕達的飛行模擬游戲搖桿PXN-2113進行實驗,價格便宜,精度尚可,具有20個可自定義按鍵,滿足實驗中快捷鍵的設置數量。搖桿通過usb串口與電腦連接,如圖11所示。

圖11 搖桿調試場景
安裝PXN-2113的驅動程序后,測試搖桿連接后,數據獲取是否正確。搖桿獲取到搖桿的狀態信息,如圖12所示。

圖12 搖桿狀態獲取
dwXpos、dwYpos即為搖桿上下左右移動的位移量,dwButtonNumber代表按鍵數量,dwButton的值為被按下的按鍵的值。實測目前,這款搖桿功能還算滿足要求,后面對經度要求高,會更換工業級別搖桿。
視頻延時對于實時偵察具有重要意義,在視頻延時測試中,用網線將電腦與光電吊艙相連,在電腦上打開一個計時器,將光電吊艙轉動,使電視對著電腦屏幕,然后開始以亳秒單位計時,此時可以同時觀測到實際計時和顯控軟件中的計時。
這樣電腦上運行的顯控軟件的顯示時間,就是經過傳輸后在電腦界面上顯示的時間,假設為T1,此時毫秒時鐘時間為T2,則延時時差T=T2-T1。對測試延時進行多次記錄,視頻傳輸延時測試如表4。
實驗中記錄了多組數據,表4展示了7次延時時間的統計,通過計算得出延時時差平均為108.3 ms,后續再加上無線數傳/圖傳的固定延時,延時時間在200 ms以內,滿足目前項目的需求。

表4 視頻傳輸延時測試
將光電吊艙連接軟件后,對著窗外的典型目標民用車,測試視頻的顯示和目標識別,如圖13所示。

圖13 目標識別顯示
經過室內的長期測試和多次外場掛飛實驗,軟件總體上運行平穩,沒有卡死、崩潰等現象,光電載荷狀態和控制指令收發顯示正常,實時視頻目標識別準確,畫面顯示流
暢,實時視頻的延時在允許范圍內,無明顯掉幀卡頓現象,軟件達到了各項設計要求。
本文設計了一種基于Qt框架的微小型無人機載光電吊艙顯控軟件,可通過串口實現光電傳感器狀態信息和控制指令的收發,通過網口通信實現視頻流的接收和解碼,通過YOLOv3算法模型實現對解碼后圖像中目標的實時檢測和識別。該顯控軟件基于Qt和C/C++語言,具有良好的跨平臺性,分模塊和多線程的架構設計,使程序模塊劃分清晰,易讀性強。但是,視頻解碼后,在地面進行目標檢測、識別,進一步提高了實時視頻的延時時間,在之后的工作中需繼續研究,從而兼顧地面設備的高性能優勢和實時視頻的低延時需要。