深入淺出PID演算法

劼哥stone 發表於 2022-05-10
演算法

前言

博主是工業網際網路行碼農一枚,雖然不是演算法工程師和自動化方向的,但經常參加同事介紹控制演算法原理的培訓,慢慢的對小部分控制演算法有一定了解,其中使用頻率最高的控制演算法非PID莫屬。很多同學在學習PID的時候,會被繁雜的數學公式嚇倒,今天我們就拋開數學公式,用邏輯和例子給大家講明白“到底什麼是PID”?

PID演算法簡介

PID是一種控制演算法,是 Proportional(比例)、Integral(積分)、Differential(微分)的縮寫。它是連續系統中技術最為成熟、應用最為廣泛的一種控制演算法。

PID控制器主要適用於基本上線性,且動態特性不隨時間變化的系統。簡單來說就是:類似於需要將某一個物理量“保持穩定”的場合,PID基本都能派上用場。

工業中PID典型的應用場景有:溫度控制、流量控制、液位控制等。

image.png

生活中PID的應用也很常見:自來水的壓力控制、空調的溫度控制、平衡車的平衡控制、汽車的定速巡航控制、無人機的懸停控制、火箭飛機的姿態調整等。

image.png

實際執行經驗和理論分析都表明,運用PID控制演算法對許多工業過程進行控制都能得到比較滿意的效果。

PID的概念及公式

PID的基本思路是根據偏差量的大小,運用比例、積分、微分計算出一個控制量,將這個控制量輸入被控制的系統,系統接收到該輸入量後會輸出一個相應的輸出量,PID控制器再檢測該輸出量,並再計算偏差,然後再迴圈以上過程。
image.png
原始公式如下:
$u(t)=K_p \Bigg( e(t)+\frac{1}{T_i}\int^t_0e(t)dt+T_d\frac{de(t)}{dt}\Bigg)$

  • $K_p$ —— 控制器的比例係數;
  • $T_i$ —— 積分時間常數;
  • $T_d$ —— 微分時間常數;
  • $u(t)$ —— PID控制器的輸出訊號;
  • $e(t)$ —— 給定值$r(t)$與測量值之差。

公式可簡化為:
$u(t)=K_p * e(t) + K_i * \sum_{n=0}^t e(t) + K_d * (e(t) - e(t-1))$

  • $K_p$ —— 控制器的比例係數;
  • $K_i$ —— 控制器的積分系數;
  • $K_d$ —— 控制器的微分系數;
  • $u(t)$ —— PID控制器的輸出訊號;
  • $e(t)$ —— 給定值$r(t)$與測量值之差。
  • $e(t-1)$ —— 上一次給定值$r(t)$與測量值之差。

很多同學可能會被上面數學公式整懵了,沒關係,我們先看完下面例子,再回頭看來公式,相信你能對以上公式有新的認識。

在學習PID之前,我們需要先了解什麼是 開環控制閉環控制,這2個概念能夠幫助我們更好的理解PID。

開放回路控制系統

開環控制(Open Loop Control System):不將控制的結果反饋回來影響當前控制的系統。例如:

  • 開關——按下開關後的一瞬間,控制活動已經結束,燈是否亮起已對按開關的這個活動沒有影響;
  • 投籃——籃球出手後就無法再繼續對其控制,無論球進與否,球出手的一瞬間控制活動即結束。

閉環迴路控制系統

閉環控制(Closed Loop Control System):需要將控制的結果反饋回來與希望值比較,並根據它們的誤差調整控制作用的系統。例如:

  • 調節水龍頭——首先在頭腦中對水流有一個期望的流量,水龍頭開啟後由眼睛觀察現有的流量大小與期望值進行比較,並不斷的用手進行調節形成一個反饋閉環控制;
  • 騎自行車——同理,需要不斷的修正行進的方向與速度形成閉環控制。

閉環控制系統通常會由以下6個環節組成。
image.png


我們拿“維持水缸水位高度在1米”為例,來詳解閉環控制中的每個環節:

  • 感測器:人工測量當前水位高度
  • 目標量:維持水缸水位高度在1米
  • 偏差量目標量 - 當前水位高度
  • 控制器:根據偏差量計算出執行量
  • 執行量:傳給執行器的入參
  • 執行器:人工用水桶向水缸中加水

其中感測器目標量偏差量執行量執行器 這5個環節都比較簡單,一眼就能看明白意思。最關鍵的環節控制器相對複雜一些,在控制器環節選擇不同的控制演算法,根據偏差量計算出執行量也不同,今天我們就具體看看PID的控制效果。

PID之比例P

前面有說到PID的基本思路是根據偏差量的大小,運用比例P積分I微分D計算出一個控制量。但PID的3個引數,並不是非要一起使用,可以單用比例P來控制,也可以兩兩聯合用比例P+積分I比例P+微分D來控制。

我們先看看僅用比例P能帶來什麼樣的控制效果?繼續上面的“水缸”例子:

  • 感測器:人工測量水缸初始水位高度是0.2米
  • 目標量:維持水缸水位高度在1米
  • 偏差量:1米 - 0.2米 = 0.8米
  • 控制器:使用PID演算法的比例控制,根據偏差量計算出執行量
  • 執行量:傳給執行器的入參
  • 執行器:人工用水桶向水缸中加水

通常情況偏差量執行量之間的單位不同,在當前例子裡偏差量的單位是水缸,而執行量的單位是水桶,他們的容積不一樣,所以我們需要一個係數,來放大或者縮小兩者的關係。具體公式可抽象為:

執行量 = 比例P = 偏差量 * 比例P係數

這個時候,假設水缸旁邊站著一個人,用水桶往水缸里加水來控制水位的高度。如果單純的用比例控制演算法,假設比例P係數是0.5(相當於兩桶水的容量等於一缸水的容量),我們開始模擬加水實驗:
image.png
如上圖結果所示,人工用水桶向水缸中加水8次,就能把水缸水位加到1米高度。把當前水位轉換成曲線,大概效果如下。
深入淺出PID演算法

上述例子比較簡單,單靠比例P就能完成任務,但現實情況往往只有比例P是不夠的,我們再來看一個更復雜的情況,假設比例P係數仍然是0.5,但在每次加水的間隔,水缸都會漏掉0.1米高度的水。我們再從頭模擬加水實驗,看看具體結果會怎樣?
image.png


如上圖結果所示,當水位達到0.8之後,水位就不會繼續增加了。因為,當水位等於0.8時,偏差量是0.2,每次往水缸中加水的量為執行量= 比例P= 0.2 * 0.5 = 0.1,而每次加水的間隔,水缸都會漏掉0.1米高度的水,所以加入的水和流出的水相抵消。

雖然,此時控制系統已達穩定狀態,但實際值目標量之間的會存在一個穩定差值,這個差值叫穩態誤差穩態誤差非常常見,比如:控制空調溫度會因為空氣溫差而降溫、控制無人機固定高度會受重力影響往下掉、控制汽車定速巡航會有空氣阻力和摩擦力的影響而減速,這些場景都會產生穩態誤差

單單隻用比例P控制閉環迴路,是無法避免穩態誤差問題的,因為比例P係數無法根據時間或次數累加,當存在外界干擾因素時,比例P係數無法動態調整大小,那麼穩態誤差就會一直存在。

假如我們引入時間的維度,就能獲得2個神器 增幅器-積分I抑制器-微分D,他們分別解決比例P過小和過大的情況,比例P過小的話由增幅器-積分I 補充即可解決穩態誤差問題,比例P過大由抑制器-微分D消減來防止過度震盪。

PID之積分I(增幅器)

我們先來看看增幅器積分I,它也可以理解為累加經驗,當比例P過小,可以由積分I補充,它的原理是利用過去的時間不斷累加。具體公式可抽象為:

比例P = 偏差量 * 比例P係數
積分I = 上一次積分I + 偏差量 * 積分I係數
執行量 = 比例P + 積分I

想象一下,如果用只比例P控制存在穩態誤差,說明比例P過小,這時積分I就會不斷累加到一個很大的值,來補充比例P,從而影響執行量

如果最終控制效果在目標量附近抖動,我們就能得到一個正負交替的偏差量,會在目標附近不斷產生正負數累加到積分I積分I就會不斷趨近於零,最終使控制效果趨於穩定。

我們繼續用上面“水缸加水”的例子,假設目標量是1,每次漏水0.1,比例P係數為0.5,積分I係數為0.2,我們再從頭模擬加水實驗,具體數值如下。
image.png
把當前水位轉換成曲線,大概效果如下。
image.png
上一輪實驗只用比例P控制存在穩態誤差。本輪實驗加入了積分I之後就有了累加效果,在未達到控制效果之前積分I會持續累加,在達到目標量之後積分I因為慣性會繼續過量控制 ,同時偏差量會由正轉負再轉正,積分I也會由正轉負再轉正,最終積分I會持續抵消掉每次漏水0.1,控制效果趨於穩定 。

增幅器有他的危險性,如果系統出現意外或錯誤,增幅器可能會被累加到無限大,導致系統不可用,所以增幅器需要有一定的限制。

  • 1、限制幅度,在任意時刻都給積分I設定最大值和最小值。
  • 2、不執行時清零,當系統判斷沒有執行時,主動將積分I清零。

PID之微分D(抑制器)

我繼續再看看抑制器微分D,它也可以理解為預測未來,用當前的偏差量上一次偏差量,得到的結果就可能是下一次偏差量,用下一次偏差量提前參與到計算中,就可以防止執行量過大,產生超出目標量的問題。具體公式可抽象為:

比例P = 偏差量 * 比例P係數
積分I = 上一次積分I + 偏差量 * 積分I係數
微分D = (偏差量 - 上一次偏差量) * 微分D係數
執行量 = 比例P + 積分I + 微分D

換個“汽車剎車”的例子,平穩駕駛的車輛,當發現前面有紅燈時,為了使得行車平穩,基本上提前幾十米就鬆油門踩剎車。當車輛離停車線非常近的時候,則使勁踩剎車使車輛停下來,整個過程可以看做一個加入微分D的控制策略。

可以看到,在剎車過程中,因為偏差量是越來越小的,所以 微分D= (偏差量-上一次偏差量)*微分D係數一定是負數,在控制中加入一個負數項,他存在的作用就是為了防止汽車由於剎車不及時而闖過停車線。

從常識上理解,越靠近停車線,就越應該踩深剎車,不能讓車過線,所以這個 微分D的作用,可以理解為剎車。當車離停車線很近,並且車速還很快時,這個 微分D的絕對值(實際上是一個負數)就會很大,表示應該大力踩剎車儘快讓車停下來。

再回到上面“水缸加水”的例子,當發現水缸裡的水快要接近目標量時,加入 微分D可以減少過量加水的幅度,說白了就是減少控制過程中的震盪。假設目標量是1,每次漏水0.1,比例P係數為0.5,積分I係數為0.2,微分D係數為0.2,我們再從頭模擬加水實驗,具體數值如下。
image.png
上一輪實驗使用比例P積分I聯合控制,最高水位達到1.3,超過目標量之後,水位最低迴落至0.83。本輪實驗加入了抑制器微分D之後,最高水位僅達到1.23,超過目標量之後,水位最低迴落至0.88,相比上一輪實驗,本輪震盪幅度明顯減小,這就是微分D的抑制作用。

分享一個動圖,很好的展示了比例P積分I微分D的控制效果,其中紅色虛線是目標量,曲線是用當前值的變化趨勢。結合這個動圖,大家再回想一下“水缸加水”的例子,控制效果是不是很相似呀~
深入淺出PID演算法

PID原理總結

我們用了“水缸加水”的例子,詳細解釋了PID的比例P積分I微分D三個引數的控制原理,相信小夥伴們已經明白什麼是PID了。大家再回過頭看這個公式,是不是也覺得挺親切的。
$u(t)=K_p * e(t) + K_i * \sum_{n=0}^t e(t) + K_d * (e(t) - e(t-1))$

  • $K_p$ —— 控制器的比例係數;
  • $K_i$ —— 控制器的積分系數;
  • $K_d$ —— 控制器的微分系數;
  • $u(t)$ —— PID控制器的輸出訊號;
  • $e(t)$ —— 給定值$r(t)$與測量值之差(偏差量);
  • $e(t-1)$ —— 上一次給定值$r(t)$與測量值之差。

最後再總結一下:

  • 比例P積分I微分D都跟偏差量有關
  • 比例P取決於當前的偏差量
  • 積分I累計過去所有偏差量之和
  • 微分D預測下一時刻偏差量

所以,經常有人說比例P是現在,積分I是過去,微分D是未來,是不是有一種哲學的感覺,哈哈~

PID調參口訣

最後分享個PID調參口訣,寫得挺好還挺押韻的~

引數整定找最佳,從小到大順序查;
先是比例後積分,最後再把微分加;
曲線振盪很頻繁,比例度盤要放大;
曲線漂浮繞大灣,比例度盤往小扳;
曲線偏離回覆慢,積分時間往下降;
曲線波動週期長,積分時間再加長;
曲線振盪頻率快,先把微分降下來;
動差大來波動慢。微分時間應加長;
理想曲線兩個波,前高後低4比1;
一看二調多分析,調節質量不會低;
若要反應增快,增大P減小I;
若要反應減慢,減小P增大I;
如果比例太大,會引起系統振盪;
如果積分太大,會引起系統遲鈍。

參考引用

如有任何問題或建議,歡迎前往公眾號【劼哥舍】留言~