天天看點

PID系數詳解

在PID控制中,比例時間常數和比例系數、積分時間常數和積分系數、微分時間常數和微分系數概念區分?

本質上是一回事。叫做時間是考慮了系統的量綱。

因為pid輸出的控制信号應該和被控量或參考信号有同樣的實體機關。因為在實體系統中他們是描述的同一種實體量。為了友善讨論,假設被控量是位移,機關是m, 時間機關是s

比例

Kp×e裡面誤差信号e的機關和被控量是一樣的,機關是m。比例系數的機關是1。

微分

微分項Kd×de/dt, 注意這裡出現了1/dt,那麼de/dt的機關應該是m/s,如果最終結果的機關還是m,那麼Kd應該是有機關的量,機關是s。是以從機關上看Kd的實體意義是一個時間,或者說是一個無量綱的放大系數乘上了一個機關時間。是以微分系數又叫微分時間。

積分

我們寫成離散形式可以看得更清楚: I = I + Ki ×e ×dt, 這裡乘了一個dt, 是以第二項乘積分系數之前的機關是m*s,為了是最終機關是m,Ki必須有機關1/s。為了避免這個意義不清的機關我們可以整理成倒數形式 I + 1/Ti× e × dt,這裡的Ti就是積分時間,機關是s,等于積分系數的倒數。

PID控制算法原理(抛棄公式,從本質上真正了解PID控制)

PID控制應該算是應用非常廣泛的控制算法了。小到控制一個元件的溫度,大到控制無人機 的飛行姿态和飛行速度等等,都可以使用PID控制。這裡我們從原理上來了解PID控制。

PID(proportion integration differentiation)其實就是指比例,積分,微分控制 。先把圖檔和公式擺出來,看不懂沒關系。(

一開始看這個算法,公式能看懂,具體怎麼用怎麼寫代碼也知道,但是就是不知道原理,不知道為什麼要用比例,微分,積分這3個項才能實作最好的控制,用其中兩個為什麼不行,用了3個項能好在哪裡,每一個項各有什麼作用

PID系數詳解
PID系數詳解

總的來說,當得到系統的輸出後,将輸出經過比例,積分,微分3種運算方式,疊加到輸入中,進而控制系統的行為,下面用一個簡單的執行個體來說明。

比例控制算法

我們先說PID中最簡單的比例控制,抛開其他兩個不談。還是用一個經典的例子吧。假設我有一個水缸,最終的控制目的是要保證水缸裡的水位永遠的維持在1米的高度。假設初始時刻,水缸裡的水位是0.2米,那麼目前時刻的水位和目标水位之間是存在一個誤差的error,且error為0.8.這個時候,假設旁邊站着一個人,這個人通過往缸裡加水的方式來控制水位。如果單純的用比例控制算法,就是指加入的水量u和誤差error是成正比的。即

u=kp*error

假設kp取0.5,

那麼t=1時(表示第1次加水,也就是第一次對系統施加控制),那麼u=0.5*0.8=0.4,是以這一次加入的水量會使水位在0.2的基礎上上升0.4,達到0.6.

接着,t=2時刻(第2次施加控制),目前水位是0.6,是以error是0.4。u=0.5*0.4=0.2,會使水位再次上升0.2,達到0.8.

如此這麼循環下去,就是比例控制算法的運作方法。

可以看到,最終水位會達到我們需要的1米。

但是,單單的比例控制存在着一些不足,其中一點就是 –穩态誤差 !(我也是看了很多,并且想了好久才想通什麼是穩态誤差以及為什麼有穩态誤差)。

像上述的例子,根據kp取值不同,系統最後都會達到1米,隻不過kp大了到達的快,kp小了到達的慢一些。不會有穩态誤差。但是,考慮另外一種情況,假設這個水缸在加水的過程中,存在漏水的情況,假設每次加水的過程,都會漏掉0.1米高度的水。仍然假設kp取0.5,那麼會存在着某種情況,假設經過幾次加水,水缸中的水位到0.8時,水位将不會再變換!!!因為,水位為0.8,則誤差error=0.2. 是以每次往水缸中加水的量為u=0.5*0.2=0.1.同時,每次加水,缸裡又會流出去0.1米的水!!!加入的水和流出的水相抵消,水位将不再變化!!

也就是說,我的目标是1米,但是最後系統達到0.8米的水位就不再變化了,且系統已經達到穩定。由此産生的誤差就是穩态誤差了。

(在實際情況中,這種類似水缸漏水的情況往往更加常見,比如控制汽車運動,摩擦阻力就相當于是“漏水”,控制機械臂、無人機的飛行,各類阻力和消耗都可以了解為本例中的“漏水”)

是以,單獨的比例控制,在很多時候并不能滿足要求。

積分控制算法

還是用上面的例子,如果僅僅用比例,可以發現存在暫态誤差 ,最後的水位就卡在0.8了。于是,在控制中,我們再引入一個分量,該分量和誤差的積分是正比關系。是以,比例+積分控制算法為:

u=kp*error+ ki∗∫ error

還是用上面的例子來說明,第一次的誤差error是0.8,第二次的誤差是0.4,至此,誤差的積分(離散情況下積分其實就是做累加),∫error=0.8+0.4=1.2. 這個時候的控制量,除了比例的那一部分,還有一部分就是一個系數ki乘以這個積分項。由于這個積分項會将前面若幹次的誤差進行累計,是以可以很好的消除穩态誤差(假設在僅有比例項的情況下,系統卡在穩态誤差了,即上例中的0.8,由于加入了積分項的存在,會讓輸入增大,進而使得水缸的水位可以大于0.8,漸漸到達目标的1.0.)這就是積分項的作用。

微分控制算法

換一個另外的例子,考慮刹車情況。平穩的駕駛車輛,當發現前面有紅燈時,為了使得行車平穩,基本上提前幾十米就放松油門并踩刹車了。當車輛離停車線非常近的時候,則使勁踩刹車,使車輛停下來。整個過程可以看做一個加入微分的控制政策。

微分,說白了在離散情況下,就是error的內插補點,就是t時刻和t-1時刻error的差,即u=kd*(error(t)-error(t-1)),其中的kd是一個系數項。可以看到,在刹車過程中,因為error是越來越小的,是以這個微分控制項一定是負數,在控制中加入一個負數項,他存在的作用就是為了防止汽車由于刹車不及時而闖過了線。從常識上可以了解,越是靠近停車線,越是應該注意踩刹車,不能讓車過線,是以這個微分項的作用,就可以了解為刹車,當車離停車線很近并且車速還很快時,這個微分項的絕對值 (實際上是一個負數)就會很大,進而表示應該用力踩刹車才能讓車停下來。

切換到上面給水缸加水的例子,就是當發現水缸裡的水快要接近1的時候,加入微分項,可以防止給水缸裡的水加到超過1米的高度,說白了就是減少控制過程中的震蕩。

現在在回頭看這個公式,就很清楚了

PID系數詳解

括号内第一項是比例項,第二項是積分項,第三項是微分項,前面僅僅是一個系數。很多情況下,僅僅需要在離散的時候使用,則控制可以化為

PID系數詳解

每一項前面都有系數,這些系數都是需要實驗中去嘗試然後确定的,為了友善起見,将這些系數進行統一:

PID系數詳解

這樣看就清晰很多了,且比例,微分,積分每個項前面都有一個系數,且離散化的公式,很适合程式設計實作。

講到這裡,PID的原理和方法就說完了,剩下的就是實踐了。在真正的工程實踐中,最難的是如果确定三個項的系數,這就需要大量的實驗以及經驗來決定了。通過不斷的嘗試和正确的思考,就能選取合适的系數,實作優良的控制器。

文章釋出到現在,發現評論中有些很有價值的資訊,是以在此将評論中的精彩内容也做一個總結,友善大家進一步學習和交流。大家對于文章有任何的意見或建議,以及關于相關内容的讨論和感想,都可以發到評論裡與大家一起交流,共同進步。

那為啥不加入更進一步的,微分的微分或者微分的微分的微分呢。如果有其他因素,該如何使用PID呢

作者回複:

我覺這個問題問的非常好,是以我自己先回答一下我的看法。PID這個算法呢,你說它有嚴格的數學證明嗎,貌似也沒有,說它不嚴謹吧,但是某些情況下确實有挺管用的。在使用的過程中,各個分量的各個參數基本上都需要通過實驗試出來的。某些情況下僅僅隻有P或者隻有PD,效果就達到要求了,是以也就不需要再考慮其他的了。PID三種分量的結合使用,加上大量的實驗來确定合适的參數,基本上就能滿足我們的需求了。

一般來說微分環節相當于放大了回報信号中的高頻分量,如果取得系數不好會引起高頻震蕩。是以大部分應用都隻采用PI(不影響穩态精度)或者雙閉環PI。至于微分的微分等一些量在實體上并沒有實際意義,比如調速中轉速的微分是加速度,再次微分就基本不用了。當然如果學過自控理論則可以從系統傳遞函數來分析需要加入什麼樣的控制器來保持系統穩定收斂。

好問題,一般情況pi或者pd就能搞定,本來加i就會讓系統不穩定,如果外加i或者d系統的穩定性有可能會進一步受影響,具體原因得看博德圖解釋。不過這種控制器确實有,不過不會直接加,一般配合加一個極點或者一個零點。

我喜歡這樣了解pid: p是控制現在,i是糾正曾經,d是管控未來!隻有不忘過往,把握目前,規劃未來才能讓人生的軌迹按照既定的目标前進。講真,了解了彈性阻尼系統,對pid的内涵會更加深刻。

繼續閱讀