初步认识ADRC(自抗扰控制)与应用
ADRC的基本原理
一、參考資料推薦
想要初步了解ADRC,可以從韓京清教授的一篇文獻和一本書看起
1.文獻: 從PID技術到“自抗擾控制”技術(《控制工程》,2002)
2.書: 自抗擾控制技術——估計補償不確定因素的控制技術
不過文章里講的不是很細,是把之前多篇文章內容綜合到一起提出了ADRC整體的控制框架。想要更深入學習當然還是看書更好一些。
二、為什么PID好,以及,為什么PID不夠好
1.為什么PID好——不依賴于模型的控制器
經典的PID控制直到如今都還是應用最廣泛的控制算法,大部分的控制系統里用的都還是這個。它的好處主要在于,不需要被控對象的模型。
什么是被控對象的模型?
舉個例子,假設我們以小車的速度 V V V為被控量,但是推動小車的力 F F F才是我們的控制量。
考慮阻力并假設阻力和速度成正比的話,根據牛頓第二定律我們可以得到小車的動力學方程 F ? k V = m a F-kV=ma F?kV=ma,其中 k k k為阻力系數, m m m為小車質量。
根據質點運動學方程又有 V ˙ = a \dot{V}=a V˙=a,
這樣就可以得到利用外力 F F F控制小車速度 V V V的模型 V ˙ = ? k m V + 1 m F \dot{V}=-\frac{k}{m}V+\frac{1}{m}F V˙=?mk?V+m1?F
(也就是 x ˙ = ? A x + B u \dot{x}=-Ax+Bu x˙=?Ax+Bu的線性模型的結構)
OK,這個方程通常就是我們需要的,如果要應用現代控制理論(比如最優控制)設計一個控制器,那么我們就需要知道這個模型的全部信息東西,在這里就是模型的結構以及阻力系數 k k k和小車質量 m m m。
獲得這個模型存在兩個問題:
- 實際工程的模型結構遠比這復雜。比如阻力和速度的關系可能并不是成正比,我們只是這么假設的,實際的的關系可能是一個復雜的非線性函數。
- 模型的參數難以獲得。這里的阻力系數 k k k和小車質量 m m m好像挺容易獲得的,但是實際被控對象的模型參數可能要多的多,有些是很難獲得的。
由于模型難獲得,而現代控制理論又大多基于模型設計,雖然能夠滿足各種各樣的性能條件,但大都不夠實用,這也就導致了PID一直稱霸各個控制領域。因為PID是只利用誤差 e e e 來計算控制量的,不需要模型知識,只需要調一調 K P , K I , K D K_P,K_I,K_D KP?,KI?,KD? 三個參數就能得到可以接受的效果。
2.為什么PID不夠好——PID的缺點
注意到前面說 PID 能得到可以接受的效果,我們當然希望PID能夠得到更好的控制效果,那么PID還有哪些不足呢?
以下摘自前面說的韓京清的那篇文章
- 誤差的取法(直接由給定指令計算誤差)
- 由誤差提取誤差微分的方法(使用傳統的線性微分器)
- 加權和的策略不一定最好(比例,積分,微分項各乘上放大系數 K K K然后相加來計算控制量)
- 積分反饋有許多副作用(對誤差進行積分并放大然后反饋到系統)
三、ADRC給出的方案——如何保留PID的優點,同時彌補PID的缺點
上一節寫了PID的幾個缺點,下面一條一條解釋這些缺點的意思,并給出ADRC的解決方案:
1. 誤差的取法——安排過渡過程
直接根據給定指令計算誤差可能會導致控制效果變差,比如有些指令里包含了我們不希望的高頻信號,這類信號的例子有:階躍指令,方波指令。
為了將高頻信號解決掉,ADRC提出了安排“過渡過程”的方法,類似于把給定指令進行低通濾波,得到一個更容易實現的指令,從而在犧牲一點快速性的同時大大降低超調。
這里給個例子,考慮兩個系統,一個帶有指令濾波,一個不帶:
圖1 帶有指令濾波器👆
圖2 不帶指令濾波器👆
當指令為單位階躍指令,只用一個增益 K = 2 K=2 K=2來控制二階系統 1 s 2 + s \frac{1}{s^2+s} s2+s1?的時候,有無指令濾波器的效果如下:
圖3 帶不帶指令濾波器的控制效果對比👆
不難看到,加了指令濾波器之后,雖然上升速度變慢了,但是超調更小了,調節時間基本沒變,甚至還縮短了。
安排過渡過程也是類似這樣的道理。因為像階躍這樣變化太快的突變信號,當控制器增益高的話就很容易引起超調,如果提前安排過渡過程,讓指令信號慢一點變化,就能得到更好一點的控制效果。
2. 由誤差提取誤差微分的方法——跟蹤微分器
經典的線性微分器,如 W = s τ s + 1 W=\frac{s}{\tau{s}+1} W=τs+1s?以及 W = s ? ω 2 s 2 + 2 ω s + ω 2 W=\frac{s*\omega^2}{
{s}^2+2\omega{s}+\omega^2} W=s2+2ωs+ω2s?ω2?都是在跟蹤給定信號的同時輸出微分量。
這部分在韓京清的那本書上也有介紹,但是用公式解釋可能比較枯燥,在simulink上畫圖就比較直觀:
對于一階線性微分器: W = s τ s + 1 W=\frac{s}{\tau{s}+1} W=τs+1s?,其實可以看成是一個慣性環節的微分:
圖4 一階線性微分器👆
我們知道慣性環節 G = 1 τ s + 1 G=\frac{1}{\tau{s}+1} G=τs+11? 是可以無超調的跟蹤到給定階躍信號的。當 G = 1 τ s + 1 G=\frac{1}{\tau{s}+1} G=τs+11? 跟蹤原信號的同時,積分器 1 s \frac{1}{s} s1? 前面的量也就是 W = G ? s = s τ s + 1 W=G*s=\frac{s}{\tau{s}+1} W=G?s=τs+1s? 也在輸出 G G G的微分量,那么我們就可以管這個叫做跟蹤-微分器。它一邊實現對原信號的跟蹤,一邊提供微分信號。
注意:當上圖的Gain越大,也就是慣性環節的時間常數 τ \tau τ 越小的時候,慣性環節跟蹤原信號就越快。對于輸入信號為正弦波信號的情況就是相位滯后和幅值損失越小,這一點可以綜合慣性環節的伯德圖來思考。我們當然是希望相位滯后盡可能的小,但是 τ \tau τ 越大則 W = s τ s + 1 W=\frac{s}{\tau{s}+1} W=τs+1s? 得到的微分信號對高頻噪聲的放大也越明顯,這一點也可以綜合微分環節 s s s 的伯德圖來考慮。
類似的,二階微分器 W = s ? ω 2 s 2 + 2 ω s + ω 2 W=\frac{s*\omega^2}{
{s}^2+2\omega{s}+\omega^2} W=s2+2ωs+ω2s?ω2? 也可以看成一個阻尼比為1的震蕩環節 G = ω 2 s 2 + 2 ω s + ω 2 G=\frac{\omega^2}{
{s}^2+2\omega{s}+\omega^2} G=s2+2ωs+ω2ω2? 的微分,即 W = G ? s W=G*s W=G?s。
圖5 二階線性微分器($\omega=10$)👆
注意:這個二階慣性環節,也可以看成一個閉環二階系統跟蹤指定的指令(這句話比較有意思)。公式如下:
{ x ˙ 1 = x 2 x ˙ 2 = u = ? ω n 2 ( x 1 ? x r e f ) ? 2 ω n x 2 \left\{ \begin{array}{rcl} \dot{x}_1 &=& x_2 \\ \dot{x}_2 &=& u =-\omega_n^2(x_1-x_{ref})-2\omega_nx_2\\ \end{array} \right. {
x˙1?x˙2??==?x2?u=?ωn2?(x1??xref?)?2ωn?x2??
其中 x r e f x_{ref} xref? 為指定的指令。這個公式的形式和上面那個圖雖然不是很像,但是實際上二者是等效的。
參考這個思想,可不可以用最速控制來實現這個二階系統的指令跟蹤,從而構造出一個新的跟蹤-微分器?
ADRC的跟蹤-微分器就是這么來的。
考慮一個二階系統:
{ x ˙ 1 = x 2 x ˙ 2 = u ( ∣ u ∣ ≤ r ) \left\{ \begin{array}{rcl} \dot{x}_1 &=& x_2 \\ \dot{x}_2 &=& u &(|u|≤r)\\ \end{array} \right. {
x˙1?x˙2??==?x2?u?(∣u∣≤r)?
則以原點為收斂點的最速控制函數為:
u = ? r s i g n ( x 1 + x 1 ∣ x 2 ∣ 2 r ) u=-rsign(x_1+\frac{x_1|x_2|}{2r}) u=?rsign(x1?+2rx1?∣x2?∣?)
可以設計跟蹤器為:
u = ? r s i g n ( x 1 ? x r e f + x 1 ∣ x 2 ∣ 2 r ) u=-rsign(x_1-x_{ref}+\frac{x_1|x_2|}{2r}) u=?rsign(x1??xref?+2rx1?∣x2?∣?)
這就是ADRC的跟蹤-微分器的連續形式,但是這個東西在進入穩態后算出來的微分量會一直高頻振蕩。主要原因就是 u u u 中符號函數 s i g n ( x ) sign(x) sign(x)的存在,即使經過積分一次后得到的 x 2 x_2 x2? 依然避免不了震蕩。因為數值積分嘛,你懂的。
所以為了能夠實現離散系統的最速控制,消除跟蹤-微分器的穩態顫振,韓教授又搞了一個離散最速控制函數,這個比較復雜一點。這里我們只負責介紹跟蹤-微分器的思想,關于離散最速控制函數放到下一部分(ADRC的公式以及參數整定)再講。
總之,這里的跟蹤-微分器是為了解決1、2兩個問題:安排過渡過程以及提供微分信號。
注意:其實第二個問題在ADRC里被拆成兩部分了,由誤差提取誤差微分包括了兩部分:指令的微分和輸出量的微分(因為誤差等于指令減去輸出量)。指令的微分是由跟蹤-微分器搞定的,而輸出量的微分是由后面的擴張狀態觀測器搞定的。
3. 加權和的策略不一定最好——非線性反饋
傳統的線性反饋方式(就是誤差直接乘上一個增益)在收斂速度以及抗擾動能力上存在不足。
ADRC的方案是 用非線性函數代替傳統的增益(用非線性反饋代替線性反饋)。
這里也可以舉個例子,比較兩個系統,分別使用線性反饋和非線性反饋:(1) x ˙ = ? K x \dot{x}=-Kx x˙=?Kx
以及 (2) x ˙ = ? K ? s i g n ( x ) ? ∣ x ∣ α ( α < 1 ) \dot{x}=-K*sign(x)*|x|^\alpha(\alpha<1) x˙=?K?sign(x)?∣x∣α(α<1)
假設 x 0 ≠ 0 x_0≠0 x0??=0,則可以證明系統(2)能在有限時間內收斂到0,而系統(1)是指數收斂的,意思是永遠收斂不到0。
這里也給一個仿真例子:
圖6 使用線性反饋👆
圖7 使用非線性反饋👆
初始值為1時,仿真結果:
圖8 使用線性反饋和非線性反饋仿真對比👆
可以看到非線性反饋更快地收斂到0了,不過需要注意的是非線性反饋相對于線性反饋的快速性的優勢只在 x < 1 x<1 x<1的時候才有,而且在靠近 x = 0 x=0 x=0的附近容易引起顫振。
4. 積分反饋的副作用——擴張狀態觀測器
積分的主要作用之一就是消除擾動(可以認為它是簡單的擾動觀測器),但是積分起作用比較慢,而且還會引起超調。
所以ADRC直接把積分舍棄了,使用擴張狀態觀測器來觀測總擾動,將系統補償成純積分鏈(不知道這個學名是啥)的形式。這樣控起來就容易多了,可以說,擴張狀態觀測器是ADRC的靈魂和精髓所在,在它面前,前面幾個都是次要的。
用一個例子說明一下上面所說的幾點:
假設某系統 x ˙ = u + w \dot{x}=u+w x˙=u+w,其中 x x x為狀態量(也是被控量), u u u為控制量, w w w為未知的總擾動(包括模型偏差或者外部擾動等等)。
比較兩種情況,一種是 w w w沒有被補償,在線性反饋的基礎上加上積分反饋去抵消,以達到無靜差的目的。另一種是把 w w w補償掉,只剩一個積分環節,采用普通的線性反饋。
第一種情況: u = ? K P ? x ? K I ? ∫ x d τ u=-K_P*x-K_I*\int{x}d\tau u=?KP??x?KI??∫xdτ
圖9 采用PI控制的方式👆
w = 0.2 , x 0 = 1 w=0.2,x_0=1 w=0.2,x0?=1,取 K P = 2 K_P=2 KP?=2
先看一下沒有積分反饋(也就是 K I = 0 K_I=0 KI?=0)時 x x x最后能控成什么樣子
得到的 x x x 的仿真結果為:
圖10 無積分反饋時,最后 $x$ 無法回到0,有靜差👆
接著給出有積分反饋(如上上圖,也就是 K I = 0.8 K_I=0.8 KI?=0.8)時 x x x最后能控成什么樣子
得到的 x x x 的仿真結果為:
圖11 有積分反饋時,雖然收斂過程坎坷了點,但最后無靜差👆
再看一下 K I ? ∫ x d τ K_I*\int{x}d\tau KI??∫xdτ與 w w w的對比情況
圖12 積分器對擾動的觀測效果👆
這里說的是積分器對擾動的觀測效果,其實應該是補償效果。可以看到積分環節產生的超調現象比較明顯,并且如果積分增益取大了則超調就大,如果取的小則收斂就慢,沒轍。
第二種情況我們把擾動去掉(假設被觀測出來然后補償掉了),只用一個 K P K_P KP?來控,那么結果的就很容易想到了:閉環之后這是一個單純的慣性環節,沒有超調,收斂的快慢只和增益有關,增益越大,收斂越快。
和前面的圖6一樣:
圖13 補償之后的一階系統👆
對于一階系統來說,就是把模型補償成一個積分環節( n n n階系統補償之后就是 n n n個積分串在一起)。
x x x 的仿真結果:
圖14 (假設)補償之后的控制效果👆
通過對比可以發現,還是把擾動補償掉更好。
利用擴張狀態觀測器,ADRC理論上可以把一個任意階的系統補償成任意階的積分鏈,然后就可以用簡單的線性控制方法去實現控制了,而且也能得到較好的控制效果。所以說擴張狀態觀測器是ADRC的精髓,把前面的跟蹤微分器換成一個別的什么的線性濾波器沒問題,把非線性反饋換回線性反饋沒問題,但是這個觀測擾動并補償的思想不能丟。
ADRC的公式以及參數整定
前面一直是一些簡單的例子解釋說明ADRC的各個組成部分,只是對概念的理解。接下來要給出ADRC的公式以及我對其參數的理解,理解參數的含義能夠大大提升參數整定的能力。
下次再寫。
一、跟蹤微分器(TD)
二、非線性反饋函數
三、擴張狀態觀測器(ESO)
ADRC應用到二階導彈模型
這部分的餅也先畫上,其實模型和腳本我都已經弄好了。
matlab腳本
simulink模型
結語
發現這個ADRC還真挺好用的,而且里面的一些思想其實和一些非線性控制都是相通的。
比如指令濾波和指令微分器,這個在反步法里也是標配的,不過反步法里的指令微分直接拿來做前饋補償的,不是用來計算誤差微分的。
再比如非線性反饋,這是(終端)滑模控制里的嘛,不過滑模控制證明穩定性更容易一些。
最后是這個擴張狀態觀測器,本來是在龍伯格觀測器基礎上擴張了一個誤差狀態,然后把里面的線性項換成了非線性項,使其收斂更加快速,但是改造完之后這個ESO就跟高階滑模觀測器很像了。
總結
以上是生活随笔為你收集整理的初步认识ADRC(自抗扰控制)与应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 迅雷打不开php文件怎么办
- 下一篇: 苹果iPhone 7手机怎么设置手势解锁