馮明濤 馬衛(wèi)華 李 悅
1.北京航天自動控制研究所,北京 100854 2.宇航智能控制技術國家級重點實驗室,北京 100854 3.四川航天技術研究院,成都 610100
隨著航天技術的發(fā)展,運載火箭逐漸由串聯(lián)向并聯(lián)、由簡單到復雜的方向發(fā)展。傳統(tǒng)的運載火箭控制系統(tǒng)軟件設計模式鏈條過長,溝通成本高,軟件開發(fā)效率較低,為了滿足越來越龐大的航天運載火箭軟件研制需求,亟需對現(xiàn)有控制系統(tǒng)軟件的設計模式進行改進。
目前常用的姿態(tài)控制軟件設計模式主要包括基于模型的設計方法[1-4]、基于可復用技術的設計方法[5-8]等。這些軟件設計方法旨在從不同方面縮短軟件開發(fā)周期,提高開發(fā)效率,增強軟件可靠性,但其產生的軟件代碼規(guī)模仍較為龐大,并且設計方法較為繁瑣耗時,靈活性不足。本文在分析現(xiàn)有控制系統(tǒng)飛行軟件功能要求的基礎上發(fā)現(xiàn),神經網絡框架的諸多優(yōu)點較好地滿足了控制系統(tǒng)軟件設計需求??蚣馨祟I域內常用的概念、公式、算法、模型等內容,用戶層一般使用高級編程語言,后端可以自動進行代碼優(yōu)化,無需人工參與。軟件開發(fā)人員利用框架可以便捷地搭建神經網絡模型,并且訓練好的端到端模型可以快速部署到其他平臺或環(huán)境中,整個過程簡單易實現(xiàn)。因此本文提出利用神經網絡框架的設計方法建立運載火箭控制系統(tǒng)軟件設計框架。
總結多個飛行控制軟件發(fā)現(xiàn),姿態(tài)控制系統(tǒng)軟件較制導、導航系統(tǒng)更有規(guī)律性,便于進行設計模式的研究,因此本文選擇姿態(tài)控制作為研究對象,探索姿態(tài)控制軟件框架的設計技術,重點對姿態(tài)控制算子的設計技術進行了討論。
基于該框架,軟件開發(fā)人員可以利用已有的算子更快速地進行姿態(tài)控制軟件的開發(fā),生成的端到端模型可以快速進行部署。姿態(tài)控制算子及框架的設計方法與流程后續(xù)還可以應用于制導及導航領域軟件框架的設計中。
本文第1節(jié)對姿態(tài)控制軟件系統(tǒng)和神經網絡框架進行了概述,第2節(jié)分析了姿態(tài)控制軟件框架的各項設計要素;第3節(jié)對姿態(tài)控制算子的設計技術進行了具體的介紹。
在運載火箭控制系統(tǒng)中,姿態(tài)控制是重要一環(huán),其任務是根據預先擬定的姿態(tài)控制程序角或者制導系統(tǒng)給出的導引指令,實時準確地控制箭體的飛行姿態(tài),確保火箭飛行穩(wěn)定。飛行軟件是箭上控制系統(tǒng)參與飛行控制的軟件的總稱,與硬件一起完成控制功能[9]。根據多個飛行控制軟件任務書中姿態(tài)控制模塊的內容,歸納出姿態(tài)控制軟件部分需要實現(xiàn)的功能:姿態(tài)角信號的采集和處理,姿態(tài)角偏差計算、增益計算、數(shù)字校正網絡計算等,最后綜合各種信息,輸出執(zhí)行機構的動作指令。
在軟件領域,框架是一種微體系結構,為特定領域內的軟件系統(tǒng)提供未完全實現(xiàn)的模板,它可以是一個將要被擴展或/和復用的子系統(tǒng)[10]??蚣芴峁┨囟ǖ墓δ?,包含支撐程序、代碼、庫、工具集以及API(應用程序接口)等內容,這些部件匯集在一起用于支持軟件或系統(tǒng)的開發(fā)。應用開發(fā)人員只需關注應用系統(tǒng)特有的部分,按既定規(guī)則加入應用所需的部分就可完成開發(fā),過程更加簡便快速。
在當前熱門的機器學習領域,為了加快神經網絡程序編寫、模型訓練與部署,各類神經網絡框架有了長足的發(fā)展。從最早發(fā)布的Theano,到之后的Caffe、Torch、TensorFlow等,再到當前業(yè)內主流的PyTorch、TensorFlow2.x,以及國內發(fā)布的PaddlePaddle、MindSpore、Jittor等框架層出不窮?;谶@些框架,開發(fā)者可以通過Python語言調用神經網絡算子進行模型的快速生成,模型的訓練與部署也可以通過簡單的函數(shù)調用實現(xiàn),并且框架內部固化的性能優(yōu)化策略有效提高了Python代碼的運行速度??梢哉f神經網絡框架極大促進了機器學習相關軟件的開發(fā),對機器學習的飛速發(fā)展起到了重要作用。
對比神經網絡框架的各項功能和姿態(tài)控制軟件的功能需求發(fā)現(xiàn),神經網絡框架的多種功能均可以應用到姿態(tài)控制軟件設計中。實現(xiàn)神經網絡需要一組固定的構造組件,包括節(jié)點表示、卷積計算、池化、激活、模型存儲與部署等等,這些組件均可以在函數(shù)層級實現(xiàn)。而實現(xiàn)姿態(tài)控制需要程序角濾波、姿態(tài)偏差計算、姿態(tài)控制方程計算等組件,這些組件同樣可以用函數(shù)表示形成算子,再嵌入到神經網絡框架后即可按既定的使用方法調用所需算子。神經網絡框架使用計算圖來表達數(shù)學表達式,主要利用計算圖實現(xiàn)神經網絡的前向計算和反向傳播,而姿態(tài)控制計算只需利用前向計算部分即可??蚣苡柧毜玫降亩说蕉四P涂梢圆渴鸬紺PU、GPU等不同硬件平臺上使用,姿態(tài)控制軟件接收程序角作為輸入,得到伺服機構的輸出,也屬于端到端的模型,可以利用框架進行姿態(tài)控制模型硬件平臺部署。此外,神經網絡框架包含的計算資源調度、內存管理等原理和方法均可以應用到姿態(tài)控制軟件設計框架中。
框架要滿足各種計算需求,除了數(shù)據以外,算子的作用舉足輕重。如圖1所示,在計算圖中,節(jié)點包括數(shù)據和算子,算子接收數(shù)據,經處理后得到的結果可以作為節(jié)點繼續(xù)參與計算,通過算子可以將所有的數(shù)據連接到一起形成完整的計算圖。此外,算子具有高度的抽象性,可以涵蓋領域內的各種計算需求。算子在框架內部表示為函數(shù)的形式,對外提供接口,用戶在前端通過調用所需的算子接口完成設計??梢哉f,算子是姿態(tài)控制軟件框架最核心的要素之一,因此本文著重選擇了算子這一要素進行研究。
圖1 軟件框架算子示意圖
本節(jié)對姿態(tài)控制領域的相關知識進行了本體建模,將姿態(tài)控制軟件系統(tǒng)框架用到的諸多概念如公式、參數(shù)、函數(shù)、算法等進行明確的表示,并確立它們之間的相互聯(lián)系,從而為算子的程序編寫及框架開發(fā)提供總體性和方向性的指導。
本體論是對某一概念化所做的一種顯式的解釋說明,可以使用知識表達語言來描述本體中的對象以及它們之間的關系[11]。一般而言,本體模型在構成上主要包含5種組件:類、屬性、函數(shù)、公理和實例。文獻[12]將本體理論和方法應用于運載火箭晃動分析領域,開發(fā)了基于本體的火箭晃動計算分析軟件模塊,實現(xiàn)了分析計算知識的公用性、可拓展性和配置靈活性。文獻[13]提出了面向行為與事件的空間目標態(tài)勢本體模型,基于該模型實現(xiàn)了空間目標碰撞威脅的等級推理與預警。
本文按照如圖2所示的步驟建立姿態(tài)控制軟件系統(tǒng)框架算子的本體模型,以期對姿態(tài)控制算子進行規(guī)范而清晰的描述。
圖2 本體建模流程圖
參照多個飛行控制軟件姿態(tài)控制模塊的內容,總結出在多數(shù)情況下,姿態(tài)控制軟件的運行流程一般如圖3所示。其中程序角濾波完成對制導模塊輸入的程序角的濾波處理,姿態(tài)偏差計算輸出偏差角,姿態(tài)控制系統(tǒng)參數(shù)計算包括增益系數(shù)計算和控制網絡計算,利用得到的姿態(tài)控制系統(tǒng)參數(shù)可以計算舵偏角的輸出,最后一步對舵偏角值進行處理得到伺服輸出。按照該流程依次調用姿態(tài)控制算子,可以實現(xiàn)基本的姿態(tài)控制功能。
圖3 姿態(tài)控制軟件運行流程圖
根據姿態(tài)控制軟件系統(tǒng)的功能,將本體模型分為如表1所示的6個根類。依據此表,利用Protégé工具建立姿態(tài)控制軟件系統(tǒng)的本體模型。Protégé是一個免費的開源軟件,為用戶提供了一套工具來構建本體領域模型和基于知識的應用程序,是本體構建的常用開發(fā)工具。本文利用Protégé建模的主要工作包括添加姿態(tài)控制系統(tǒng)本體類及其子類結構層次并建立類的關系屬性和數(shù)據屬性。關系屬性用來描述類與類之間及類與個體間的相互關系,數(shù)據屬性是對類和個體自身的屬性描述。
表1 本體模型類(#表示暫不予考慮)
在Protégé中可以依照表2建立本體模型,包含類的層級關系以及類的數(shù)據屬性和關系屬性?;谠摫倔w模型,可以在軟件中快速查詢姿態(tài)控制算子的內容和各個算子之間的關系,為代碼編寫提供指導。此外,本體模型易于拓展,在已建立的此模型基礎上,可以便捷地加入新的內容。
依據3.1節(jié)的建模結果,可以將表2中的子類作為姿態(tài)控制算子,算子在代碼中表現(xiàn)為函數(shù)形式,數(shù)據屬性1作為函數(shù)的輸入參數(shù),數(shù)據屬性2作為函數(shù)的輸出結果。接下來對每個類包含的算子進行詳細介紹。
3.2.1 計算網絡算子
姿態(tài)控制算法需要用到一些計算網絡如濾波網絡、三通道控制網絡等,這里所述的網絡在數(shù)學上表示為經過z變換之后的分式,歸一化后的網絡如式(1)所示,式中aj和bj分別為網絡的分子系數(shù)和分母系數(shù),m和n為分子和分母的階數(shù)。本文對該形式的網絡計算進行了設計,如圖4所示,通過分子和分母系數(shù)、網絡階數(shù)、遞推變量初值可以唯一定義一個網絡,在得到輸入時可以計算輸出,同時更新遞推中間變量。
圖4 計算網絡算子
(1)
3.2.2 程序角濾波算子
基于3.2.1節(jié)所述網絡計算函數(shù),在已知濾波網絡的網絡階數(shù)和分子、分母系數(shù)后,調用網絡初始化函數(shù)可以初始化一個濾波網絡。輸入制導模塊給出的程序角,調用網絡輸出函數(shù)可以輸出經過濾波處理后的程序角。
3.2.3 姿態(tài)角偏差算子
姿態(tài)角偏差為程序角與實際姿態(tài)角之間的差值,姿態(tài)角偏差算子完成姿態(tài)角偏差的計算及輸出,如圖5所示,輸入參數(shù)為實際姿態(tài)角與程序角,實際姿態(tài)角由導航模塊給出,程序角為濾波模塊濾波后的程序角。默認第一個參數(shù)為姿態(tài)角,計算方式為姿態(tài)角減去程序角,也可依具體算法改變參數(shù)順序。
圖5 姿態(tài)角偏差算子
3.2.4 姿態(tài)控制系統(tǒng)參數(shù)算子
姿態(tài)控制系統(tǒng)參數(shù)計算包括控制增益和三通道控制網絡計算。本文暫不討論控制增益計算,直接使用已知的增益系數(shù)。三通道控制網絡按照3.2.1節(jié)所述計算方式得到。初始化計算時其輸入參數(shù)為網絡階數(shù)、分子和分母系數(shù)以及網絡初始化值,輸出為已初始化的網絡;進行輸出計算時給出網絡輸入,經過函數(shù)解算可以得到輸出值。
3.2.5 舵偏角算子
(2)
3.2.6 伺服輸出算子
對于伺服輸出,本文暫僅討論舵機輸出和涵道輸出。舵機輸出計算使用俯仰和偏航通道的舵偏角,涵道輸出計算使用滾轉通道的舵偏角,它們均對輸出進行了限幅,用限幅邊界作為算子的參數(shù)輸入,調用該算子可以直接得到舵機角度輸出或涵道的推力輸出。
比較分析主流的一些神經網絡框架后,本文最終選擇了Jittor[13](計圖)進行姿態(tài)控制軟件框架的設計。Jittor是清華大學在2020年發(fā)布的一個深度學習框架,相比于其他框架,其主要創(chuàng)新點在于提出了統(tǒng)一圖的計算表示方法,將靜態(tài)圖與動態(tài)圖結合,同時發(fā)揮兩種表示方式的優(yōu)點,彌補各自的缺點。本文希望將這種計算表示方式應用到姿態(tài)控制系統(tǒng)計算中。此外,在代碼層級,Jittor的源碼簡明易懂、邏輯清晰,可讀性較強,易于修改和適配。而且,Jittor本身就包含了第三方算子的嵌入,如并行計算相關的mpi算子、矩陣運算相關的mkl算子等,為本文姿態(tài)控制算子的嵌入提供了有效參考。因此選擇Jittor框架作為模板框架進行姿態(tài)控制軟件框架的設計研究。
圖6展示了Jittor框架的組成結構圖。Jittor分為應用層、前端層、后端層和硬件層4層。應用層向用戶開放,由用戶使用前端層提供的接口進行Python編碼,形成應用程序。前端層是用Python編寫的,提供了元算子接口,操作Jittor變量的接口和一些常用模型的接口,這些接口均對用戶可見。后端層為前端層提供接口支持,同時也管理底層硬件資源。它包含了眾多模塊,算子融合模塊用于動態(tài)融合算子以提高性能,第三方算子模塊包含了其他庫的算子,比如用于并行計算的MPI庫算子,用于矩陣運算的MKL庫算子等。它還包括JIT編譯器和統(tǒng)一計算圖。通過后端層與硬件層通信進行硬件加速,當前的加速器支持CPU和GPU硬件。
圖6 Jittor框架
本文所述的姿態(tài)控制軟件框架算子在Jittor中屬于第三方算子模塊,同時在前端層提供了Python接口,用戶可以調用相關算子進行姿態(tài)控制軟件設計。按照與Jittor自有算子同樣的方式構造得到的姿態(tài)控制算子同樣支持代碼的即時編譯和計算的統(tǒng)一圖表示,由于姿態(tài)控制算子較為單一,暫不考慮算子融合。在硬件層,姿態(tài)控制計算規(guī)模較小,僅需CPU即可滿足。
在算子的實現(xiàn)方面,Jittor定義了3個主要的結構體:1)Node結構體:用于表示有向無環(huán)圖的節(jié)點,定義了該節(jié)點的輸入結構體與輸出結構體,這兩個結構體表示了與該節(jié)點相連的前后節(jié)點。2)Var結構體:該結構體繼承了Node結構體,說明了Jittor的基礎變量類型。3)Op結構體:該結構體也繼承了Node結構體,是所有算子的父結構體。該結構體實現(xiàn)了與算子編譯和運行相關的功能。
在每個算子的頭文件中,都定義了該算子相關的結構體,其為Op結構體的子結構體,結構體中的變量為Var類型和該算子自定義的其他結構體類型。每個算子結構體的構造函數(shù)實現(xiàn)了該算子的功能,通過調用構造函數(shù)可以使用相應算子。為了可以在python端調用算子,Jittor在前端層使用Python編寫了pyjt.compiler.py文件,通過該文件可以將算子相關的源代碼和其他需要Python接口的源代碼轉換生成Pybind11相關文件,利用Pybind11相關方法實現(xiàn)從Python調用C++代碼的功能。
為了實現(xiàn)Python端自動對底層源碼進行編譯,Jittor中包含算子的源文件名使用了一致的格式——*_op.h和*_op.cc(*表示算子具體名稱),本文設計的姿態(tài)控制相關算子代碼文件命名與該格式一致,單個算子的代碼實現(xiàn)依照3.2節(jié)所述定義了一系列的結構體,結構體的構造函數(shù)實現(xiàn)了算子的功能。最后,將這些文件加入到Jittor算子的相關路徑jittor/src/ops中,對Jittor進行重新編譯,則可以將姿態(tài)控制算子嵌入到神經網絡框架Jittor中。
為驗證所設計算子的正確性,本文利用所述框架對某飛行平臺飛行控制數(shù)學仿真軟件中的姿態(tài)控制部分進行了改寫。姿態(tài)控制軟件部分的輸入變量為飛行時間、相對飛行高度、來自導航模塊的實際姿態(tài)角和角增量、來自制導模塊的程序角,輸出量為伺服機構輸出。輸入變量的數(shù)值均從數(shù)學仿真軟件仿真得到的飛行數(shù)據文件中讀出,因此基于框架改寫的姿態(tài)控制軟件的輸入值與原飛行控制仿真軟件姿態(tài)控制部分的輸入值完全一致,若輸出結果一致,則可驗證算子的正確性。
圖7~8為2次仿真實驗的結果,數(shù)據間隔為10ms。圖7為穩(wěn)定控制時的輸出結果,圖8為不穩(wěn)定控制時的輸出結果,從圖中可以看出,框架代碼和原代碼的輸出結果基本一致,證明了本文所設計算子的正確性,可以利用所述框架編寫姿態(tài)控制軟件。
圖7 仿真實驗1伺服輸出
圖8 仿真實驗2伺服輸出
詳細闡述了依托神經網絡框架建立姿態(tài)控制軟件設計框架中姿態(tài)控制算子的設計方法。針對當前飛行控制軟件開發(fā)中的問題,進行了探討和理論分析,說明了軟件框架的優(yōu)點和適用性,并重點研究了姿態(tài)控制算子的建模方法,詳細介紹了姿態(tài)控制算子,并說明了如何將姿態(tài)控制算子嵌入到已有的神經網絡框架中。最后的仿真實驗驗證了本文所設計算子的正確性。