PID控制算法是應用非常廣泛的一種控制算法,小到一個元器件的控制,大到飛機的曲線行駛、速度變化、無人機陣列等等都充斥著PID算法的身影。 PID(Proportion Integration Differentiation)其實是指比例、積分、微分控制,總的來說,當?shù)玫较到y(tǒng)的輸出后,將輸出經(jīng)過比例,積分,微分3種運算方式,疊加到輸入中,從而控制系統(tǒng)的行為。
下面我們舉一個很簡單的例子,用比例控制算法來使水缸里的水位始終維持在1米的高度,假設(shè)水位目前處在0.2米的位置,那么當前水位(0.2m)和目標水位(1m)之間是存在一個誤差(0.8m),這時,一個人通過往缸里加水來控制水位,用比例控制算法,就是指加入的水量u和誤差error是成正比的。即
假設(shè)kp取0.5,那么t=1時(第1次控制系統(tǒng)),那么
所以這一次加入的水量會使水位在0.2米的基礎(chǔ)上上升0.4米,達到0.6米。
接著,t=2時(第2次控制),當前水位是0.6米,所以error是0.4。
會使水位再次上升0.2米,達到0.8米,如此下去,就是比例控制的使用方法。在經(jīng)過幾次添加之后,水位最終會達到我們1米,但是,單純使用比例控制算法也會存在著一些不足,其中一點就是“穩(wěn)態(tài)誤差”!
什么是穩(wěn)態(tài)誤差呢?
上述例子中,根據(jù)kp取值不同,水位最終都會達到1米,kp取值越大則上升的越快,kp取值越小則上升的越慢,不存在穩(wěn)態(tài)誤差。但是,假設(shè)這個水缸每次加水都會漏掉0.1米高度的水這種情況下,假設(shè)kp仍然取0.5,那么經(jīng)過幾次加水,水缸中的水位到0.8時,誤差error=0.2. 每次往水缸中加水的量為u=0.5*0.2=0.1米,同時,缸里每加水0.1米,又會流出0.1米,也就是說,設(shè)定的目標值為1米,但是這種算法使系統(tǒng)水位在達到0.8米后就不再變化,由此產(chǎn)生的誤差就是穩(wěn)態(tài)誤差了。
因此,單純的比例控制,在很多時候是滿足不了使用場景的。
上述例子就能看出,如果單純的比例控制算法,會存在穩(wěn)態(tài)誤差,水位最終一直停在0.8米的位置上。于是,在控制中,我們再引入一個分量,該分量和誤差的積分是正比關(guān)系。所以,比例+積分控制算法為:
使用上述例子,第一次的誤差error是0.8,第二次的誤差是0.4,至此,誤差的積分(離散情況下積分其實就是做累加)
這個時候的控制量,除了比例的那一部分,還有一部分就是一個系數(shù)ki乘以這個積分項。由于這個積分項會將前面若干次的誤差進行累計,所以可以很好的消除穩(wěn)態(tài)誤差(假設(shè)在僅有比例項的情況下,系統(tǒng)卡在穩(wěn)態(tài)誤差了,即上例中的0.8,由于加入了積分項的存在,會讓輸入增大,從而使得水缸的水位可以大于0.8,漸漸到達目標的1.0)這就是積分項的作用。
一輛正常行駛的汽車,發(fā)現(xiàn)前方紅燈亮起,為了使汽車平穩(wěn)行駛,很遠就停止踩油門轉(zhuǎn)向剎車,距離停止線越近,剎車降速會越快,直到停下來。整個過程可以看做一個加入微分的控制策略。
微分,最直白的說法就是在離散情況下,就是error的差值,就是t時刻和t-1時刻error的差,即
式中的kd是一個系數(shù)項??梢钥刺帲谡麄€剎車過程中,error是越來越小的,因此微分控制項一定是負數(shù),加入一個負數(shù)項的作用就是為了防止汽車闖過了停止線。可從常識上理解為,距離停止線越近,剎車越明顯,不能讓車過線。所以這個微分項的作用,就可以理解為剎車,距停止線很近時并且車速快微分項絕對值會很大。
現(xiàn)在在回頭看這個公式,就很清楚了
括號內(nèi)第一項是比例項,第二項是積分項,第三項是微分項,前面僅僅是一個系數(shù)。很多情況下,僅僅需要在離散的時候使用,則控制可以化為
每一項前面都有系數(shù),這些系數(shù)都是需要實驗中去嘗試然后確定的,為了方便起見,將這些系數(shù)進行統(tǒng)一:
統(tǒng)一之后這些公式就變得清晰明了了,比例算法、微分算法、積分算法,每種算法都有個系數(shù),直接使用這個系數(shù)回簡化編程邏輯。