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