Q1:
你好,我有看"Apply PID to control speed and angle"文章,對於內文的敘述內容有些了解,
1. 速度控制 : 使速度誤差E(t)為零,也就是實際轉速等於目標轉速,而U( t)的值是由Ki*I(t)去維持(累積)其實際轉速,所以U( t)、I(t)與Power都不為零(無負載變動時為定值)。 速度迴授是看Ki*I(t)。
2. 位置控制 : 使位置誤差E(t)為零,也就是實際位置等於目標位置,而U( t)則是由I(t)去做遞迴疊代 (0<ki<1) 使其為零,所以 U(t)、I(t)與Power都為零(系統靜止到目標位置)。 位置迴授是看I(t)。
以上,再麻煩你了。
A1:
二、你所提的位置控制,並未指明角度還是速度, 我猜想應該是指角度,
基本上 Ki 越小 I(t)收斂越快,達到定位時間越久,先假設角度誤差 10 度,
Kp = 1,Kd = 0,試比較 Ki1 = 0.5 和 Ki2 = 0.1 差異,
Ki1 = 0.5, E(0) = 10, I(0) = 0.5*(10) = 5, D(0) = 0, U(0) = 10 + 5 = 15
Ki2 = 0.1, E(0) = 10, I(0) = 0.1*(10) = 1, D(0) = 0, U(0) = 10 + 1 = 11
Ki2 = 0.1, E(0) = 10, I(0) = 0.1*(10) = 1, D(0) = 0, U(0) = 10 + 1 = 11
雖然 U(0) > 10,看似比 設定角 10 度大,這裡討論使用 NXT 馬達,power = U(t) / 8,
因此馬達出力設定 <= 2,不會有發散問題。
Q2:
你好,我還有一個疑問就是速度迴授的誤差E(t)=R(t)- Y(t)而Y(t)=U(t-2),
當E(t)=0時R(t)= U(t-2)這我懂,但是在位置迴授的時候因為E(t)= 0且U(t-2)要為0
("因I(t)要為0"), 這樣就會強迫R(t)也要為0,但R(t) 一般都會是非0的數值嗎(例"角度10度"), 這邊我比較想不通,可以幫我解釋(答)我的問題,感謝你!
A2:
角度 PID,
E(t)=R(t)-Y(t)
I(t)=Ki*(I(t-1)+E(t))
D(t)=E(t)-E(t-1)
U=Kp*E(t)+I(t)+Kd*D(t)
I(t)=Ki*(I(t-1)+E(t))
D(t)=E(t)-E(t-1)
U=Kp*E(t)+I(t)+Kd*D(t)
當 U = 0,E(t) = 0,不代表 R(t) = 0,只要 R(t) = Y(t),就可以 E(t) = 0
Q3:
以你範例的疊代(我之前有嘗試了解),當Ki1=0.5,
E(1)=10,I(1)=0.5*(10+ 5)=7.5,D(0)=0,U(1)=10+7.5=17. 5,Power=2。
E(2)=R-U(0)=10-15=-5,I(2)=0.5* (7.5-5)=1.25,U(2)=-5+1.25=-3. 75,Power=0。
我用這方法一值疊代,U的值並不會收歛而是發散, 我猜是我疊代的方式(法)錯誤,
我有將位置控制弄成Execl(如附檔), 再麻煩你幫我確認,感謝你!
A3:
你寄來的試算表,已經收到內容大致無誤, 不過我還是根據你回饋的問題,
確認有數值發散的情形, 因此在角度控制部分追加了測量時間間隔 (d),理由如下:
速度控制那一頁每秒鐘檢查轉速一次是OK的, 但是角度控制每秒檢查一次就不太好,
NXT 馬達電力 100% 轉速約 800 degree/sec,也就是說供給 1% 電力,
馬達可以每秒轉 8 度,因此每秒調整角度一次容易過衝難以定位,
很高興透過討論的方式將真理找出來,若沒有你鍥而不捨追查,
謝謝。
Q4:
你好,因為看你給我的關係式(敘述)
根據U(t)=Kp*E(t)+I(t)+Kd*D(t)跟P= U/M(M=8,轉速與功率因子)來看,
雖然 U(0) > 10,看似比 設定角 10 度大,這裡討論使用 NXT 馬達,power = U(t) / 8,
因此馬達出力設定 <= 2,不會有發散問題。
你是將Power設定<=2,目的是將功率設定在一定範圍。
你去限制U的大小( 等比例縮小或限制極限值)也會相對的影響Kp、Ki與Kd的值( 等比例縮小),其主要目的也可以看來是在調小PID參數值, 所以我在位置控制(如Execl)的P跟U的參數
選2( 真實值還依系統特性決定,這裡思考為低轉速馬達) 去降低Kp的值
(你Kp=1時,我的只剩0.25), 也就是你回覆的將取樣時間縮小有異曲同工之處
( 你以取樣次數減少單位時間移動距離, 我以降低馬達輸出功率減少移動距離),
主要都是將解析度變高。 讓馬達在單位時間內移動的距離變小(少),
PID才有辦法收斂( 補償)。
A4:
你已經能夠清楚解釋各參數調整關係,我想未來遭遇任何難題, 你有足夠的知識可以解決,不然用試算表模擬也可以找出解決方案。
Q5:
還有問題就是一般你們都是怎樣去調整PID(Kp、Ki、Kd)還是看系統要的響應(規格)需求?
A5:
使用 PID 是為了直流電源供應快速穩定達到輸出設定,類似馬達定速控制,
以我的案例,都是 從 Kp = Ki = 1,Kd = 0 開始調起。
首先要確認取樣時間,馬達可控轉速範圍、 供給電壓範圍、解析度及精確度要求,
考量滿載時保留餘裕 (滿載 + 最大出力可得全速運轉),有無要求滿載/半載變化時,
使用 PID 最大的好處,無須清楚知道整體控制系統的數學模型, 但是它可以經由迴授控制,無論負載多寡,都可以穩定平滑控制。
Q6:
就這禮拜來對於PID有以下心得(不確定觀念是否正確)。
速度控制(PI) : 透過積分項維持功率輸出,取樣時間越長(1 s> 50 ms)時
則誤差(+/-)範圍越小,但缺點是系統響應速度慢(1 s一次,50 ms時可以20次)。
目標值與實際值則是絕對於0去讓目標值跟實 際值相等。一開始需考慮系統的P=U/M、
解晰度( 1轉幾個pluse)、取樣時間與精準度(穩態誤差), PID參數調整則是看暫態響應
(上升下降時間/ overshoot)去作決定。
位置控制(PI) : 透過積分項去減少(縮短)與目標值的差距(誤差), 取樣時間越短
(需考慮系統整體運算效能)時系統回授(補償) 的越即時(減少移動距離)
或將Power變小(運轉慢=移動慢) 也可達到相同效果。目標值與實際值則是相對的,
(調整取樣時間或縮小Power) 對於位置控制是很重要。
你那邊是否有此解決經驗或對策?或是依你Speed control文章內談的,
你是將取樣時間設定為1s來克服此延遲現象?再麻煩你了。
速度控制時Power常因電感性負載
(如馬達線圈或電感) 造會延後輸出響應(電感性視為低通濾波會有相位延遲),
A6:
PI 速度控制,取樣時間長短是根據系統步級響應來決定,取樣時間過短 (已經設定輸出,
但馬達還沒達到穩定速度), 會讓積分項目過度累積誤差造成過衝。
取樣時間至少 > 空載系統步級響應,步級響應簡單的說就是,定值輸出後,
因此速度控制採用一秒取樣一次, 只是確保達到步級響應的需求,也比較穩定避免過衝,
並且也有 50 ~ 100 ms 調速的需求,那選擇 50 ms 取樣時間是必須的,
否則每秒調一次就夠了。 其餘你的說明是正確的。
位置控制(PI) : 透過比例項及積分項去減少(縮短)與目標值的差距(誤差),
最大公因數。 也就是用最小可控電力,讓馬達轉一格位置所需的最短時間。
PID控制,的確對於受控體(plant)數學模型不是很明確的情況下,非常好用。但每 一個受控體因複雜度不同而PID參數使用不一致,所以考驗著操作者的智慧。最佳化控制,說起來是很綺麗的名詞,其實也是有點精益求精、吹毛求疵的境界,好還要更好。這就是人追求完美的階段不可停止的行動力。目前我這個笨笨的頭腦還記得的大概只剩下Simplex法、牛頓法這些計算local minimum performance 方法。
回覆刪除薛老師客氣了,
刪除你所提的數值方法,很多在學時期我不懂,是直到實際使用才會的。科技將會永無止境的進步,我們的任務之ㄧ就是把這些知識傳承給繼承工程師,發揮智能創造更好的商品服務大眾。
請問 我po 的文 是不是 被吃掉了 ?
回覆刪除蠻奇怪,文章確實不見,我先幫你貼文,隨後再補上說明
刪除老師 您好 !! 想像您請教一些問題
我看了您提供的PID的試算表 有看懂並瞭解很多 真的非常謝謝您
但有一點不太瞭解 想在請在您一下我這樣的說法是否正確 !! 不知我有沒有會錯意
就是 我從試算表中看出 Y(t) = U(t-2)
但以NXT機器人來說 我算出 我的
U(t) = Kp*P(t)+ki*I(t)=kd*D(t) 後 ,
除以 8 做為我的 power 就輸入給我的馬達
那因為 不會一輸出 就馬上讓馬達 達到我要的速度 所以 真正當下的速度 才是 U(t-2) 不知道我這樣 是否正確 ?
另外想請教幾個問題
問題一 : 試算表中的 指定速度為500
跟NXT 有關嗎 ? 還是只是因為說明 所以用
500 ?
問題二 : 從維基百科中看到說積分項是通過
加一個負的平均誤差比例值,平均系統的誤差就會減少以達到穩定不知道這句話的含意是什麼? 因從試算表中清楚看到
I(t)=I(t-1)+E(t) 好像沒什麼平均問題或是負的問題,所以我程式中我照試算表中的方式去做是可以的嗎? 之前誤差的累加在加上這次誤差就好 ?
問題三 : 書中讀到積分項都有什麼時間的問題,例如什麼誤差對時間的積分,那之前讀到的文章說NXT PID 取樣時間設一秒
是指說 我在程式的一個迴圈中 設定時間為1秒就可以 還是需要 做一些積分 才可以使用 ?
同學你好,
刪除是的,你的理解是對的,多數系統都有延遲問題,也就是檢知速度快於系統反應速度,除非你的系統,一輸出就可以達到設定狀況,才沒有延遲問題,或是故意調慢檢測週期,以這裡為例,改成兩秒為一週期,每週期第零秒時設定,第一秒內的馬達轉速不計算,轉速從第一秒數到第二秒,這樣也可以消除延遲。
指定轉速500度/秒只是舉例,可以依你的需求調整,只是不能超過系統的極限,假如NXT馬達,空載最高轉數800度/秒,滿載600度/秒,那應用上應在600度/秒內。
上午有事,先回答到此。
關於問題二,說真的,維基百科的說明,我開始也看不懂,不知是從哪裡抄來的翻譯。不過可以確定誤差的積分式就是 I(t)=I(t-1)+E(t) ,至於第二句「I從過去的平均誤差值來找到系統的輸出結果和預定值的平均誤差」,這是在說明 Ki ,在轉速控制已經穩定平衡時,U(t) = Ki*I(t),無誤差 P(t) = D(t) = 0,Ki = U(t)/I(t)。只能說中文維基百科的說明,令人不知其意,當比對英文維基百科說明,http://en.wikipedia.org/wiki/PID_controller,才明瞭它指的平均的意義,參見 Ideal versus standard PID form ,有另一種 PID 表示式, Ki = Kp / Ti。
刪除關於問題三,先看誤差對時間積分的意義,以馬達轉速控制為例,你設定要每秒500度,但是馬達只轉了300度,是不是還差了200度,假設下一秒又落後100度,積分項就是累計這些誤差,希望PID控制把誤差累積維持住,就算不能追回,但也不要再繼續擴大。至於積分要如何積,當然與取樣時間有關聯,如果你將程式改為0.1秒取樣一次,那積分就是每0.1秒誤差加總。
關於馬達轉速偵測,再仔細參考前文的程式碼,NXT馬達無法直接告訴你當時轉速,必須透過間接計算方法得知:先記下當時馬達旋轉位置X0 (MotorRotationCount) ,經過一秒後,再比較新的馬達旋轉位置到何處,speed = X1 - X0,這就是每秒轉速。
恩恩 謝謝您 我瞭解了 !! 謝謝你唷
刪除不客氣,歡迎常來瀏覽文章。
刪除