pid算法概述
過程控制中有兩個重要的算法PID反饋算法,卡爾曼狀態(tài)估計算法。PID主要用來過程控制,卡爾曼濾波主要用來狀態(tài)估計,比如預(yù)測運動軌跡之類的。這一篇我們主要分享PID算法。
什么是pid算法呢?PID分別表示比例P,積分I,微分D。比例。積分,微分,計算的都是誤差或者目前的值和期望的值之間的差異,變化率,均值等。該算法主要用于過程控制。
學過信號與系統(tǒng)或者自動化控制的應(yīng)該都多多少少記得狀態(tài)方程,給一個系統(tǒng)加上輸入,然后得到輸出。輸出和輸入有明確的函數(shù)關(guān)系。y=f(x);這個函數(shù)的計算過程就是該系統(tǒng)的固有屬性。比如我們設(shè)計濾波器,根據(jù)運動規(guī)律得到一個彈簧滑塊的力學計算公式。給濾波器輸入會得到輸出,給彈簧滑塊彈簧一個力,彈簧滑塊會按照一定的規(guī)律運動。模擬濾波器的阻抗匹配電路連接規(guī)律決定了該濾波器的固有屬性。彈簧滑塊的質(zhì)量,彈性系數(shù),摩擦系數(shù)等決定了該力學系統(tǒng)的固有屬性。該固有屬性就是y=f(x);給一個輸入x會得到一個輸出y。可以看到拋開是具體的應(yīng)用場景是信號還是力學系統(tǒng),背后的數(shù)學模型是一樣的。
那么這個和PID有啥關(guān)系呢?要解釋這個我們先要解釋反饋。數(shù)學模型是理想的模型,但是實際的使用場景不會這么理想,我們設(shè)計的模擬濾波器,計算好了電阻,電容連接好了電路。但是電阻和電容都不是理想的器件,更何況外界包括電路本身還有電磁干擾。工廠生產(chǎn)的5歐姆的電阻不可能就沒有誤差就是5歐姆。隨著電路的使用發(fā)熱空氣濕度電阻的大小也會變化,同樣的電容也是。加上外界干擾情況就更加的復(fù)雜。同樣的力學系統(tǒng),我們也是理想情況,1千克的滑塊,不可能就完全是1千克,彈簧的彈性系數(shù)隨著使用也不是嚴格確定的值,摩擦系數(shù)也不會沒有誤差。所以就需要引入反饋系統(tǒng)。
1,舉例解釋pid算法
結(jié)合具體的使用場景, 學習過模電的應(yīng)該都多少有點印象,電路為了減少溫度漂移帶來的影響,引入了反饋,當輸入不夠或者過大的時候,通過反饋可以增加或減少輸入,作為補償。這樣的電路更加有穩(wěn)定性 。
那么PID和反饋有什么關(guān)系呢? 可以說PID算法就是一個基于反饋的算法 。通常用于過程控制。只不過PID通常的使用場景比剛才說的濾波器里面的反饋有一點不同,剛才的濾波器我們的阻抗匹配設(shè)計好了濾波器的參數(shù),也就是y=f(x)這個理想的數(shù)學模型已經(jīng)有了,反饋是為了提高系統(tǒng)的穩(wěn)定性。
但是通常情況下PID使用的場景是一個不確定的系統(tǒng)。比如我們期望將一杯水加熱到60度,并且一直維持在60度。這個時候電熱絲加熱就是該水杯系統(tǒng)的輸入,輸出就是溫度值。但是希望這杯水的溫度就是一直維持在60度,不能高不能低(當然有一定的誤差)。這個水杯就是一個系統(tǒng),我們給水杯加熱我們當然列不出來一個y=f(x)的一個狀態(tài)方程?;蛘吆茈y列出來。所以這個時候水杯對我們來說就是一個黑盒子。
如下圖
pid算法
圖中r(t)就是我們的目標溫度60度,y(t)是傳感器的測量溫度,x(t)是電熱絲的功率,e(t)=r(t)-y(t)。也就是目標溫度和當前實際溫度的差。
右側(cè)的水杯加熱部分就是一個黑盒子,我們并不知道他的狀態(tài)方程y=f(x);也就是水杯是我們需要控制的黑盒子
那么我們怎么做到水杯里面的水加熱到60度之后一直維持在一個很小的誤差范圍呢?我們肯定是通過不斷地調(diào)節(jié)電熱絲功率來實現(xiàn)的。當水的溫度低于60度了就加大功率,當溫度開始降低了,就降低功率。我們需要一個溫度計來不斷的測水的溫度,然后和我們的期望溫度60度做比較,進而決定控制電熱絲的功率。這不就是反饋嗎?
當溫度低于60度加大功率,當溫度高于60度降低功率。仔細思考一下這樣的控制對嗎?顯然不對,我們設(shè)想一下,剛開始一杯室溫下的水,溫度是25度,這個時候不到60度,還差32度,所以我們加大功率,但是很快水溫40度了,還差20度,我們還加大功率嗎?顯然不太合理。所以改進一下改為根據(jù)當前的水溫和目標60度的差值,來決定輸入的功率,設(shè)r(t)為我們的目標60度,y(t)是當前的測量溫度,那么r(t)-y(t)就是當前和目標的U差值,所以我們是不是可以讓功率受控于這個差值呢,x(t)=Kp(r(t)-y(t))+U常數(shù),這樣隨著溫度的升高我們的我們輸入的功率x(t)會越來越小,直到一個常熟U,之所以有該常數(shù)是因為,我們不可能當溫度到達60度的時候,就關(guān)閉了電熱絲,因為水杯一直在在散熱。所以有一個這樣的常數(shù),但是散熱功率不能明確的就是這個常數(shù)U,因為周圍哪怕來一股風,外界的環(huán)境是各種干擾的。所以就需要一會兒加大功率,一會兒減少功率。這個就是PID控制中的比例部分P??雌饋硭坪跏强梢钥刂疲菍嶋H會發(fā)現(xiàn)溫度在60度上下變化誤差很大。
所以也就是這樣的控制不夠精細化,誤差變化范圍很大。如果溫度是50多度,外界的散熱環(huán)境也在實時變化,因為溫度不夠60度,所以肯定還是需要加熱的,那么接近60度的時候功率還是挺大的,這樣溫度很快就超過60度了,可能會到65度,盡管我們降低功率了,但是熱量的傳輸有一個過程,電阻絲還在加熱。那么再想一下,還可以考慮哪些因素呢?我們思考一下為什么溫度會很快超過60,然后我們才發(fā)現(xiàn)。然后才考慮降低,這樣的控制,這個很快就是一個關(guān)鍵字。很快意味著速度,也就是溫度上升的速度,這個是什么這個就是微分呀。所以我們可以從兩個角度考慮既要考慮比例,又要考慮微分。比如剛開始一秒鐘溫度升高3度,后面一秒鐘溫度增加4度,然后是一秒鐘增加2度。這個是溫度增加的速度。所以當溫度增加的速度快,快到達目標溫度60的時候,我們是不是可以提前減速,這樣后面超過了60度也不會超過很多。所以我們的輸入改為x(t)=Kp(r(t)-y(t)+Kdy(t)’+U
這樣我們的控制精確一些了,誤差減少了。是不是還可以減少誤差呢?有了比例和微分,這樣我們的溫度一直在60度上下波動。我們還可以考慮哪些因素呢?又是注意關(guān)鍵詞語波動,在上下波動,也就是均值接近60,均值和什么相關(guān)呢,當然是積分。
令e(t)=r(t)-y(t),則整個PID的控制算法的公式可以改變?yōu)?/p>
所以最終的控制量就是x(t)=Kpe(t)+Kde(t)‘+Kie(t)積分+U
2,PID參數(shù)則確定
分析了PID的原理,那么公式中的Kp,Ki,Kd的確定通常是很麻煩的。首先不同的系統(tǒng)這個參數(shù)肯定不一樣。所以這幾個參數(shù)的大小肯定是受到原本系統(tǒng)的固有屬性的影響的,以水加熱來說,首先水的多少,是冬天還是夏天,周圍空氣的流動,水杯自身的導(dǎo)熱程度等這些屬性一定是間接的影響到這幾個參數(shù),正是因為系統(tǒng)的固有屬性不能確定所以我們無法或者很難數(shù)學建模列出來y=f(x)。所以我們才需要借助反饋。不斷地調(diào)整輸入,使輸出達到我們的期望。
通常的調(diào)節(jié)過程是先確定Kp的大概值,然后是Kd,再下來是Ki
以加熱為例,首先我們調(diào)節(jié)Kp,使溫度能快速的達到60度,但是肯定會過沖超過60度,為了能快速上升到60度,那么Kp就要調(diào)大一點,但是同樣帶來一個弊端就是溫度可能超過60度很高,比如到80度了,所以通常都會有指標參數(shù),比如最高溫度不能超過多少度,達到60的時間是多少之類的。根據(jù)這個我們會選擇一個比較合適的Kp。這個時候溫度會在60度上下波動,但是誤差很大,收斂很慢。
接著我們調(diào)節(jié)Kd,因為Kd是對溫度上升速度的反應(yīng)部分,結(jié)合Kd,能快速的降低誤差,Kd是對觀測量變化的體驗,所以通常一個系統(tǒng)如果觀測量變化很靈敏,很快,那么通常Kd就會很小。結(jié)合了Kp和Kd,這個時候系統(tǒng)的收斂速度能很快收斂,最高溫度也會降低。但是系統(tǒng)還是很長一段時間在60度上下波動。為了進一步控制,接下來就要調(diào)節(jié)Ki參數(shù)了
Ki就是對波動的反應(yīng)。能讓觀測量溫度快速穩(wěn)定在60度,同時誤差也會小。
三個參數(shù)的調(diào)節(jié)是獨立的,但是最后的輸出是一個總的,所以當Ki調(diào)節(jié)完了,反過來又要適當?shù)恼{(diào)節(jié)Kp,Kd,最終達到一個比較好的效果。
3,PID三個調(diào)節(jié)分量的優(yōu)缺點
Kp調(diào)節(jié)的是宏觀的,讓系統(tǒng)快速的達到期望目標,Kd是對速度的反饋調(diào)節(jié),能讓系統(tǒng)快速的收斂,Ki是對考慮歷史數(shù)據(jù),是一個均值的作用,能減少毛刺,讓系統(tǒng)基本穩(wěn)定后的波動小一些。
但是凡是都有弊端,Kp過大,盡管能讓系統(tǒng)快速達到期望值,但是同樣的會過多的超過期望值。所以需要Kd對速度變化部分提供反饋控制
Kd對當前的速度做出反應(yīng),所以可以讓觀測值快速收斂,但是毛刺還是很多。
因為Ki部分求的是均值,會讓系統(tǒng)很快穩(wěn)定,但是尤其是最開始的時候偏差很大,歷史的偏差會一直影響積分控制項,將這個殘差一直留著,所以通常可以在系統(tǒng)最開始的時候不適用Ki,當系統(tǒng)達到期望值之后,開始加入Ki部分,這樣能消除系統(tǒng)最早的最嚴重的偏差。得到更好的效果
我們還是以加熱絲給水杯加熱為例,我們在室內(nèi)調(diào)好了PID的三個參數(shù),然后我們拿到室外,或者開空調(diào)了,或者夏天調(diào)的參數(shù)在冬天使用,那么我們調(diào)的這幾個參數(shù)可能會因為外部環(huán)境的變化可能就很難達到很好的效果。調(diào)節(jié)的參數(shù)總是有一定適用范圍的,所以也是有方式自動調(diào)節(jié)PID參數(shù)的,做到PID參數(shù)的自適應(yīng)的。
買來的一臺大疆無人機,在空氣流動不大,溫度適宜的地方可以起飛,然后如果狂風大作,總不可能說大風的時候不能用了,需要重新調(diào)節(jié)參數(shù),肯定是有自適應(yīng)調(diào)節(jié)的。飛機剛開始感受到變化,比如突然大風開始刮起來了,這個時候飛機會短暫的不穩(wěn)定,然后快速的穩(wěn)定。
評論