PID原理
PID控制算是應用非常廣泛的經典控制算法。但是怎麼理解PID這三個參數呢?在參考了別人的文章之後,我還是有點一知半解,這時候發現不自己動手算一算是很難理解PID了,但是我又不想做這種重複的計算,於是想到了通過Excel來舉個例子。
接下來,我們通過一個很簡單的例子來表示一個PID控制,並用Excel來計算PID帶來的好處等等。這個例子就是,我們要往桶裏倒水,並且我們的目標是把水位維持在1米高,初始水位爲0.5米,只能往桶裏一次一次的倒水。那麼我們開始我們的學習吧。
比例控制算法
對於比例控制算法,我們可以簡單的理解爲,每次倒入水前計算當前的誤差(error),然後給這個誤差乘以一個比例係數kp。那麼我們水位的改變量u與error之間的關係爲:u=kp*error。然後就不停的計算誤差,不停的往桶裏倒水。在這裏,通過excel表格計算可很直觀的看出來,誤差越來越小的,實際越來越接近1。
目標 | 1 | 1 | 1 | 1 | 1 |
實際(=上一次實際+kp*當前的error) | 0.5 | 0.5 | 0.75 | 0.875 | 0.9375 |
error(上一次的目標-上一次的實際) | 0.5 | 0.25 | 0.125 | 0.0625 | |
kp | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 |
我們的比例算法很好的完成了它的任務,隨着倒的次數越來越多,那麼我們實際也更加接近於我們的目標值。那麼我們爲什麼還需要使用到KI和KD呢?那麼我們接下來提出一個假設,假設桶在漏水,每次往桶裏倒水的同時,桶都會流失0.1米水高的水。因此每次的變化量爲u=kp*error-0.1,繼續用excel進行一次計算吧。
目標 | 1 | 1 | 1 | 1 | 1 | 多次後 | 1 |
實際(=上一次實際+kp*當前的error-0.1) | 0.5 | 0.4 | 0.55 | 0.675 | 0.7375 | 0.799939 | |
error(上一次的目標-上一次的實際) | 0.5 | 0.45 | 0.325 | 0.2625 | 0.200061 | ||
kp | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 |
可以看到,我們每次往桶裏加水之後,由於我們的桶漏水了,所以導致在多次倒水之後,我們的實際水高維持到0.8m附近,所以導致了一個穩態誤差,這意味着我們通過比例控制算法是永遠都不能實現到1米水高的願望。 (在實際情況中,這種類似水缸漏水的情況往往更加常見,比如控制汽車運動,摩擦阻力就相當於是“漏水”,控制機械臂、無人機的飛行,各類阻力和消耗都可以理解爲本例中的“漏水”)所以,單獨的比例控制,在很多時候並不能滿足要求。
積分控制算法
由於比例控制算法在實際應用過程中的侷限性很大,因此我們就需要想個辦法去消除這個穩態誤差,而如何去消除這個穩態誤差呢?我們可以想一個辦法,我們把每次計算出來的誤差累加起來,當如果遇到了穩態誤差,那我們這個數據就會越來越大,因此每次更新數據時,就可以把它添加上去,就能把穩態誤差解決啦。每次添加的水量的計算公式爲u=kp*error-0.1+ ki∗積分
目標 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
實際(=上一次實際+kp*當前的error-0.1+ki*積分) | 0.5 | 0.45 | 0.705 | 1.0145 | 1.19505 | 1.201345 | 1.097231 | 0.980245 | 0.917293 | 0.921104 | 0.964281 | 1.009124 | 1.031466 | 1.02824 | 1.011019 |
error(上一次的目標-上一次的實際) | 0.5 | 0.55 | 0.295 | -0.0145 | -0.19505 | -0.20135 | -0.09723 | 0.019755 | 0.082707 | 0.078896 | 0.035719 | -0.00912 | -0.03147 | -0.02824 | |
kp | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 |
ki | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 |
積分(=上一次的積分+本次的誤差) | 0 | 0.5 | 1.05 | 1.345 | 1.3305 | 1.13545 | 0.934105 | 0.836875 | 0.856629 | 0.939336 | 1.018232 | 1.053951 | 1.044828 | 1.013361 | 0.985121 |
這裏我們取了一段很長的數據來分析一下,可以看到我們的實際值在1m附近不斷的波動。我們的想法是,無限的趨進於1。但是看圖表中的第九次(標紅)和第十次(標紅),我們可以發現我們的誤差不是在縮小反而還更大了。那麼爲什麼會有這種問題呢?這個肯定不是kp*error的問題,因爲error非常小了。我們可以看到,由於積分維持在0.8左右,因此每次改變的量對於趨緊穩定後的數值來說,其變化量是很大的,因此其稍微改變一點,就會導致其誤差變大。
同時可以看到在初期,對於使用積分控制算法來說,其超過了我們的目標值(超調量),最大達到了1.2m,如果我們的桶只有1.1m高,那麼可能就會導致我們的水往外溢出來,這是我們不想看到的情況。如果在實際過程中,可能就因爲溫度過高或者電壓過高,發生不可逆的後果。
而且我們可以看到u=kp*error-0.1+ki∗積分。當error趨緊爲0時,那麼每次添加的u爲0。那麼ki∗積分≈0.1。因此積分趨進於1。
通過百度百科我們可以知道:
1.比例環節 即時成比例的反映控制系統的偏差信號,偏差一旦產生,控制器立即產生控制作用,以減少偏差。通常隨着值的加大,閉環系統的超調量加大,系統響應速度加快,但是當增加到一定程度,系統會變得不穩定。
2.積分環節 主要用於消除靜差,提高系統的無差度(型別)。 [1] 積分作用的強弱取決於積分常數,積分常數越大,積分作用越弱,反之越強。閉環系統的超調量越小,系統的響應速度變慢。
微分控制算法
引進了積分項之後,我們的控制模型雖然解決了穩態誤差,但是還是有問題。這個問題就是實際值在不斷的波動。同時它還有一個超調量的東西。這是我們不希望看到的,那麼我們該如何去解決這個問題呢?這裏就需要引進微分的概念了。其理解可以想象成在往桶裏加水時,我們可能能夠預感到其會超過我們想要的數值,然後在加水之前,把一部分水給倒掉,從而達到降低其超調量的作用。微分在這裏可以用相鄰的error的差值進行表示,因此微分可以表示爲:kd*(error(t)-error(t-1)),在這裏我們的u=kp*error-0.1+ ki∗積分+kd*(error(t)-error(t-1))。值得注意的是,由於誤差是越來越小的,因此其微分的值一般爲負值。
目標 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
實際(=上一次實際+kp*當前的error-0.1+ki*積分+kd*微分) | 0.5 | 0.45 | 0.71 | 0.993 | 1.1444 | 1.15302 | 1.084916 | 1.011683 | 0.971846 | 0.968102 | 0.983857 | 1.001148 | 1.010293 | 1.010578 | 1.006119 |
error(上一次的目標-上一次的實際) | 0.5 | 0.55 | 0.29 | 0.007 | -0.1444 | -0.15302 | -0.08492 | -0.01168 | 0.028154 | 0.031898 | 0.016143 | -0.00115 | -0.01029 | -0.01058 | |
kp | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 |
ki | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 |
kd | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 |
積分(=上一次的積分+本次的誤差) | 0 | 0.5 | 1.05 | 1.34 | 1.347 | 1.2026 | 1.04958 | 0.964664 | 0.952981 | 0.981135 | 1.013033 | 1.029176 | 1.028029 | 1.017735 | 1.007157 |
微分(=本次的誤差-上次的誤差) | 0.05 | -0.26 | -0.283 | -0.1514 | -0.00862 | 0.068104 | 0.073233 | 0.039837 | 0.003744 | -0.01575 | -0.01729 | -0.00915 | -0.00029 |
其最大值爲1.15,超調量得到了減小。至此,PID的每個過程的功能能夠簡單的理解到了。