參指南:從PID局限到Pixhawk能量控制實戰(zhàn))
飛固定翼的人十有八九都經(jīng)歷過這種抓狂瞬間油門桿沒動發(fā)動機轉(zhuǎn)速自己一跳一跳明明想平飛高度卻在 10 米范圍內(nèi)來回晃一拉桿爬升空速掉得比高度漲得還快一推桿下降飛機像坐過山車一樣先俯沖再被猛拽回來。很多人第一反應(yīng)是“PID 沒調(diào)好”于是反復折騰俯仰增益、阻尼系數(shù)結(jié)果該抖還是抖該掉速還是掉速。尤其是用 Pixhawk 飛控飛固定翼的新手往往在姿態(tài) PID 里浪費了大量時間卻不知道真正的元兇是更上層那個“看不見的算法”——TECS全稱 Total Energy Control System總能量控制系統(tǒng)。這篇教程完全從零開始不講廢話直接講清楚 TECS 到底在算什么、Pixhawk 里它和 PID 是什么關(guān)系、參數(shù)怎么調(diào)才不抖不掉速。無論你是在 ArduPilot 還是在 PX4 固件下玩固定翼這套能量控制的思路都通用。我會把數(shù)學公式掰開揉碎用人話講再用實測經(jīng)驗告訴你哪些參數(shù)先動、哪些參數(shù)千萬別亂動最后附上日志排查的方法。保證你看完能少走我當年踩過的那些大坑。1. 為什么固定翼控制要換思路PID 的局限與能量視角1.1 大多數(shù)新手都掉進過的“PID 調(diào)參坑”我先說一段自己的黑歷史。剛玩固定翼那會兒我用的也是 Pixhawk默認姿態(tài) PID 飛起來湊合能控但只要切到定高或者自動巡航模式問題就全來了高度偏差一出現(xiàn)飛控瘋狂拉桿拉到姿態(tài)保護限位后又猛地低頭整個飛機像在“鋸木頭”。我當時以為是姿態(tài)環(huán)增益不夠把 P 值一路往上加結(jié)果飛機開始高頻俯仰抖動差點空中解體。后來才明白固定翼的高度、速度、俯仰姿態(tài)本質(zhì)上是一個強耦合系統(tǒng)。你單純用一個 PID 去穩(wěn)住高度它必然通過大攻角或者大俯仰角去“硬掰”結(jié)果就是空速劇烈波動你用另一個 PID 去穩(wěn)空速它又去搶油門結(jié)果高度跟著亂跳。兩個控制回路互相打架飛機自然越飛越擰巴。固定翼不像多旋翼多旋翼的姿態(tài)、垂直速度解耦相對明顯固定翼升力依賴空速速度一變升力就變高度跟著變反過來又影響速度。想靠幾個獨立 PID 各管一段等于讓兩個司機同時搶方向盤誰都不服誰。1.2 把飛機當成一個“能量包”來看換個思路就好理解得多。不管你往哪個方向飛飛機這塊“鐵疙瘩”總共只有兩種能量因高度產(chǎn)生的勢能和因速度產(chǎn)生的動能。油門改變的是這個“總能量包”的大小好比給手機充電升降舵改變的只是能量的“分配方式”是拿來爬高還是拿來加速好比手機里后臺 App 誰用得多一點。飛機制造商和開源飛控社區(qū)早就看明白了這一點于是有了 TECS 這種基于能量狀態(tài)的控制器。TECS 的核心思想就一句話用油門去控制總能量的增減用升降舵去控制動能和勢能之間的分配比例。這樣天然尊重了固定翼的物理特性——發(fā)動機輸出的功率決定飛機總能量爬升或衰減的速度而升降舵只是把一部分能量“搬運”到高度或者速度上。所以你在用 Pixhawk 固件調(diào)固定翼時別再糾結(jié)“高度該歸高度 PID 管、速度該歸速度 PID 管”了TECS 才是這兩個量背后真正的統(tǒng)籌者。2. TECS 的核心原理一個公式看懂它的靈魂2.1 比總能量與能量分配率要把能量控制變成算法第一步是給“能量”找個統(tǒng)一的度量單位。開過電動車的人知道電池電量既可能花在爬坡上也可能花在提速上為了比較方便工程師常把動能和勢能變成同一個量綱。TECS 里最基礎(chǔ)的一個概念叫比總能量簡單說就是把速度折算成等效的高度再加實際高度[ E h \frac{V^2}{2g} ]其中 h 是高度V 是空速g 是重力加速度。因為固定翼的升力和發(fā)動機推力都依賴于空速所以這里用的是空速而不是地速。這個 E 也叫“能量高度”相當于把所有能量都折算成“還能再飛多高”。假如我當前 500 米高度、空速 30 m/s那我比能量相當于 500 302/(2×9.8) ≈ 500 45.9 ≈ 545.9 米意思是我如果把速度全部換成爬升最多還能再爬約 45.9 米。有了總能量還得再看分配。TECS 里定義了能量分配率反映在穩(wěn)住總能量的前提下動能和勢能誰升誰降[ D \dot{h} - \frac{V \dot{V}}{g} ]當 D 為正說明高度在增長而速度在下降也就是能量正在從動能搬運到勢能D 為負則相反。這樣就把飛機的兩個狀態(tài)量壓縮成了兩個“能量坐標”一個管總額一個管差值。TECS 后面的所有計算都是圍繞這兩個坐標展開的。2.2 油門管總能量升降舵管能量分配現(xiàn)在把控制邏輯對上號??偰芰康钠罱唤o油門來控制如果當前總能量低于期望總能量TECS 就會加大油門指令讓發(fā)動機輸出更多功率如果總能量盈余比如飛得又高又慢那就收油門。這樣做很符合直覺只有發(fā)動機能往系統(tǒng)里“注入”能量。能量分配偏差則交給升降舵來控制如果高度比期望高但速度比期望低說明能量過多地變成了高度也就是勢能占比太大TECS 會給出低頭俯仰指令讓飛機把一部分高度“還”給速度反之如果速度偏高但高度偏低就輕輕拉桿爬升。升降舵本身不改變總能量它只是通過改變氣動力方向讓飛機在動能和勢能之間做搬運工。需要特別注意的是TECS 輸出的并不是油門百分比和舵面角度本身而是期望的推力指令和期望的俯仰角。在 ArduPilot 里推力指令會進一步映射為油門的百分比期望俯仰角會交給底層的姿態(tài)控制器去執(zhí)行。所以 TECS 不是什么黑魔法它上面還有姿態(tài)內(nèi)環(huán)。如果底層姿態(tài) PID 調(diào)得稀爛TECS 算得再準也沒用這點后面調(diào)參時還會再強調(diào)。2.3 幾個你必須理解的關(guān)鍵概念理解 TECS 時有幾個術(shù)語會頻繁出現(xiàn)在日志和參數(shù)說明里提前搞清楚能省很多時間。第一個是SEP比剩余功率英文全稱 Specific Excess Power。它表示飛機當前單位重量下“多余”的功率其實就是總能量變化率。日志里如果 SEP 一直是正的說明飛機在穩(wěn)定積累能量空速或者高度必然會上升SEP 為負則說明系統(tǒng)在“耗能”。TECS 對油門指令的計算本質(zhì)上就是讓期望推力對應(yīng)的 SEP 盡快收斂到所需值。第二個是能量分配誤差通常用日志里的 Errdot 等字段表示。正負代表當前動能勢能分配失衡的方向。我以前看日志只看高度和空速兩條曲線半天看不出問題后來直接看 EPS 和能量誤差字段幾秒鐘就定位出“為何油門亂跳”的根源。這些字段在 Mission Planner 的 STATUS 頁面和 PX4 的 Flight Review 里都能找到。第三個是速度-高度權(quán)重對應(yīng)參數(shù)里的 SPDWEIGHT。它不是一個開關(guān)而是一個連續(xù)權(quán)重決定當總能量固定時系統(tǒng)更愿意把能量分配給速度還是高度。默認值在 1.0 附近表示比較均衡大于 1 傾向于優(yōu)先保速度小于 1 傾向于優(yōu)先保高度。理解了這個后面調(diào)參數(shù)時你就可以根據(jù)自己的飛行需求去“定制”飛機的脾氣。3. Pixhawk 里 TECS 到底是怎么跑起來的3.1 ArduPilot 與 PX4 中 TECS 的位置Pixhawk 本質(zhì)上是一個硬件平臺真正的“飛控大腦”是它上面跑的固件。目前主流開源固定翼固件里ArduPilot 和 PX4 都集成了自己的 TECS 實現(xiàn)思路源于 NASA 早期提出的總能量控制理論又在工程上做了不少適配。兩套代碼的入口不同但控制層級都是一樣的最外層是導航/制導層給 TECS 發(fā)期望高度和期望空速中間是 TECS解算出期望俯仰角和期望推力最內(nèi)層是姿態(tài)與油門伺服控制最終驅(qū)動舵機和電調(diào)。我常跟新手說TECS 是個“夾心層”。你調(diào) TECS 時如果把底層姿態(tài)環(huán)當作不存在看著參數(shù)調(diào)了半天也是隔靴搔癢。反過來底層姿態(tài)環(huán)調(diào)得干凈利索TECS 的收斂速度能明顯變好。所以遇到飛行品質(zhì)問題先分清是底層問題還是頂層問題再去碰對應(yīng)參數(shù)。3.2 TECS 在控制鏈路中的輸入輸出一次典型的自動飛行任務(wù)里TECS 接收的量包括期望高度、期望空速、當前高度、當前空速以及來自導航層的爬升率/下沉率限制。高度來源可以是氣壓計或者 GNSS 輔助高度空速來自空速管如果飛機沒裝空速管只能用 GPS 地速近似——但這里我必須提醒一句沒有空速管時 TECS 的性能會明顯下降。因為飛機在逆風順風時地速和空速相差很大用 GPS 地速當空速等于讓 TECS 在不同風況下算出來的能量狀態(tài)失真。TECS 內(nèi)部會先濾波、再做能量狀態(tài)估計然后經(jīng)過一系列控制律計算輸出兩個關(guān)鍵值demanded pitch期望俯仰角demanded throttle期望油門百分比。在 Mission Planner 的飛行數(shù)據(jù)頁面里你其實可以直接看到 TECS 輸出的這兩個量一個寫著 DEMPITCH一個寫著 DEMTHR。如果實際俯仰角和實際油門始終跟不上期望值那就說明問題在下游的姿態(tài)環(huán)路不要在 TECS 參數(shù)上白費力氣。3.3 核心參數(shù)速查表與分析正因為 TECS 在中間層工作它的調(diào)參參數(shù)數(shù)量并不多但每一個都影響“成敗”。我把 ArduPilot 固定翼里最常用的 TECS 參數(shù)整理成了表供你飛行前對照檢查。以下數(shù)值以 ArduPilot 4.x 常見的默認參考值為例具體請以你所用固件版本的實際默認值為準。參數(shù)名默認參考值作用調(diào)參方向TECS_TIME_CONST5.0高度控制時間常數(shù)決定響應(yīng)快慢越大越平緩越小越激進過小引發(fā)震蕩TECS_SPDWEIGHT1.0速度與高度權(quán)重1 保速度1 保高度一般 0.7~2 之間調(diào)整TECS_PTCH_DAMP0.1俯仰阻尼抑制能量分配環(huán)的振蕩過小容易俯仰抖動過大反應(yīng)遲鈍TECS_PITCH_MAX15最大俯仰角限制按機型特性和飛行場景調(diào)整千萬別亂設(shè)過小TECS_THR_MIN0最小油門百分比滑翔機可以設(shè)為 0動力機需要留一點怠速TECS_THR_MAX100最大油門百分比動力不足時需開到 100過大可能油門沖擊TECS_SINK_MAX2.0最大下沉率限制防止下降階段俯沖過快TECS_SINK_MIN-2.0最大爬升率限制防止爬升階段拉桿過猛PX4 里同樣前綴也是 TECS_參數(shù)名字段也高度相似比如TECS_SPDWEIGHT、TECS_TIME_CONST、TECS_PITCH_MAX等。你只要抓住 TIME_CONST、SPDWEIGHT、PTCH_DAMP、油門限幅這四類就抓住了調(diào)參的主線。剩下那些導數(shù)阻尼、垂直加速度限制等默認值一般都能用屬于飛機出了異常再做“外科手術(shù)式微調(diào)”時才碰的量。4. 保姆級調(diào)參實戰(zhàn)從默認參數(shù)到穩(wěn)如老狗4.1 調(diào) TECS 之前必須完成的前置條件很多人一上來就翻 TECS 參數(shù)表這里我要潑一盆冷水在開始調(diào) TECS 之前你的飛機必須滿足幾個硬性條件否則后面的工作全白做。第一姿態(tài)控制器的常規(guī) PID 已經(jīng)整定完成。ArduPilot 固定翼的姿態(tài)環(huán)參數(shù)主要集中在 PTCH2SRV_、RLL2SRV_這幾組還有更底層的速率環(huán)參數(shù)。怎么判斷是否達標手動模式下做幾個爬升、下滑、橫滾動作回中后飛機能干凈利落地恢復配平姿態(tài)沒有明顯超調(diào)和振蕩就算過關(guān)。如果手動橫滾回中有來回搖動TECS 里的俯仰期望再穩(wěn)也救不回來。第二空速管必須校準且讀數(shù)可信。我在沒有空速管的小翼展機型上試過 TECS地面風速稍大一點高度和速度權(quán)重就開始“打架”巡航時油門曲線像心電圖。如果你實在不想加空速管至少也要在無風天飛行并且理解此時的性能上限。第三電調(diào)校準和動力怠速確保合理。固定翼巡航時油門工作點通常不高如果電調(diào)未校準油門最低點和期望推力映射對不上TECS 輸出的“期望推力 50%”可能實際只給了 30% 的轉(zhuǎn)速整個能量閉環(huán)就偏了。4.2 第一次飛行只動三個參數(shù)第一次帶著 TECS 參數(shù)升空我建議你保持絕對克制只動三個參數(shù)。第一個是TECS_TIME_CONST從默認 5 起步不要一上來就改成 2 追求“跟手”。第二個是TECS_SPDWEIGHT大多數(shù)常規(guī)固定翼從 1.0 開始等你摸清飛機的性格再決定向哪個方向偏。第三個是TECS_PITCH_MAX根據(jù)你的機型和舵面強度設(shè)置一個合理的最大值普通航模 15 度左右夠用特技機可以適當放開到 20~25 度但千萬不要設(shè)到 45 度否則強風或陣風擾動下飛控可能給出一個“神仙”俯仰角翼載荷小的飛機直接失速。第一次飛行的任務(wù)只有一個在較高的安全高度切入定高模式ALT_HOLD或者自動任務(wù)觀察 20 秒??词裁纯此膫€東西一是俯仰角曲線是否平滑二是油門曲線是否連續(xù)三是高度是否圍繞目標高度收斂四是空速是否穩(wěn)定。只要沒有劇烈的振蕩今天的飛行就算成功。即使高度有一點周期性的超調(diào)波動也不要急著改參數(shù)把飛行日志存下來回地面看數(shù)據(jù)再動。4.3 進階調(diào)優(yōu)速度權(quán)重與時間常數(shù)的博弈當你跑過幾次默認參數(shù)飛行后就可以根據(jù)飛機的“性格”做針對性調(diào)整了。這里有兩個最常見的使用場景。如果你用的是一架動力相對充足、但翼載荷大、速度范圍窄的飛機比如飛翼或者像真機你會發(fā)現(xiàn)在巡航時 TECS 很容易“掉高度換速度”或者“掉速度換高度”。此時把TECS_SPDWEIGHT從 1.0 往 1.2~1.5 方向調(diào)讓算法更看重空速油門和俯仰的配合會明顯更協(xié)同不容易出現(xiàn)失速前兆。反過來如果你飛的是滑翔機或者動力不足的老式航??罩心芰勘容^寶貴那就把 SPDWEIGHT 調(diào)小到 0.7~0.8優(yōu)先保住高度在熱氣流里能獲得更自然的飄飛體驗。時間常數(shù)TECS_TIME_CONST和 SPDWEIGHT 是一對博弈關(guān)系。增大時間常數(shù)TECS 會更“平和”適合風大的日子因為不會對高度擾動反應(yīng)過度減小時間常數(shù)高度跟蹤更跟手但能量環(huán)對噪聲和風切變的敏感度上升油門和俯仰容易出現(xiàn)高頻修正。我自己實測下來在 3~4 級風里把 TIME_CONST 從 5 調(diào)到 6~7油門輸出抖動明顯減少。而在無風的小場地上飛 F3A 類飛機我會把 TIME_CONST 降到 4高度保持更緊湊。TECS_PTCH_DAMP是很多新手忽略的“防抖參數(shù)”。如果日志里期望俯仰角波動很頻繁而實際執(zhí)行也算跟手說明能量分配環(huán)在振蕩這時候不要動 TIME_CONST先加 PTCH_DAMP。我在一架后推飛翼上遇到過巡航時 0.3 Hz 左右的低幅俯仰振蕩把 PTCH_DAMP 從 0.1 加到 0.18振蕩直接消失。記住它壓的是“俯仰指令的噪聲”不要加太大否則氣動響應(yīng)會被拖慢。5. 常見問題排查與日志分析實錄5.1 現(xiàn)象油門忽大忽小像心跳圖這是 TECS 調(diào)參里最典型的問題。油門忽大忽小通常不是 TECS 單點造成的要分情況看。如果油門抖動頻率不高但幅度很大多半是能量誤差計算里混入了噪聲優(yōu)先檢查空速管是否堵塞、氣壓計是否受到機翼振動干擾如果日志里 SEP 和期望推力都在抖再看 TIME_CONST 是不是設(shè)太小把時間常數(shù)調(diào)大 1~2 秒往往就能壓住如果只是油門變化很劇烈但 SEP 曲線正常問題出在推力映射到油門的環(huán)節(jié)檢查油門限幅是否太窄、最低油門是否設(shè)得過高導致一個小推力誤差就引起很大的油門百分比變化。5.2 現(xiàn)象爬升掉速、下降增速飛機一進入自動爬升空速掉得厲害高度還沒上去多少一下降速度又開始失控地沖。這種“能量分配失衡”的核心是 TECS 認為當前能量足夠把太多能量拿去換高度或者反而把高度換成了速度。先從 SPDWEIGHT 入手如果爬升掉速嚴重說明算法給了高度過高的優(yōu)先級先把 SPDWEIGHT 加到 1.2 以上試飛如果下降階段增速嚴重通常和 SINK_MAX 限制過松有關(guān)把TECS_SINK_MAX從 2.0 往 1.5 左右收緊限制最大下沉率同時給 TECS 更多時間通過收油和帶桿來減速。還有一種隱蔽情況動力系統(tǒng)推力響應(yīng)太慢。油機或者大槳距電機從怠速到全油門需要一兩秒TECS 按瞬態(tài)推力模型計算能量但實際推力滯后導致爬升初期掉速。這種情況下我會把TECS_THR_MAX適當放開同時檢查電調(diào)剎車設(shè)置保證油門響應(yīng)不過度延遲。注意如果你用的是 ArduPilot還可以看推力轉(zhuǎn)速估計是否準確電機-電調(diào)-螺旋槳的推力曲線最好用實測數(shù)據(jù)標定。5.3 現(xiàn)象俯仰震蕩與掉高如果是連續(xù)的俯仰振蕩先分清楚是姿態(tài)內(nèi)環(huán)的問題還是 TECS 的問題。判斷方法很簡單切回手動模式手動推拉桿幾下如果回中后仍出現(xiàn)振蕩那基本是姿態(tài) PID 的事和 TECS 無關(guān)。如果手動模式很干凈一切到定高或自動模式就振優(yōu)先檢查TECS_PTCH_DAMP是否太小把阻尼從 0.1 往 0.15~0.2 方向加同時確認TECS_TIME_CONST是否被調(diào)得太小比如有人圖響應(yīng)快改成 2能量環(huán)會像神經(jīng)質(zhì)一樣不斷修正高度進而引起俯仰高頻動作。還有一種掉高現(xiàn)象很迷惑人飛機沒有俯仰振蕩但每次轉(zhuǎn)彎都會掉 10~20 米高度。這其實不一定是 TECS 參數(shù)問題多半是轉(zhuǎn)彎時的協(xié)調(diào)性問題。固定翼在傾斜轉(zhuǎn)彎時升力垂直分量減小TECS 理應(yīng)先預測到能量損失通過提前加油門來補償。如果你發(fā)現(xiàn)轉(zhuǎn)彎掉高明顯檢查轉(zhuǎn)彎過程中副翼、方向舵是否協(xié)調(diào)協(xié)調(diào)轉(zhuǎn)彎能讓 TECS 的能量估計更準確而不是單純加大 PITCH_MAX 去“硬拉”。5.4 如何用日志定位問題紙上談兵再多也不如親手看一次日志。ArduPilot 用戶可以用 Mission Planner 的“Flight Data”界面在 STATUS 頁面調(diào)出 TECS 相關(guān)字段TECS.EH是期望能量高度TECS.EHdot是期望能量高度變化率TECS.SEP是比剩余功率TECS.Err和TECS.Errdot分別是總能量誤差和誤差變化率TECS.DEMPITCH、TECS.DEMTHR是 TECS 輸出的期望俯仰和期望油門。PX4 用戶則用 Flight Review 打開 ULog查看tecs_status消息里的totalEnergyError、energyDistributionError等字段。我把排查流程簡化成一個“三段式”問題定位法第一步對比DEMPITCH和實際俯仰角如果兩者偏差大問題在姿態(tài)內(nèi)環(huán)第二步對比DEMTHR和實際油門如果兩者偏差大問題在動力映射第三步如果 TECS 的輸入期望高度、期望空速本身就忽上忽下那問題來自更上層的制導邏輯比如航線轉(zhuǎn)彎切換參數(shù)。按這個順序走你基本不會在錯誤層級白折騰。我自己后來遇到任何奇怪現(xiàn)象都強迫自己先看這三個差別再決定動哪個分區(qū)省下的時間遠超調(diào)參本身。6. 寫在最后一點個人體會最后分享一個我踩過兩次的坑。有一陣子我調(diào)一架大展弦比滑翔機始終覺得 TECS 高度收斂太肉于是把TECS_TIME_CONST一路從 5 降到了 2.5。結(jié)果呢無風天飛起來確實利索一到陣風天油門和俯仰就像兩個喝多了的人在搶方向盤來回劇烈修正。后來我把時間常數(shù)調(diào)回 5同時把空速權(quán)重加到 1.3飛機的表現(xiàn)立刻“紳士”了很多。這件事讓我印象極深——TECS 的魅力從來不是把響應(yīng)調(diào)得有多激近而是讓飛控學會“有分寸地用力”。另外送新手一個實操小技巧每次只改一個參數(shù)飛行記錄至少 3 分鐘回地面后導出日志對比同一航段的油門和高度曲線。多積累幾次參數(shù)改動和曲線變化的對應(yīng)關(guān)系你很快就能建立起對 TECS 的“手感”。加油門不拉桿飛機自己就能找到屬于自己的那條航跡。