http://www.jianshu.com/p/b5e9f1f5df95
飛行控制率、穩定增強系統、自動駕駛儀和其他飛控系統(航電、電氣等)都能夠在 JSBSim 中以獨立的控制組件進行建模。JSBSim 提供了一套可配置的組件,包含增益、濾波器、開關等。飛機系統是由一系列的組件構成,在飛機配置文件中<system>、<autopilot>、<flight_control> 里面提供 <channel> 元素用於定義飛行控制系統。<channel> 元素內包含一系列相關任務的組件,例如:
<autopilot name="C172X Autopilot"> <!-- Wing leveler --> <channel name="Roll wing leveler"> <pid name="fcs/roll-ap-error-pid"> <input>attitude/phi-rad</input> <kp> 1.0 </kp> <ki> 0.01 </ki> <kd> 0.1 <kd> </pid> <switch name="fcs/roll-ap-autoswitch"> <default value="0.0"/> <test value="fcs/roll-ap-error-pid"> ap/attitude_hold == 1 </test> </switch> <pure_gain name="fcs/roll-ap-aileron-command-normalizer"> <input>fcs/roll-ap-autoswitch</input> <gain>-1</gain> </pure_gain> </channel> ... additional channels ... </autopilot>
每個組件將計算其自身的輸出,然后輸出結果就能夠被后續其他組件所使用。從 JSBSim 的發展例程看,飛行控制模塊(<flight_control>)是最先被加入到 JSBSim 仿真系統中的,后續版本才陸續添加了自動駕駛儀(<autopilot>)、飛控系統(<system>),才使得任意形式的飛控系統都能夠被建模和模擬。目前,飛控系統(<system>)已經具備替換自動駕駛儀和飛行控制模塊的能力,也可以同時添加多個飛控系統。飛控系統能夠在單獨的配置文件中進行定義,然后以文件名的形式被調用和加載,避免了在系統配置文件中出現過多的代碼段和變量等。例如:
<autopilot file="C310ap"/>
這里,自動駕駛儀定義文件 C310ap.xml 就會被搜索(在飛機配置文件的同名目錄下)並加載。但是這種只引用文件名的方式在實際過程中並不常見,為使得自動駕駛儀能夠被多個飛機模型使用,通常會在引用文件 C310ap.xml 的同時將控制率的PID參數重新定義一次(覆蓋原文件中的參數),即如下所示:
<autopilot file="C310ap"> <!-- Roll channel A/P gains --> <property value="50.0"> ap/roll-pid-kp </property> <property value="5.0"> ap/roll-pid-ki </property> <property value="17.0"> ap/roll-pid-kd </property> </autopilot>
作為參考,這里將文件 C310ap.xml 的內容摘錄如下:
<autopilot name="C-130 Autopilot"> <!-- file name = C310ap.xml --> <!-- INTERFACE PROPERTIES --> <property>ap/attitude_hold</property> <property>ap/altitude_hold</property> ... <property value="50.0"> ap/roll-pid-kp </property> <property value="5.0"> ap/roll-pid-ki </property> <property value="17.0"> ap/roll-pid-kd </property> <!-- Wing leveler --> <channel name="Roll wing leveler"> ... <pid name="fcs/roll-ap-error-pid"> <input>attitude/phi-rad</input> <kp> 1.0 </kp> <ki> 0.01 </ki> <kd> 0.1 <kd> <trigger> fcs/wing-leveler-ap-on-off </trigger> </pid> ...
這樣,作為科研工作者就可以開發一些通用的自動駕駛儀或者其他飛控配置文件,在具體使用的時候調用通用文件並修改部分增益和控制參數即可。飛控系統的各個組件的詳細內容在后續編程手冊中會逐一介紹。
JSBSim 中的自動飛行(Automatic Flight)
JSBSim 的長期目標是能夠實現自動(automatic)和腳本(scripted)飛行。其中,腳本飛行指的是在腳本文件控制下以獨立運行的方式(可視化除外)穩定的飛向不同目標(高度和極距或者經緯度均可)。腳本飛行的應用場合較多,例如模擬飛行訓練、飛機性能測試、飛控系統開發等。這些特性也包含一些潛在功能,例如潛入開關和函數組件、傳感器和其他自動駕駛儀相關項。
在JSBSim 中開發自動飛行功能需要包含以下文件:
- 腳本文件:扮演着制導系統的角色,負責發動機啟動、噴喉伸縮、飛向目標等功能
- 飛機配置文件:定義飛機屬性,包含飛行控制系統、自動駕駛儀的接口等
- 自動駕駛儀文件:可以獨立定義自動駕駛儀文件,也可以直接包含在飛機配置文件內
自動駕駛儀的職責是,將機翼的姿態水平、航向、高度控制達到所需要的位置並保持住當前狀態。對自動駕駛儀的設計屬於科學的范疇——但是作為用戶我們通常回避設計的細節,而是更多地關注如何在JSBSim 中添加並使用好自動駕駛儀。
例程:構建一個機翼矯正自動駕駛儀,機翼的水平姿態矯正是指飛機的滾轉角保持為零(\phi=0)。機翼的姿態收到許多因素的干擾,例如發動機扭矩、大氣湍流、燃料不均等。為了保持滾轉角為零(假設當前 \phi 不等0),需要獲得一個非零的滾轉角速率(phi rate),從而驅動機翼向水平方向靠攏(譯者注:從一個滾轉角非零的狀態到達歸零狀態,需要速率的變化)。為了獲得非零的滾轉角速率,則需要一個非零的滾轉角加速度,滾轉角加速度是由副翼(aileron)所控制的。
提出一個可行的方法——通過滾轉角控制副翼偏轉指令。這是一個比例控制,因為輸出的指令只是系數和輸入地乘積,即副翼偏轉角與輸入滾轉角誤差成正比例。副翼偏轉角指令傳送入飛行控制系統,偏轉角作用在副翼控制通道內。但是還是存在一些不妥之處,例如這種控制一直處於打開狀態。一個更好的解決途徑如下圖。
控制流程圖中的 min、max、K 的數值都是需要合理設置的。上圖對應的自動駕駛儀在 JSBSim 中的實現代碼如下,完成代碼后可以調試自動駕駛儀的性能。
<channel name="AP Roll Wing Leveler"> <pure_gain name="ap/roll-ap-wing-leveler"> <input>attitude/phi-rad</input> <gain>2.0</gain> <clipto> <min>-0.255</min> <max>0.255</max> </clipto> </pure_gain> <switch name="ap/roll-ap-autoswitch"> <default value="0.0"/> <test logic="AND" value="ap/roll-ap-wing-leveler"> ap/attitude_hold == 1 </test> </switch> <pure_gain name="fcs/roll-ap-aileron-command-normalizer"> <input>fcs/roll-ap-autoswitch</input> <gain>-1</gain> </pure_gain> </channel>
上述代碼中指的注意的有幾點:1)在 "ap/roll-ap-wing-leveler" 組件中本該包含 <gain> 1 </gain> ,但是考慮到這是 pure_gain 的默認狀態就省略了;2)副翼偏轉角被限制在正負0.255rad(即15度)以內,這與實際中副翼能偏轉的范圍相關;3)在ap/roll-ap-autoswitch 開關組件中,ap/attitude_hold 在功能上表示 Roll A/P ON,與控制流程圖中的開關對應。
上圖顯示滾轉角對副翼偏轉指令的追隨存在一個穩態偏差,這個可以通過添加積分器消除,控制流程如下:
在 JSBSim 配置文件中比例積分控制(PI)器的代碼如下:
<channel name="AP Roll Wing Leveler"> <pure_gain name="ap/roll-ap-wing-leveler"> <input>attitude/phi-rad</input> <clipto> <min>-0.255</min> <max>0.255</max> </clipto> </pure_gain> <pure_gain name="ap/roll-ap-wing-leveler"> <input>attitude/phi-rad</input> <gain>2.0</gain> </pure_gain> <integrator name="ap/roll-ap-error-integrator"> <input>ap/limited-phi</input> <c1>0.125</c1> </integrator> <summer name="ap/roll-ap-error-summer"> <input>ap/roll-ap-wing-leveler</input> <input>ap/roll-ap-error-integrator</input> <clipto> <min>-1.0</min> <max> 1.0</max> </clipto> </summer> <switch name="ap/roll-ap-autoswitch"> <default value="0.0"/> <test logic="AND" value="ap/roll-ap-wing-leveler"> ap/attitude_hold == 1 </test> </switch> <pure_gain name="fcs/roll-ap-aileron-command-normalizer"> <input>fcs/roll-ap-autoswitch</input> <gain>-1</gain> </pure_gain> </channel>
同樣,運行代碼測試后得到如下圖所示結果:
添加積分項后,機翼滾轉角控制的穩態偏差已經消除,能夠很好地歸零。但是,控制曲線的起始超調量偏大,這也是需要調整改善的地方,通過匹配比例和積分項的系數能夠在一定程度上優化結果。調試中會發現,機翼滾轉角響應結果與期望值還是存在差距,甚至在自動駕駛儀關閉后還會出現穩態跳動。
為改善結果,還可以添加導數項控制,導數項的控制輸出與系統誤差的變化率成正比例。在機翼水平矯正的案例中,誤差的變化率就是滾轉角速率(p)。添加導數項后,整個控制系統就是一個典型的PID控制(Proportional-Integral-Derivative),能夠實現更好的控制效果,控制的流程圖如下:
在JSBSim 中的實現代碼段如下:
<channel name="AP Roll Wing Leveler"> <pure_gain name="ap/roll-ap-wing-leveler"> <input>attitude/phi-rad</input> <clipto> <min>-0.255</min> <max>0.255</max> </clipto> </pure_gain> <pure_gain name="ap/roll-ap-wing-leveler"> <input>attitude/phi-rad</input> <gain>2.0</gain> </pure_gain> <integrator name="ap/roll-ap-error-integrator"> <input>ap/limited-phi</input> <c1>0.125</c1> </integrator> <summer name="ap/roll-ap-error-summer"> <input>velocities/p-rad_sec</input> <input>ap/roll-ap-wing-leveler</input> <input>ap/roll-ap-error-integrator</input> <clipto> <min>-1.0</min> <max> 1.0</max> </clipto> </summer> <switch name="ap/roll-ap-autoswitch"> <default value="0.0"/> <test logic="AND" value="ap/roll-ap-wing-leveler"> ap/attitude_hold == 1 </test> </switch> <pure_gain name="fcs/roll-ap-aileron-command-normalizer"> <input>fcs/roll-ap-autoswitch</input> <gain>-1</gain> </pure_gain> </channel>
重新運行代碼后,得到優化后的機翼滾轉角響應曲線如下圖所示。
飛行控制系統的設計比較復雜,需要首先了解控制器本身的特性和參數影響關系,然后才能快速的調試出適合的系數。在JSBSim中,添加控制器比較方便,使得用戶能夠集中精力在系數調試和特性研究上。
