
1. 項目概述從PID到ADRC控制算法的“降維打擊”在工業控制、機器人、電力電子這些領域摸爬滾打久了你一定會對PID控制器又愛又恨。愛它的簡單直觀幾個參數調來調去大部分時候都能讓系統“動起來”恨它的“嬌氣”面對非線性、強耦合、大時滯或者外部擾動PID就像個經驗不足的舵手要么反應遲鈍要么劇烈震蕩調參調到懷疑人生是常有的事。我當年調試一個伺服系統為了應對負載突變PID參數前前后后改了不下五十版最后還是加了前饋和各種濾波才勉強能用過程極其痛苦。后來接觸到自抗擾控制ADRC感覺像是打開了一扇新世界的大門。它不像一些現代控制理論那樣需要精確的數學模型也不像模糊控制、神經網絡那樣“黑箱”。ADRC的核心思想非常“霸道”不管系統內部具體是什么結構也不管外部來了什么妖魔鬼怪擾動我統統把它們打包成一個“總擾動”然后實時估計并補償掉。剩下的就是一個被我“馴化”好的、簡單的積分串聯型系統用最簡單的控制律就能搞定。這種“觀測-補償”的思路對于咱們這些一線工程師來說直觀又實用。最近在搞永磁同步電機的電流環控制傳統的PI調節器在高速弱磁區或者參數變化時性能下降明顯。換上ADRC后動態響應和抗擾能力提升了一個檔次參數也更好整定。網上流傳的ADRC算法m文件我也研究過不少有的寫得很精妙有的則存在理解偏差。今天我就結合自己的實戰經驗把ADRC從核心思想到代碼實現掰開揉碎了講清楚目標是讓你看完就能理解原理并且能動手在自己的項目里嘗試應用。2. ADRC核心思想與架構拆解把復雜問題“打包”解決ADRC的發明者韓京清研究員提出這一理論時目標很明確找到一種既不依賴精確模型又能實現高性能魯棒控制的方法。它的整體架構可以概括為“三部分”跟蹤微分器TD、擴張狀態觀測器ESO和非線性狀態誤差反饋NLSEF。咱們先拋開這些術語用個生活化的例子來理解。想象一下你在開車目標是讓車速穩定在100km/h。傳統的PID控制器就像是你只盯著速度表當前誤差發現慢了就多踩點油門發現快了就松一點。但如果遇到上坡負載擾動、逆風外部擾動或者車子本身發動機響應特性變了模型不確定性你這個“只看速度表”的策略就會很被動容易產生超調或調節緩慢。ADRC的做法則像是一個經驗豐富的老司機搭配一個智能副駕智能副駕TD他不滿足于當前速度還會根據路況和你想要的速度規劃出一條平滑過渡的理想速度曲線。比如從80加速到100他不會讓你瞬間踩到底而是規劃一個既快速又平緩的加速過程避免沖擊。這就是TD的作用——安排過渡過程并提取出理想的系統狀態比如理想位置、理想速度。超級雷達ESO這是ADRC的靈魂。這個雷達不僅能看到車的實際速度和位置系統輸出還能實時“看見”并估算出所有影響車速的因素總和包括你踩的油門控制量、上坡的阻力、逆風、發動機的損耗等等。它把這些亂七八糟的東西全部打包估算成一個叫做“總擾動”的信號。ESO的強大之處在于它不需要知道坡有多陡、風有多大它只通過觀察車的實際運動就能把這個“總擾動”實時算出來。決策大腦NLSEF大腦拿到兩個信息一是智能副駕規劃的理想狀態來自TD二是超級雷達提供的實際狀態和總擾動估計來自ESO。大腦計算兩者的誤差并根據誤差的大小和變化率以一種非線性的方式比如誤差很大時增益大誤差很小時增益小避免高頻顫振計算出最初的控制力。但是這還沒完最關鍵的一步來了大腦會從初步控制力中減去雷達估算出的“總擾動”。這樣一來實際作用到車子上的控制指令就相當于是在一個“無擾動”的理想環境下發出的指令。所以ADRC的流程就是規劃理想軌跡 - 觀測并估計所有內外部擾動 - 基于理想軌跡和實際狀態的誤差計算控制量 - 補償掉估計的擾動 - 得到最終控制指令。經過這樣的處理無論系統本身多復雜外部環境多惡劣被控對象在控制器“眼”里都近似變成了一個簡單的、干凈的積分器串聯型系統自然就好控制了。這就是其“自抗擾”能力的根源——自己抵抗、補償擾動。2.1 核心組件一跟蹤微分器TD—— 柔化指令提取微分TD經常被初學者忽略覺得它不就是給個設定值嗎其實它的作用至關重要。直接給系統一個階躍設定值相當于要求輸出瞬間跳變這對于物理系統來說意味著需要無窮大的能量和控制力必然引起劇烈沖擊和超調。TD的核心作用是“安排過渡過程”。它接收一個跳變的指令信號v然后輸出一個平滑的跟蹤信號v1及其微分v2。最經典的TD算法是韓老師提出的最速控制綜合函數fhan離散形式。它的內部是一個離散差分方程通過非線性反饋使得v1能以最快速度無超調地跟蹤上v同時v2是v1的合理微分避免了直接數值微分的噪聲放大問題。在實際編程中比如寫那個ADRC算法m文件TD的代碼可能長這樣function [v1, v2] TD(v, v1, v2, h, r) % v: 當前目標值 % v1, v2: 上一時刻的跟蹤值及其微分 % h: 離散積分步長 % r: 速度因子決定跟蹤快慢 d r * h; d0 h * d; y v1 - v h * v2; a0 sqrt(d*d 8*r*abs(y)); a v2 (a0 - d)/2 * sign(y); if abs(y) d0 a v2 sign(y) * r; end v2 v2 h * fsg(a, d, r); % fsg是一個符號函數 v1 v1 h * v2; end注意參數r非常關鍵。r越大跟蹤速度越快但會對噪聲更敏感。通常需要根據系統響應能力和采樣頻率來調整。h就是你的控制周期。2.2 核心組件二擴張狀態觀測器ESO—— 擾動估計的靈魂ESO是ADRC實現“抗擾”的核心。它的思想是將系統的總擾動包括未建模動態和外部擾動擴張成一個新的狀態變量然后設計一個觀測器對這個新狀態即擾動進行實時估計。假設我們有一個二階系統很多電機、位置控制都可以簡化成二階? f(y, ?, w, t) b*u其中f是未知的內部動態和外部擾動w的總和b是控制增益通常可粗略估計。ESO把這個系統重新表述為?1 x2?2 x3 b*u?3 ?假設擾動變化率有界y x1這里x1是系統輸出yx2是輸出的微分?而x3就是我們擴張出來的狀態用來代表總擾動f。然后我們設計一個龍伯格觀測器Luenberger Observer來估計這三個狀態e z1 - y觀測誤差?1 z2 - β01 * e?2 z3 - β02 * e b*u?3 -β03 * e其中z1, z2, z3分別是x1, x2, x3的估計值。β01, β02, β03是觀測器增益需要精心配置以保證觀測器穩定且快速。觀測器收斂后z3就會實時跟蹤上總擾動f。這樣我們就“看見”了擾動。在實際的ADRC電流環設計中y就是反饋的電流值u是電壓指令z3估計的就是反電動勢、電阻電感參數變化、死區效應等所有擾動之和。2.3 核心組件三非線性狀態誤差反饋NLSEF與擾動補償有了TD給出的理想狀態v1, v2和ESO給出的實際狀態估計z1, z2以及擾動估計z3我們就可以計算控制了。首先計算誤差e1 v1 - z1位置/電流誤差e2 v2 - z2速度/電流微分誤差然后NLSEF采用一個非線性函數來處理這些誤差經典的是“fal”函數fal(e, α, δ) |e|^α * sign(e), 當 |e| δfal(e, α, δ) e / δ^(1-α), 當 |e| ≤ δ其中0 α 1δ 0。這個函數的特點是大誤差時增益大提高響應速度小誤差時增益小避免高頻顫振和平滑控制。δ是一個線性區間防止在零點附近因函數不平滑導致的抖動。那么初步的控制量u0為u0 β1 * fal(e1, α1, δ) β2 * fal(e2, α2, δ)β1和β2是誤差增益。最后執行關鍵的擾動補償u (u0 - z3) / b這里b就是ESO里那個粗略的控制增益估計。這個公式的意義在于計算出的理想控制力u0減去觀測到的擾動z3再除以增益b就得到了最終應該施加的控制量u。經過這樣的補償系統方程近似變成了? ≈ u0一個簡單的雙重積分器非常好控制。3. ADRC參數整定與工程化實踐理論很美但落到代碼上參數整定是逃不過的坎。ADRC參數看起來比PID多TD的rhESO的β01, β02, β03, bNLSEF的β1, β2, α1, α2, δ但其實有很強的物理意義和整定規律并非盲目調試。3.1 “帶寬法”參數整定化繁為簡這是工程上最常用、最有效的方法由高志強教授提出將觀測器和控制器的性能與“帶寬”這一概念掛鉤極大簡化了調參。ESO參數整定將ESO的特征多項式配置為(s ω_o)^3其中ω_o稱為觀測器帶寬。通過極點配置可以推導出β01 3ω_oβ02 3ω_o^2β03 ω_o^3這樣一來ESO的三個增益就由一個參數ω_o決定了。ω_o越大觀測器收斂越快對擾動的估計能力越強但同時對測量噪聲也越敏感。一般ω_o設為系統期望閉環帶寬的3~10倍。參數b需要大致估計它代表了控制量對輸出的增益比如在電流環中b ≈ 1/L電感倒數估不準沒關系ESO有一定的魯棒性但偏差太大會影響性能。控制器參數整定將誤差反饋律線性化即取α1α21δ設大點其閉環特征多項式可配置為(s ω_c)^2其中ω_c稱為控制器帶寬。可以推導出β1 ω_c^2β2 2ω_cω_c直接決定了系統的響應速度。ω_c越大響應越快但控制量會越大也可能激發未建模的高頻動態。通常ω_c應小于ω_o的1/3到1/5以保證觀測器比控制器更快能及時提供準確的擾動估計。TD參數整定速度因子r決定了跟蹤設定值的最大加速度。理論上r可以很大但受限于執行機構物理極限和采樣頻率。步長h就是控制周期。通常先設一個較大的r觀察v1的跟蹤曲線只要不超出執行機構能力且平滑即可。通過“帶寬法”我們將調參從8-9個減少到3個核心參數ω_o觀測器帶寬、ω_c控制器帶寬、b控制增益估計。r和h相對獨立。非線性參數α1, α2, δ在初步整定時可以先設為1即線性系統穩定后再微調以優化性能。α通常取0.5~0.75δ取采樣周期附近的值。3.2 工程實現要點與代碼結構當你動手寫那個ADRC算法m文件或C代碼時結構應該清晰。以下是一個面向對象的離散ADRC二階控制器偽代碼框架非常適合嵌入式實現classdef ADRC_2nd properties % TD 參數 h, r; v1, v2; % TD狀態 % ESO 參數 beta01, beta02, beta03, b; z1, z2, z3; % ESO狀態 % NLSEF 參數 beta1, beta2, alpha1, alpha2, delta; % 其他 u_last; % 上一拍控制量用于補償 end methods function obj ADRC_2nd(h, r, wo, wc, b_est) % 初始化 obj.h h; obj.r r; obj.v1 0; obj.v2 0; % 帶寬法設置ESO增益 obj.beta01 3*wo; obj.beta02 3*wo^2; obj.beta03 wo^3; obj.b b_est; obj.z1 0; obj.z2 0; obj.z3 0; % 帶寬法設置控制器增益線性 obj.beta1 wc^2; obj.beta2 2*wc; obj.alpha1 1; obj.alpha2 1; % 先線性 obj.delta h; % 線性區間設為步長 obj.u_last 0; end function [u, states] update(obj, target, feedback) % 1. TD更新 [obj.v1, obj.v2] fhan(target, obj.v1, obj.v2, obj.h, obj.r); % 2. ESO更新 e_eso obj.z1 - feedback; obj.z1 obj.z1 obj.h * (obj.z2 - obj.beta01 * e_eso); obj.z2 obj.z2 obj.h * (obj.z3 - obj.beta02 * e_eso obj.b * obj.u_last); obj.z3 obj.z3 obj.h * (-obj.beta03 * e_eso); % 3. 計算誤差和非線性反饋 e1 obj.v1 - obj.z1; e2 obj.v2 - obj.z2; fe1 fal(e1, obj.alpha1, obj.delta); fe2 fal(e2, obj.alpha2, obj.delta); u0 obj.beta1 * fe1 obj.beta2 * fe2; % 4. 擾動補償 u (u0 - obj.z3) / obj.b; % 5. 限幅和保存 u saturate(u, umin, umax); % 執行器飽和 obj.u_last u; states [obj.v1, obj.v2, obj.z1, obj.z2, obj.z3]; end end end這個框架在每個控制周期被調用一次輸入當前目標值和系統反饋輸出控制量。清晰的狀態更新和分離的模塊便于調試和監控。4. 在電機電流環中的應用與調試實錄將ADRC應用于永磁同步電機PMSM的電流環是檢驗其性能的絕佳場景。電流環要求響應快、抗擾強傳統的PI調節器在d-q軸解耦和反電動勢擾動上需要精細補償而ADRC可以將其視為總擾動一并估計補償。4.1 模型建立與參數設計PMSM在同步旋轉坐標系下的電壓方程忽略磁飽和等為u_d R*i_d L_d*di_d/dt - ω_e*L_q*i_qu_q R*i_q L_q*di_q/dt ω_e*(L_d*i_d ψ_f)其中ω_e是電角速度ψ_f是永磁體磁鏈。可以看到q軸電壓方程中包含了反電動勢項ω_e*ψ_f和耦合項ω_e*L_d*i_d這些都是PI控制器需要額外處理的前饋或解耦項。在ADRC框架下我們可以將每個電流環d軸和q軸獨立建模為一個一階系統因為電壓方程本身是一階微分方程di/dt ( -R*i 耦合項/反電動勢 擾動 b*u ) / L這里我們把-R*i/L作為部分已知動態可以歸入b*u或作為已知擾動補償而把耦合項、反電動勢、參數變化、測量噪聲等所有其他因素都打包進“總擾動”f。于是模型簡化為di/dt f b*u其中b可以粗略取為1/L或1/L_d,1/L_q。因此我們需要為每個電流環設計一個一階ADRC因為系統是一階的。一階ADRC比二階更簡單TD安排電流指令的過渡過程輸出平滑的指令v1。ESO擴張成一階觀測器估計電流z1和總擾動z2。NLSEF計算誤差e1 v1 - z1并生成u0。補償u (u0 - z2) / b。參數整定依然用帶寬法。對于電流環響應要求很高假設期望電流環帶寬為f_c 1000 Hz則ω_c 2*π*f_c。觀測器帶寬ω_o可取(3~5)*ω_c。b取1/L的標稱值。4.2 調試步驟與問題排查在實際電機平臺上調試ADRC電流環我建議遵循以下步驟準備工作確保你的電流采樣、PWM驅動、Clark/Park變換等基礎環節正確無誤。先用一個非常保守的PI控制器讓電機轉起來作為基準。初始化與參數注入將一階ADRC參數寫入代碼。開始時將ω_c和ω_o設小比如對應100Hz帶寬b值給準NLSEF先設為線性α1。TD的r先設一個中等值。開環測試ESO這是關鍵一步在電機靜止或低速空載下給一個很小的、恒定的電壓指令u同時讓ADRC算法運行但不使用其輸出的u而是用你給定的那個小電壓。觀察ESO估計的電流z1是否跟蹤實際反饋電流i估計的擾動z2是否穩定在一個值附近。如果z1跟蹤良好說明ESO基本工作正常。你可以故意改變一點b值看ESO的z2如何變化來補償這個建模誤差。閉環測試與帶寬提升將ADRC的輸出u接入系統形成閉環。給定一個小的階躍電流指令。逐步增大ω_c控制器帶寬觀察電流響應速度。同時按比例增大ω_o保持ω_o 3ω_c。你會看到電流響應越來越快。注意監控控制量u即電壓指令確保沒有飽和。也要觀察估計的擾動z2在負載突變時它應該快速變化以抵消擾動。引入非線性與抗擾測試當線性ADRC工作穩定后可以嘗試引入非線性fal函數。將α設為0.5或0.75δ設為幾個采樣周期的誤差值。這通常能進一步平滑小誤差段的控制減少高頻噪聲。然后進行抗擾測試突加負載、快速升降速對比ADRC和PI的電流跟蹤波形和恢復時間。常見問題與排查表現象可能原因排查與解決思路系統發散、振蕩1.ω_o或ω_c過大超出系統有效帶寬。2. 參數b估計嚴重偏差。3. 控制量飽和未處理。1. 大幅降低ω_o和ω_c從很慢的響應開始調。2. 檢查b值符號和量級。可通過開環ESO測試給一個階躍u看z1的變化斜率斜率應約等于b*u。3. 在輸出u后加入硬限幅并將限幅后的值反饋給ESO如上面偽代碼的u_last這是關鍵ESO估計值z1有較大靜差1. ESO增益不足觀測器收斂慢。2. 測量反饋y有恒定偏差或噪聲過大。1. 適當增大ω_o提高觀測器帶寬。2. 檢查電流采樣校準和濾波。ESO本身有一定濾波作用但前端噪聲過大會影響估計精度。擾動估計z2噪聲大1.ω_o過高放大了測量噪聲。2. 反饋信號y噪聲大。1. 降低ω_o在響應速度和噪聲抑制間折衷。2. 對反饋信號y進行一階低通濾波但需注意引入相位滯后。或者可以考慮使用降階ESO等變體。動態響應慢不如PI1.ω_c設置過低。2. TD的r過小指令過渡太慢。3. 非線性參數α太小或δ太大導致誤差增益始終很低。1. 在穩定前提下逐步增大ω_c。2. 增大TD的r。3. 檢查fal函數輸出確保在動態過程中e較大時非線性函數能輸出足夠大的值。可暫時切回線性α1對比。切換負載時電流恢復慢擾動估計z2響應不夠快。增大ω_o提高觀測器對擾動變化的跟蹤速度。同時檢查b值是否準確不準確的b會降低補償效率。4.3 實測心得與進階技巧經過多個項目的實踐我總結出幾點心得“b”值不必精確ESO對b有很強的魯棒性。b的估計值在真實值的0.5到2倍范圍內系統通常都能穩定工作只是性能略有差異。這大大降低了工程應用門檻。TD并非必須對于很多伺服系統指令本身變化并不劇烈或者對指令跟蹤的平滑性要求不高時可以省略TD直接用目標指令作為v1其微分v2設為0。這能簡化算法特別是在一階ADRC中。注意離散化與計算延時上面給出的ESO和TD公式都是歐拉離散化。在高帶寬或低采樣率下可能需要更高精度的離散化方法如雙線性變換。另外從采樣、計算到PWM更新產生的固有延時通常1-2個控制周期會影響高帶寬下的穩定性必要時需要在ESO模型或控制律中考慮延時補償。從一階ADRC開始很多物理系統如電流環、溫度控制本質是一階的。從一階ADRC入手參數更少ω_o,ω_c,b調試更簡單理解更深刻成功后再擴展到二階位置/速度環。與現有框架融合你不需要完全拋棄現有的控制框架。例如可以在原有PI電流環的基礎上保留PI作為誤差反饋即u0的計算然后加上ESO進行擾動估計和補償形成一種“PI擾動觀測器”的復合結構這是一種平滑的遷移策略。ADRC的魅力在于它提供了一種統一、強大的框架來處理不確定性和擾動。它不一定在所有場景下都碾壓PID但在模型不確定性強、擾動頻繁的場合其優勢非常明顯。調試的關鍵在于理解帶寬參數ω_o和ω_c的物理意義以及ESO那個“擾動估計與補償”的核心動作。當你看到在負載突加時z2瞬間跳變并抵消了擾動電流幾乎無靜差地恢復跟蹤那一刻你就會覺得之前所有的調試都是值得的。