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