朱日楠,王 彪,楊?yuàn)檴櫍詈瓿?,?健
(南京航空航天大學(xué)自動(dòng)化學(xué)院,南京 211106)
近年來(lái),飛行可視化開(kāi)發(fā)大致可分為兩大方式:①利用三維渲染引擎進(jìn)行飛行可視化仿真[1-2],如OpenGL、Direct3D、Vega 等;②利用飛行模擬軟件進(jìn)行飛行可視化仿真[3-4],如FlightGear 等。前者需編寫(xiě)大量底層代碼實(shí)現(xiàn)三維建模與渲染,開(kāi)發(fā)環(huán)節(jié)眾多且繁瑣。后者僅通過(guò)自身無(wú)法實(shí)現(xiàn)個(gè)性化場(chǎng)景開(kāi)發(fā)以及擁有復(fù)雜邏輯結(jié)構(gòu)的UI開(kāi)發(fā)。
Unity3D是一款近年來(lái)逐步被應(yīng)用于可視化仿真開(kāi)發(fā)的游戲開(kāi)發(fā)引擎。對(duì)于飛行可視化仿真而言,它擁有諸多上述方式無(wú)法比擬的優(yōu)勢(shì)。利用自身組件,如地形模塊、天空盒子、碰撞檢測(cè)器、射線探測(cè)器、攝像機(jī)等,可逼真復(fù)現(xiàn)不同場(chǎng)景中機(jī)場(chǎng)起降、艦機(jī)著艦、地形跟隨、視覺(jué)導(dǎo)引等眾多飛控領(lǐng)域的研究。Unity3D可將飛控仿真的各個(gè)環(huán)節(jié)集成于自身之中,因此本文采用Unity3D進(jìn)行飛行控制可視化開(kāi)發(fā)。
飛行器物理模型解算是飛行控制仿真中的一大重要環(huán)節(jié)。目前,利用Unity3D 進(jìn)行飛控仿真主要有3種方式進(jìn)行模型解算。①Unity3D 中調(diào)用自編程序進(jìn)行模型解算[5-6]。該方式需自行編寫(xiě)數(shù)值積分程序,開(kāi)發(fā)難度大,且計(jì)算結(jié)果的準(zhǔn)確性無(wú)法與成熟的數(shù)值計(jì)算軟件比擬。②利用Matlab 進(jìn)行物理模型解算[7],將計(jì)算后的位姿信息發(fā)送給Unity3D,使Unity3D中的飛機(jī)造型進(jìn)行相應(yīng)的位姿變化。該方式可精確計(jì)算物理模型,但仍有一大缺陷。由于Unity3D 動(dòng)畫(huà)幀更新速率受計(jì)算機(jī)實(shí)時(shí)負(fù)載影響而不斷變化,Unity3D 定步長(zhǎng)接收到的位姿信息無(wú)法在相同時(shí)間間隔內(nèi)展示在動(dòng)畫(huà)中,使畫(huà)面中的飛機(jī)造型出現(xiàn)卡頓、震顫等現(xiàn)象,對(duì)于高速飛行器,該現(xiàn)象尤為明顯。③利用Unity3D自帶的物理引擎進(jìn)行數(shù)值積分運(yùn)算。使用該方式開(kāi)發(fā)時(shí),開(kāi)發(fā)者只需在Unity3D中對(duì)物體施加力與力矩,即可使物體表現(xiàn)出與現(xiàn)實(shí)世界相似的物理行為。據(jù)此,對(duì)Unity3D飛行器造型添加動(dòng)力學(xué)模型即可使其按照相關(guān)力學(xué)特性進(jìn)行飛行運(yùn)動(dòng),無(wú)須添加運(yùn)動(dòng)學(xué)模型。該方式將物理模型與仿真場(chǎng)景、飛行器造型均集成在Unity3D內(nèi)部,開(kāi)發(fā)便捷、仿真結(jié)果可靠。本文采用第3 種方式進(jìn)行本系統(tǒng)的開(kāi)發(fā)。
考慮到飛行器六自由度運(yùn)動(dòng)的特點(diǎn)以及教學(xué)條件,為了能較好演示飛行器飛行時(shí)三軸位移與三軸姿態(tài)角變化情況,并且避免實(shí)驗(yàn)設(shè)備占用過(guò)多室內(nèi)空間,本文選用Acrome桌面式六自由度運(yùn)動(dòng)平臺(tái)展示飛機(jī)位姿,使之與視景動(dòng)畫(huà)中的飛機(jī)位姿隨動(dòng)。
考慮到本科學(xué)生工程運(yùn)用能力與教學(xué)安全問(wèn)題,本文不采用實(shí)物仿真方式進(jìn)行開(kāi)發(fā)。從數(shù)值仿真角度進(jìn)行飛行控制可視化開(kāi)發(fā)是本文的重點(diǎn)。此外,本文結(jié)合航模機(jī)、運(yùn)動(dòng)模擬臺(tái)、操縱桿等硬件構(gòu)成半物理仿真系統(tǒng),通過(guò)實(shí)物演示飛機(jī)飛行時(shí)的姿態(tài)變化以及執(zhí)行機(jī)構(gòu)作動(dòng)情況,以增強(qiáng)學(xué)生對(duì)相關(guān)知識(shí)的直觀理解。
航模機(jī)用于演示仿真過(guò)程中飛機(jī)的舵面與螺旋槳作動(dòng)狀態(tài)。由于本系統(tǒng)面向本科教學(xué),故優(yōu)先選擇常規(guī)氣動(dòng)布局的單垂尾固定翼航模機(jī)作為演示對(duì)象。本文的飛行控制仿真系統(tǒng)結(jié)構(gòu)如圖1 所示。
圖1 飛行控制仿真系統(tǒng)結(jié)構(gòu)框圖
本文選擇文獻(xiàn)[8]中的固定翼飛行器數(shù)學(xué)模型作為本仿真系統(tǒng)所用的飛機(jī)模型,該模型在常規(guī)坐標(biāo)系(NED)下建立。根據(jù)前文Unity3D 物理引擎的特點(diǎn),該環(huán)節(jié)只需在Unity3D中完成飛行器運(yùn)動(dòng)過(guò)程中力與力矩的計(jì)算并添加至對(duì)應(yīng)機(jī)體軸上即可。Unity3D 物理模型解算受開(kāi)發(fā)者設(shè)置的物理參數(shù)影響,其中飛行器角速率解算時(shí)受飛機(jī)慣性張量矩陣J影響,
式中:J-1為飛行器慣性張量矩陣的逆矩陣;p、q、r與分別為機(jī)體角速率與機(jī)體軸向氣動(dòng)力矩;Jx、Jy、Jz分別為慣性張量矩陣對(duì)角線元素(繞著機(jī)體軸旋轉(zhuǎn)的轉(zhuǎn)動(dòng)慣量);Jxz為慣性張量矩陣非對(duì)角線元素(飛行器慣性積)之一。
轉(zhuǎn)動(dòng)慣量大小可在Unity3D 中設(shè)置[9],但對(duì)于慣性積,Unity3D未提供設(shè)置選項(xiàng),因此模型解算時(shí)無(wú)法引入慣性積的影響,這將使Unity3D 模型與原模型產(chǎn)生差異,故為了消除該影響,需對(duì)力矩計(jì)算公式進(jìn)行修正,使修正后的公式包含慣性積環(huán)節(jié)。力矩修正公式如下:
由于力的計(jì)算公式不涉及慣性積,故無(wú)需修正。將力與修正后的力矩施加在機(jī)體軸上即可使Unity3D飛機(jī)造型進(jìn)行飛行運(yùn)動(dòng)。
力與力矩公式中需要的狀態(tài)參數(shù)可由Unity3D提供的相關(guān)函數(shù)獲取。值得注意的是,該方式獲取的部分參數(shù),如姿態(tài)角、角速率、空速等,默認(rèn)為慣性系下的狀態(tài)量,使用時(shí)需使用InverseTransformDirection()函數(shù)將其轉(zhuǎn)換為機(jī)體系狀態(tài)量;此外,Unity3D 是在左手坐標(biāo)系(East-Up-North)下開(kāi)發(fā)的,進(jìn)行動(dòng)力學(xué)模型計(jì)算時(shí),需將狀態(tài)量由左手坐標(biāo)系轉(zhuǎn)換為NED 坐標(biāo)系,以保證飛機(jī)模型與原模型的一致性。
以機(jī)體角速率為例,圖2 展示了在相同控制量輸入下,Unity3D 模型與Matlab 已有模型的運(yùn)動(dòng)規(guī)律比較。不難看出,兩個(gè)模型的飛行狀態(tài)曲線幾乎完全吻合,表明Unity3D模型與Matlab 模型運(yùn)動(dòng)規(guī)律的一致性,也從側(cè)面說(shuō)明了Unity3D 物理引擎用于飛行控制仿真的可行性與可靠性。
圖2 Unity3D模型與Matlab模型運(yùn)動(dòng)規(guī)律比較
1.2.1 數(shù)據(jù)通信方式選擇
由于本文所開(kāi)發(fā)系統(tǒng)的物理模型與控制器分別位于Unity3D與Simulink,要使兩者進(jìn)行聯(lián)合仿真,需對(duì)兩者間的數(shù)據(jù)通信環(huán)節(jié)進(jìn)行設(shè)計(jì)。本文對(duì)飛控仿真中常見(jiàn)的UDP通信與串口通信[10-12]進(jìn)行了分析測(cè)試,提出兩個(gè)評(píng)價(jià)指標(biāo)對(duì)其進(jìn)行優(yōu)劣評(píng)判:
(1)通信時(shí)延。Simulink 接收到一個(gè)數(shù)據(jù)時(shí)的系統(tǒng)毫秒級(jí)時(shí)刻與Unity3D發(fā)送該數(shù)據(jù)時(shí)的系統(tǒng)毫秒級(jí)時(shí)刻之差為該通信方式、該時(shí)間步長(zhǎng)下的“通信時(shí)延”。
(2)通信重疊。當(dāng)Simulink 還未接收上一個(gè)數(shù)據(jù),而Unity3D已發(fā)送下一個(gè)數(shù)據(jù)時(shí),時(shí)間線上存在前后兩個(gè)通信事件的交集,稱之為“通信重疊”。出現(xiàn)通信重疊的次數(shù)與通信總次數(shù)之比稱為通信重疊率。
本文對(duì)兩種方式不同通信步長(zhǎng)下的通信結(jié)果進(jìn)行了測(cè)試。以通信步長(zhǎng)為30 ms 為例,圖3 展示了UDP通信與串口通信的通信時(shí)延情況。表1 為不同通信步長(zhǎng)下兩種方式通信重疊情況比較。
表1 不同通信步長(zhǎng)下兩種通信方式通信重疊情況比較
圖3 通信步長(zhǎng)為30 ms時(shí)兩種通信方式通信時(shí)延比較
通過(guò)以上通信時(shí)延、通信重疊檢測(cè)可以得到如下結(jié)論:①兩種通信均存在一定的通信時(shí)延。UDP 通信延時(shí)時(shí)長(zhǎng)分布區(qū)間大,延時(shí)不確定性高;②UDP 方式的通信重疊率遠(yuǎn)高于串口方式,通信可靠性較低。通過(guò)以上分析,發(fā)現(xiàn)UDP 通信適用于對(duì)可靠性、實(shí)時(shí)性要求不高的場(chǎng)合。本飛控仿真實(shí)驗(yàn)平臺(tái)要求對(duì)飛機(jī)模型進(jìn)行實(shí)時(shí)準(zhǔn)確仿真,對(duì)通信的實(shí)時(shí)性與可靠性要求較高,因此串口通信更加適用于本文的飛控仿真實(shí)驗(yàn)平臺(tái)。
1.2.2 聯(lián)合仿真時(shí)間參數(shù)設(shè)置
Unity3D 物理引擎進(jìn)行數(shù)值積分運(yùn)算時(shí)受Unity3D固定時(shí)間步長(zhǎng)(Fixed Timestep,Unity3D 時(shí)間管理參數(shù)之一)影響,數(shù)據(jù)通信步長(zhǎng)的確定也與該參數(shù)有關(guān),因此確定固定時(shí)間步長(zhǎng)是聯(lián)合仿真開(kāi)發(fā)過(guò)程中的一大關(guān)鍵。
為了確保飛行仿真準(zhǔn)確性,一般取系統(tǒng)采樣頻率為飛機(jī)模型最快頻率的10 倍以上[13],由飛機(jī)線性化模型得到最快自然頻率為15.8 rad/s,故系統(tǒng)采樣頻率應(yīng)當(dāng)大于158 rad/s,即采樣周期小于6.33 ms。由此取Unity3D 固定時(shí)間步長(zhǎng)為5 ms,即Unity3D 以此步長(zhǎng)進(jìn)行狀態(tài)參數(shù)獲取與模型解算。
通過(guò)設(shè)置判斷條件,使物理模型每更新一定次數(shù)后執(zhí)行一次數(shù)據(jù)通信腳本,這樣即可設(shè)置數(shù)據(jù)通信步長(zhǎng)。本系統(tǒng)采用50 Hz通信頻率,設(shè)置通信步長(zhǎng)為20 ms,即每更新4 次物理模型進(jìn)行一次數(shù)據(jù)通信。
學(xué)生可在Simulink中自行利用相關(guān)模塊實(shí)現(xiàn)控制算法結(jié)構(gòu)圖的搭建。由于本科學(xué)生對(duì)控制算法了解較少、理解不深,且考慮到本飛控仿真系統(tǒng)應(yīng)當(dāng)與本科“自動(dòng)控制原理”課程相結(jié)合,故本飛控仿真系統(tǒng)利用經(jīng)典PID算法,在Simulink中開(kāi)發(fā)了俯仰角控制、高度控制、速度控制、橫側(cè)向控制、水平航跡控制算法樣例[14-15],對(duì)Unity3D 中的飛機(jī)模型進(jìn)行縱向與橫側(cè)向控制。
考慮到該飛控仿真系統(tǒng)應(yīng)當(dāng)為不同層次的學(xué)生提供不同難度的飛控仿真實(shí)驗(yàn),故為了降低控制律設(shè)計(jì)實(shí)驗(yàn)難度,本文利用Unity3D C#自編腳本將PID 算法樣例程序?qū)懭險(xiǎn)nity3D,即本文還開(kāi)發(fā)了模型、控制器均在Unity3D中的飛控仿真。這樣可確保飛控算法不被學(xué)生改變,學(xué)生實(shí)驗(yàn)時(shí)只需在仿真軟件提供的控制律結(jié)構(gòu)圖(見(jiàn)圖4)中進(jìn)行PID參數(shù)調(diào)整即可。
圖4 高度控制律PID參數(shù)調(diào)整實(shí)驗(yàn)界面
C#自編腳本采用歐拉法進(jìn)行數(shù)值積分運(yùn)算。考慮到篇幅限制,圖5 僅展示控制器分別在Simulink 與Unity3D這兩種環(huán)境下的滾轉(zhuǎn)角曲線。經(jīng)計(jì)算分析,與Simulink控制器相比,Unity3D自編腳本控制器誤差小于1%,兩種環(huán)境中設(shè)計(jì)的控制律幾乎一致,所開(kāi)發(fā)的飛控仿真系統(tǒng)可不依賴Simulink進(jìn)行經(jīng)典PID控制算法仿真驗(yàn)證。
圖5 Simulink、Unity3D滾轉(zhuǎn)角控制器比較
本文利用羅技X52Pro 操縱桿實(shí)現(xiàn)指令給定。通過(guò)轉(zhuǎn)動(dòng)不同搖桿,可分別生成滾轉(zhuǎn)、偏航、俯仰、油門(mén)等四通道指令。其可根據(jù)不同的實(shí)驗(yàn)條件,直接控制飛機(jī)執(zhí)行機(jī)構(gòu)或給出狀態(tài)參考指令。
六自由度運(yùn)動(dòng)平臺(tái)通過(guò)Arduino 串口通信接口接收Unity3D的位姿數(shù)據(jù),并通過(guò)Simulink External模式對(duì)期望姿態(tài)信號(hào)進(jìn)行解算,得到6 個(gè)PWM 信號(hào)并發(fā)送給Arduino PWM引腳,通過(guò)該引腳將該信號(hào)提供給驅(qū)動(dòng)器,驅(qū)動(dòng)6 個(gè)電動(dòng)機(jī),使6 個(gè)線性執(zhí)行器運(yùn)動(dòng),實(shí)現(xiàn)該平臺(tái)對(duì)飛機(jī)位姿演示。
航模機(jī)飛控板通過(guò)無(wú)線數(shù)傳模塊接收?qǐng)?zhí)行機(jī)構(gòu)信息,利用高級(jí)定時(shí)器產(chǎn)生不同頻率PWM 信號(hào),分別驅(qū)動(dòng)舵機(jī)與電調(diào)。PWM 信號(hào)占空比分別由接收的舵偏角及油門(mén)開(kāi)度信號(hào)確定,實(shí)現(xiàn)對(duì)航模機(jī)舵偏角與螺旋槳電機(jī)的控制。
本文開(kāi)發(fā)的飛行控制仿真系統(tǒng)實(shí)物如圖6 所示。
圖6 飛行控制仿真系統(tǒng)實(shí)物
為了遵循本科教學(xué)由簡(jiǎn)入深、循序漸進(jìn)的原則,該系統(tǒng)設(shè)置了多角度、多層次的實(shí)驗(yàn)以落實(shí)教學(xué)內(nèi)容,達(dá)到教學(xué)目標(biāo),包括:①飛機(jī)配平實(shí)驗(yàn);②俯仰角控制律設(shè)計(jì)實(shí)驗(yàn);③高度控制律設(shè)計(jì)實(shí)驗(yàn);④速度控制律設(shè)計(jì)實(shí)驗(yàn);⑤滾轉(zhuǎn)角控制律設(shè)計(jì)實(shí)驗(yàn);⑥水平航跡控制律設(shè)計(jì)實(shí)驗(yàn)。其中,控制律設(shè)計(jì)類(lèi)實(shí)驗(yàn)分別包括PID 參數(shù)調(diào)整實(shí)驗(yàn)與控制律自主設(shè)計(jì)實(shí)驗(yàn)。圖7 與8 分別為該系統(tǒng)實(shí)驗(yàn)初始界面與仿真界面。
圖7 實(shí)驗(yàn)系統(tǒng)初始界面
圖8 系統(tǒng)仿真實(shí)驗(yàn)界面
學(xué)生實(shí)驗(yàn)時(shí)需按以下步驟操作:
(1)打開(kāi)實(shí)驗(yàn)軟件,在“仿真設(shè)置”中設(shè)置硬件連接端口、設(shè)置仿真時(shí)長(zhǎng)。
(2)在初始界面中選擇實(shí)驗(yàn)項(xiàng)目與難度。
(3)若選擇“飛機(jī)配平實(shí)驗(yàn)”,點(diǎn)擊界面中“配平線性化”按鈕,運(yùn)行Matlab文件獲取執(zhí)行機(jī)構(gòu)配平值,點(diǎn)擊“仿真驗(yàn)證”按鈕,跳轉(zhuǎn)至仿真界面后輸入該值即可進(jìn)行配平驗(yàn)證。
(4)若選擇“PID 參數(shù)調(diào)整實(shí)驗(yàn)”,點(diǎn)擊“仿真驗(yàn)證”按鈕,在仿真界面中顯示的控制律結(jié)構(gòu)圖內(nèi)點(diǎn)擊相應(yīng)模塊進(jìn)行參數(shù)修改,即可進(jìn)行經(jīng)典PID 控制律驗(yàn)證。
(5)若選擇“控制律自主設(shè)計(jì)”,點(diǎn)擊“控制律實(shí)現(xiàn)”按鈕,即可打開(kāi)Simulink 控制律設(shè)計(jì)文件,在其中完成控制律設(shè)計(jì)后,點(diǎn)擊“仿真驗(yàn)證”按鈕即可進(jìn)行Unity3D與Simulink聯(lián)合仿真。
仿真開(kāi)始后,Unity3D 物理引擎對(duì)飛機(jī)的運(yùn)動(dòng)狀態(tài)進(jìn)行數(shù)值解算,并將飛機(jī)運(yùn)動(dòng)過(guò)程中的三維位姿變化展示在仿真界面中,六自由度運(yùn)動(dòng)平臺(tái)與航模機(jī)執(zhí)行機(jī)構(gòu)也與視景動(dòng)畫(huà)中的飛機(jī)保持隨動(dòng)。圖9 為高度控制律設(shè)計(jì)實(shí)驗(yàn)得到的飛行高度狀態(tài)曲線。
圖9 仿真系統(tǒng)飛行高度狀態(tài)曲線
本文對(duì)比總結(jié)了Unity3D 用于飛控仿真的優(yōu)勢(shì),提出Unity3D 飛行器物理模型準(zhǔn)確建立的方式,測(cè)試分析Unity3D 與Simulink 聯(lián)合仿真數(shù)據(jù)通信方式,針對(duì)飛控仿真與Unity3D時(shí)間管理特點(diǎn)確定聯(lián)合仿真時(shí)間參數(shù),整個(gè)系統(tǒng)的開(kāi)發(fā)過(guò)程對(duì)于Unity3D 飛控仿真開(kāi)發(fā)而言具有較好的參考意義。
本文開(kāi)發(fā)的飛行控制仿真系統(tǒng)有助于提高本科學(xué)生工程應(yīng)用能力、強(qiáng)化本科學(xué)生對(duì)飛行控制的理解。本文還利用Unity3D 天空盒子、地形設(shè)計(jì)模塊對(duì)視景仿真進(jìn)行了美化渲染,開(kāi)發(fā)了曲線繪制、文件讀取、數(shù)據(jù)保存、用戶設(shè)置保存、航跡顯示、飛行視角切換等良好的人機(jī)交互功能,系統(tǒng)交互性好、可操作性強(qiáng),具有較強(qiáng)的應(yīng)用價(jià)值。