前言
博主是工業網際網路行碼農一枚,雖然不是演算法工程師和自動化方向的,但經常參加同事介紹控制演算法原理的培訓,慢慢的對小部分控制演算法有一定了解,其中使用頻率最高的控制演算法非PID莫屬。很多同學在學習PID的時候,會被繁雜的數學公式嚇倒,今天我們就拋開數學公式,用邏輯和例子給大家講明白“到底什麼是PID”?
PID演算法簡介
PID是一種控制演算法,是 Proportional(比例)、Integral(積分)、Differential(微分)的縮寫。它是連續系統中技術最為成熟、應用最為廣泛的一種控制演算法。
PID控制器主要適用於基本上線性,且動態特性不隨時間變化的系統。簡單來說就是:類似於需要將某一個物理量“保持穩定”的場合,PID基本都能派上用場。
工業中PID典型的應用場景有:溫度控制、流量控制、液位控制等。
生活中PID的應用也很常見:自來水的壓力控制、空調的溫度控制、平衡車的平衡控制、汽車的定速巡航控制、無人機的懸停控制、火箭飛機的姿態調整等。
實際執行經驗和理論分析都表明,運用PID控制演算法對許多工業過程進行控制都能得到比較滿意的效果。
PID的概念及公式
PID的基本思路是根據偏差量的大小,運用比例、積分、微分計算出一個控制量,將這個控制量輸入被控制的系統,系統接收到該輸入量後會輸出一個相應的輸出量,PID控制器再檢測該輸出量,並再計算偏差,然後再迴圈以上過程。
原始公式如下:
$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個環節組成。
我們拿“維持水缸水位高度在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(相當於兩桶水的容量
等於一缸水的容量
),我們開始模擬加水實驗:
如上圖結果所示,人工用水桶向水缸中加水8次,就能把水缸水位加到1米高度。把當前水位轉換成曲線,大概效果如下。
上述例子比較簡單,單靠比例P
就能完成任務,但現實情況往往只有比例P
是不夠的,我們再來看一個更復雜的情況,假設比例P係數
仍然是0.5,但在每次加水的間隔,水缸都會漏掉0.1米高度的水。我們再從頭模擬加水實驗,看看具體結果會怎樣?
如上圖結果所示,當水位達到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,我們再從頭模擬加水實驗,具體數值如下。
把當前水位轉換成曲線,大概效果如下。
上一輪實驗只用比例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,我們再從頭模擬加水實驗,具體數值如下。
上一輪實驗使用比例P
和積分I
聯合控制,最高水位達到1.3,超過目標量
之後,水位最低迴落至0.83。本輪實驗加入了抑制器微分D
之後,最高水位僅達到1.23,超過目標量
之後,水位最低迴落至0.88,相比上一輪實驗,本輪震盪幅度明顯減小,這就是微分D
的抑制作用。
分享一個動圖,很好的展示了比例P
、積分I
、微分D
的控制效果,其中紅色虛線是目標量
,曲線是用當前值
的變化趨勢。結合這個動圖,大家再回想一下“水缸加水”的例子,控制效果是不是很相似呀~
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;
如果比例太大,會引起系統振盪;
如果積分太大,會引起系統遲鈍。
參考引用
- 百度百科-PID演算法
- 百度百科-開環控制
- PID控制入門原理:https://zhuanlan.zhihu.com/p/197927959
- PID控制演算法原理:https://zhuanlan.zhihu.com/p/39573490
- PID控制原理及控制框圖說明:https://www.dgzj.com/zidonghua/96044.html
- PID引數調整,個人經驗:https://blog.csdn.net/weixin_44407238/article/details/119255699
- 學會PID-基於板球平衡系統:https://www.bilibili.com/video/BV1xL4y147ea
如有任何問題或建議,歡迎前往公眾號【劼哥舍】留言~