模糊PID演算法

2021-10-01 14:06:16 字數 3573 閱讀 3689

在講解模糊pid前,我們先要了解pid控制器的原理(本文主要介紹模糊pid的運用,對pid控制器的原理不做詳細介紹)。pid控制器(比例-積分-微分控制器)是乙個在工業控制應用中常見的反饋迴路部件,由比例單元p、積分單元i和微分單元d組成。pid控制的基礎是比例控制;積分控制可消除穩態誤差,但可能增加超調;微分控制可加快大慣性系統響應速度以及減弱超調趨勢。

1.1傳統pid控制

傳統pid控制器自出現以來,憑藉其結構簡單、穩定性好、工作可靠、調整方便等優點成為工業控制主要技術。當被控物件的結構和引數具有一定的不確定性,無法對其建立精確的模型時,採用pid控制技術尤為方便。pid控制原理簡單、易於實現,但是其引數整定異常麻煩。對於小車的速度控制系統而言,由於其為時變非線性系統不同時刻需要選用不同的pid引數,採用傳統的pid控制器,很難使整個執行過程具有較好的執行效果。

1.2模糊pid控制

模糊pid控制,即利用模糊邏輯並根據一定的模糊規則對pid的引數進行實時的優化,以克服傳統pid引數無法實時調整pid引數的缺點。模糊pid控制包括模糊化,確定模糊規則,解模糊等組成部分。小車通過感測器採集賽道資訊,確定當前距賽道中線的偏差e以及當前偏差和上次偏差的變化ec,根據給定的模糊規則進行模糊推理,最後對模糊引數進行解模糊,輸出pid控制引數。

2.1模糊化

模糊控制器主要由三個模組組成:模糊化,模糊推理,清晰化。具體如下圖所示。而我們將一步步講解如何將模糊pid演算法運用到智慧型車上。(最好用筆一步步自己寫一遍!!!)

首先我們的智慧型車會採集到賽道的相關資料,例如攝像頭車,其採集到的資料經過演算法處理之後會得到與中線的偏差e,以及當前偏差和上次偏差的變化(差值)ec兩個值(即此演算法為2維輸入,同理也可以是1維和3維,但2維更適合智慧型車)。例如此時車偏離中線的距離為150,而上一時刻偏離中線的距離為120,則e為150,ec為150 - 120 = 30。

其次我們要對這兩個值進行模糊化。這裡我們對e進行舉例。攝像頭車採集回來的e是有範圍的,即與中線的偏差是在乙個區間內可行的。在這裡我們假設該區間為-240到240,即小車偏離中線的最大距離為240,正負即為左右。再假設中線偏差變化率的可行區間為-40到+40。

接著我們要對這兩個值進行模糊化。我現在將e的區間(-240 到 240)分成8個部分,那麼他們分別為-240 ~ -180,-180 ~ -120 ,-120 ~ -60,-60 ~ 0,0 ~ 60,60 ~ 120,120 ~ 180,180 ~ 240。然後我們把-180,-120,-60,0,60,120,180分別用nb,nm,ns,zo,ps,pm,pb表示(個人理解n為negative,p為positive,b為big,m為middle,s為small,zo為zero)。例如,當e = 170時,此時的e屬於pm和pb之間,而此時的e也會對應2(或1)個隸屬度。e隸屬於pm(120)的百分比為(180 - 170) /  (180 - 120) = 1 / 6 ,而同理隸屬於pb(180)的百分比為(170 - 120) / (180 - 120) = 5 / 6  。意思就是120到180進行線性分割了,e離pm和pb哪個更近,則隸屬於哪個就更大(當輸出值e大於180(pb)時,則隸屬度為1,隸屬度值為pb,即e完全隸屬於pb,同理當e小於 - 180 (nb)時也一樣)。同理也可以對ec進行模糊化。

2.2 模糊推理

對於採集回來的e和ec,我們可以推出它們各所佔的隸屬度,此時我們可以根據模糊規則表去找出輸出值所對應的隸屬度。

我們假設為e的兩個隸屬度值為pm、pb,e屬於pm的隸屬度為a(a < 1),則屬於pb的隸屬度為(1 - a)。再假設ec的兩個隸屬度值為nb、nm,ec屬於nm的隸屬度為b,則屬於nb的隸屬度為(1 - b)。而在假設中,e屬於pm的隸屬度為a,ec屬於nb的隸屬度為( 1 - b ),則輸出值屬於zo的隸屬度為a *( 1 - b )(看圖)。

同理我們可以得出,當輸出值屬於zo的另外兩個隸屬度為a * b, ( 1 - a ) * ( 1 - b) ,而輸出值屬於ns的隸屬度為 ( 1 - a ) *  b。

在這裡我們先證明乙個條件,將這四個隸屬度加起來,剛好等於1。這是因為

(a + (1 - a)) * (b + (1 - b)) = a * b + ( 1 - a ) *  b  + a * ( 1 - b ) + ( 1 - a ) * ( 1 - b )   (下圖)

即乙個十字相乘的概念。這個等式說明輸出值的隸屬度之和等於1(第三步求解的時候需要用到隸屬度之和)。

因此,我們知道了輸出值為zo的隸屬度和為 a * b + a * ( 1 - b ) + ( 1 - a ) * ( 1 - b ) ,輸出值為ns的隸屬度為 ( 1 - a ) *  b 。

2.3 清晰化

對於輸出值,我們同樣採用給予隸屬度的辦法。例如,我們把輸出值假設為[1000,1400](即舵機的擺角值範圍)的區間同樣劃分為八個部分,即7個隸屬值nb,nm,ns,zo,ps,pm,pb。根據上一步所得出的結論,我們就可以用隸屬度乘以相應的隸屬值算出輸出值的解,即 (a * b + a * ( 1 - b ) + ( 1 - a ) * ( 1 - b ) ) * zo   +    ( 1 - a ) *  b * ns。到此為止,整個模糊過程就結束了。

3 模糊pid

我們已經知道了整個模糊的過程,但上述的過程還不夠完美。因為我們的輸出值只有乙個輸出,並沒有實現pid。因此我們可以先對e和ec進行模糊化,然後分別對kp和ki和kd(pid的三個引數)進行求解,再套入公式。

一般的我們也可以只用kp,kd,不用ki。而模糊規則表一般的**已經基本給出。因此帶入演算法之後我們的難度也只是在於調節kp,kd,和適當調節規則表。當然調節的難度會大於普通的pid,因為還要定kp,kd的輸出範圍,調得不好可能效果並沒有普通的pid好。

4. 部分解釋

4.1對於部分**所說的重心法解模糊,其實就是上述方法。公式如下。

式中μ(zi) * zi相當於文章上面的(a * b + a * ( 1 - b ) + ( 1 - a ) * ( 1 - b ) ) * zo   +    ( 1 - a ) *  b * ns,即隸屬度乘以隸屬度值之和,而μ(zi)之和就是輸出值的隸屬度之和,我們已經證明它是等於1的。

參考

[1] 

[2] 

模糊PID控制演算法

在pid控制演算法的c 語言實現中,文章已經對模糊pid的實質做了乙個簡要說明。基本概念和思路進行一下說明,相信有c 語言基礎的朋友可以通過這些介紹性的文字自行實現。這篇文章主要說明一下模糊演算法的含義和原理。實際上模糊演算法屬於智慧型演算法,智慧型演算法也可以叫非模型演算法,也就是說,當我們對於系...

模糊PID控制

在現實控制中,被控系統並非是線性時不變的,往往需要動態調整pid的引數,而模糊控制正好能夠滿足這一需求,所以在接下來的這一節我們將討論模糊pid控制器的相關問題。模糊pid控制器是將模糊演算法與pid控制引數的自整定相結合的一種控制演算法。可以說是模糊演算法在pid引數整定上的應用。模糊演算法是一種...

模糊pid的理解

本人所做的課題是控制相關,所以想將模糊演算法應用在pid引數的調節當中,我們知道模糊控制器的設計主要包括輸入模糊化 模糊規則的建立 模糊推理 逆模糊化四個部分,下面首先介紹輸入模糊化的過程 1.輸入模糊化 電機的輸入是乙個給定的速度,給到電機後肯定達不到理想的速度,所以就存在著誤差,誤差其實就是模糊...