2008年12月2日 星期二

Apply PID to control speed and angle

http://4rdp.blogspot.com/2008/12/apply-pid-to-control-lego-nxts-speed.html

先前貼文討論 PID control 很多網友點閱參考,今天補充說明 PID 轉速控制與角度控制差異,讓讀者明瞭其原理概念而不會誤用。

E(t) = R(t) – Y(t) // E(t) 設定與回授間的誤差, R(t) 設定點, Y(t) 回授測量結果

先看轉速控制一般式,
P(t) = E(t)
I(t) = I(t-1) + E(t)
D(t) = E(t) – E(t-1)

U(t) = Kp*P(t) + Ki*I(t) + Kd*D(t)

再看角度控制一般式,

P(t) = Kp * E(t)
I(t) = Ki * (I(t-1) + E(t))
D(t) = Kd * (E(t) – E(t-1))

U(t) = P(t) + I(t) + D(t)

兩者之間差異在 PID 係數於公式位置不同,尤其 I(t) 是關鍵所在

轉速控制的方法為,供給電力讓馬達轉動,當轉速達到設定值時,只要維持恆定電力運轉以克服馬達運轉摩擦力以及負載即可。但是角度控制不一樣,當角度不同時,要供給電力轉動馬達,到達定點後,電力必須關閉甚至剎住馬達。有了這些概念後,再來看公式就比較容易。

先談轉速控制,想像達到設定轉速時 E(t) = 0,P(t) 與 D(t) 也會變成零,只有靠 I(t) 維持馬達繼續運轉,只要 Ki > 0 就沒問題,當 Ki = 1,I(t) 也就會等於設定轉速

同樣地,角度控制達到設定角度時,E(t) = P(t) = D(t) = 0,I(t)也必須為零,才能穩定停留在設定角度上,那要如何才能讓 I(t) 變成零,關鍵在 0 < Ki < 1 透過遞迴計算 (recursion),Ki 越小,I(t)越快接近零。


延續閱讀 PID control 精彩討論 ...

48 則留言:

  1. 好复杂啊,需要足够多的知识和经验,本人也想做研究,but it's a load to go...
    不知作者对自己的工作与兴趣有何体会,评价。
    发表者:来自湖南长沙的一名大学生。对科学很有兴趣。yangqiii@126.com

    回覆刪除
  2. 不清楚您是否為電機系的學生,如果是應該有機會接觸到自動控制,在這裡所提及的各項知識,幾乎在教科書中,都沒有談到或是沒有言明,是整合我個人的知識經驗,給需要的人參考。

    雖然研發工作傷腦筋、壓力大,但是我還是會持續做到不能做為止。

    我不太明瞭您所說的"作者对自己的工作与兴趣有何体会,评价。"?從我開站以來約每周一文,您應該可以概略了解一些我的工作與興趣,當然截至目前為止,仍然還有很多話題還未被揭露,比如說我也是橋牌愛好者,多年前曾自創失墩自然制參賽,獲取雙人賽亞軍。

    只要記得常來看看我的部落格,就是對我最大的支持。 ^_^

    回覆刪除
  3. 你好~我對於PID控制十分感興趣,但是也十分的疑惑,擁有許多疑問,多次的看到大大無私的分享經驗,想請教一些問題,在PID的介紹當中提到的取樣時間是1 sec,
    P(t) = E(t)

    I(t) = I(t-1) + E(t)
    D(t) = E(t) – E(t-1)

    U(t) = Kp*P(t) + Ki*I(t) + Kd*D(t)

    如果將取樣時間提升至1m sec
    是否將概念改成這樣??因為沒有一個正確的依據,不知道這樣的想法是否有誤!?
    P(t) = E(t)

    I(t) = (I(t-1) + E(t))/1000
    D(t) = E(t) – E(t-1)

    U(t) = Kp*P(t) + Ki*I(t) + Kd*D(t)
    -----------------------------------
    因為看過許多文章理面又有提到
    積分共分為梯型與矩形
    不知道在撰寫程式的部分,差異性搞不清楚,
    在撰寫程式時,不知道怎樣才是對的。

    回覆刪除
  4. 在 PID 公式中的 t,所指的是 step,它與時間間隔無關,因此公式不必修正。但是你要注意,被控制的系統是否能以 1ms 速度反應,假設你每 1ms 調整控制,但是系統需要 10ms 後才能 100% 反應,表示 1ms 時間設定太短,實作上建議須改為 5ms or 10ms 比較好,不然可以追加延遲時間,也就是設定後延遲 10ms 再 1ms 微調。

    關於數值分析中的積分計算,梯形與矩形方法差異說明如下:
    數值積分主要目的在計算曲線與 X 軸之間面積,如果使用矩形方法來近似計算誤差較大,
    你就當成一個曲線面積紙板用小刀裁成等寬長條紙片,梯形方法誤差較小。
    另外請留意,所有的數值方法結果,只能近似無法 100% 準確。

    回覆刪除
  5. Bridan大師,最近我都在研究Segway by Gyro,我採用PID:
    err=current_value-desire_value
    derr=err-pre_err
    sum_err=sum_err+err

    U=kp*err+ki*sum_err+kd*derr
    原理其實都很清楚,但將它輸出至segway的左右2個馬達,總會讓segway迅速爆衝。不知是否是因為gyro取樣的時間所致?

    回覆刪除
  6. 薛老師您好,

    稱大師不敢當,只是對一些主題有些研究,不像您有許多教學獎項與證書,令人欽佩。

    你提供的式子,它屬於轉速控制型態,運用於轉角控制會有問題,請先參考本文說明,如果還有疑問,歡迎討論。

    回覆刪除
  7. 大師您好:根據您所提供的公式
    [轉速控制]
    E(t)=R(t)-Y(t)
    I(t)=I(t-1)+E(t)
    D(t)=E(t)-E(t-1)
    U=Kp*E(t)+Ki*I(t)+Kd*D(t)
    [角度控制]
    E(t)=Kp*(R(t)-Y(t))
    I(t)=Ki*(I(t-1)+E(t))
    D(t)=Kd*(E(t)-E(t-1))
    U=E(t)+I(t)+D(t)
    (1)U的公式,看起來是一樣的?不是嗎?
    (2)要達到位置控制,Ki要較小,但如果很小,應該會定位很久?
    (3)對於定位控制的U輸出量,是不是仍要除以8?(之前你有一篇專論PID轉速控制,談到power=100時,額定速度換算)

    回覆刪除
  8. 薛老師您好,關於您的問題,說明如下:

    一、轉速與轉角控制公式是有差異的,我稍微修改一下,請注意 I(t)
    [轉速控制]
    E(t)=R(t)-Y(t)
    I(t)=I(t-1)+E(t)
    D(t)=E(t)-E(t-1)
    U=Kp*E(t)+Ki*I(t)+Kd*D(t)
    [角度控制]
    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) 最後為一個定值,但是角度控制 I(t)= 0

    二、你所提的位置控制,並未指明角度還是速度,我猜想應該是指角度,基本上 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

    三、對於定位(角度)控制,Power 與 U(t)關係如何訂呢?如果你想讓不同 Ki 設定,有相接近的收斂速度,下面是我的建議,
    Ki1 = 0.5, Power = U(t) * 6.66, 因為 100 / 15 = 6.66
    Ki2 = 0.5, Power = U(t) * 9.09, 因為 100 / 11 = 9.09

    回覆刪除
    回覆
    1. 請問阿

      Ki 跟 I(t-1)+E(t)的I

      都是依樣為參數嗎

      刪除
    2. Show 您好,

      I(t) 是PID的積分項,Ki 是它的係數。

      刪除
  9. 有一點點看的懂你寫的了:p

    不好意思,小弟駑鈍,敬請見諒啊!

    回覆刪除
  10. 薛老師您客氣了,

    聞道有先後,術業有專攻,以前我也是花很久時間才搞懂,有弄懂比較重要。

    另外,透過討論,可以把許多觀念陳述清楚,有許多東西我是知道的,但是忘記有朋友不知道而遺漏。

    最後,教學相長,透過深入討論,可以讓我進一步深思,這些關鍵的原理如何恰當的運用於設計中。

    回覆刪除
  11. 您給我們提供的式子我已了解在ki部分的差異,但自己想做試算表驗證看看時,在y(t)那的值好像就不能像速度那樣填了,你有另外做位置的試算表參考嗎?

    另外想請教的是在課本上提出在ki控制都會有一個積分飽和的現像,這個東西要怎麼解決?

    回覆刪除
  12. Wallace 您好,

    目前我並沒有位置(角度)控制的試算表,日後有空會再補充。

    另外您指的積分飽和應該是 integrator windup,程式設計實做為,if I(t)> limitation then I(t) = limitation。至於 limitation 要如何訂定?這要視系統而定,我沒辦法在此給你一個通用方法。

    回覆刪除
  13. 你好:
    我參考了你所寫的轉角控制數學式,數學式應該是Z-domain的樣子,目前在matlab模擬所求出的Kp、Ki、Kd參數值是s-domain,不知是否可將s-domain參數值轉換成z-domain直接套用。
    P(t) = Kp * E(t)
    I(t) = Ki * (I(t-1) + E(t))
    D(t) = Kd * (E(t) – E(t-1))

    U(t) = P(t) + I(t) + D(t)

    回覆刪除
  14. 孟育您好,

    是的,離散的Z-domain與連續的S-domain之間可以相互轉換,只要數學模型正確,那些 K 係數是可以直接套用。

    回覆刪除
  15. 意思是只要將Z-domain數學式轉換成s-domain數學式。將轉換之s-domain數學式模擬求出的K參數值也可以通用於z-domain?

    回覆刪除
  16. 孟育您好,

    是的,S-domain 的 K 參數可以用於 Z-domain,基本上兩者的 K 參數是相近的。
    另外,離散的 X(n) 函數,可以利用 t = nT 技巧轉換成 f(t),就可以由 t-domain 再轉換為 S-domain。

    回覆刪除
  17. Bridan你好:
    目前在馬達控制的部份,是參考你所提供的PID數學式建立於DSP上;想請教的是,關於z-domain微分器數學式的部份,是否像s-domain微分器有調整N低通濾波器的功能?麻煩你這麼多次,真不好意思!

    回覆刪除
  18. 孟育您好,

    我很樂意與你討論這些議題,關於濾波器程式設計我懂得不多,知道一點低通濾波器設計方法,你把它當做一段副程式,數據一個一個丟進去,

    如果進去的數值與出來的是一模一樣,那就是沒有濾波。
    如果進去的數值和前一個進去的數值平均計算,然後傳出來,那就有低通濾波效果,因為平均值可以把高頻突波降低。
    越多個數值平均,表示只能越低頻率信號可以通過。

    有了這些概念,應該可以寫出所需的低通濾波器程式。

    回覆刪除
  19. Dear Bridan:
    www.engin.umich.edu\class\ctms\examples\motor2\pid2.htm

    關於step disturbance response的意義是什麼?就網頁所描述的,似乎把Kp,Ki Kd等全部或部分參數,當作feedback回輸入端,即
     u-->O--->[ SYS1 ]--+-> y
       |       | y = SYS * u
       +--[ SYS2 ]<---+

    SYS1就是plant,而SYS2即PID參數

    回覆刪除
  20. 薛老師您好,

    你的問題確實不易回 答,但是我還是竭盡所能回覆,步 級響應 (step response) 比較容易理 解,就是輸入一定值控制看其系統 反應,而步級擾動響應 (step disturbance response) 只有在馬達 位置控制才會出現,它是用來觀測 馬達位置同步是否有位置偏差情 形,因為 Matlab 的馬達位置控制 例子是同步控制,也就是馬達一直 運轉,馬達位置必須追隨轉角控 制,步級響應部分代表轉角位置是 否同步,也就是等速運轉,但是等 速運轉不代表完全同步,還可能偏 差一點角度,因此還須要 step disturbance response 檢視控制是 否完全追隨並且沒有任何角度延 遲。

    step disturbance response 的 計算方法約為 step response / Kp

    回覆刪除
  21. 最近探討最佳化的問題,並試著以簡單的比例控制器做定位控制,找最佳參數的數值,分享於網頁中(http://cmackimo.blogspot.com/2011/07/p.html?showComment=1311870665154#c5677666670697190810)
    有興趣的研究者,可參酌並一起討論。

    回覆刪除
  22. 薛老師您好,

    謝謝你分享這麼棒的知識,原來雁行理論也可以運用在最佳化,雖然以前有學過控制理論,但是出社會後就一直停留在二十年前的舊知識,從老師深入淺出的說明,學會一種新方法。

    感謝啦!

    回覆刪除
  23. 我遭遇了一个问题是关于PI控制器的

    首先,设定一个Kp设定值
    然后一个Ki设定值,以误差累加的方式进行控制(也就是在循环中,把每次循环的误差累加起来,每次累加发送一次控制值),但是我对于其中的控制量计算方法不明白,控制量的计算如下:
    首先计算输出与输入的误差
    然后计算i,这里的i是e(误差)的累加,一开始i为0,把每次的e累加到i中,像这样:i = i+e;
    接着控制量为:
    u = Kp*e + Kp*Ki*i;
    不明白的内容就是这里,为什么积分项上还要乘一个Kp呢,希望得到回复

    回覆刪除
  24. Aopaw.Y 您好,

    U = Kp*e + Kp*Ki*i 與 u = Kp*e + KI*i 兩式最大不同在表示方法的差異,其實 KI = Kp*Ki ,不同作者會以不同的方法表達。因此你引用別人的方程式時,須注意這些小細節,否則糸統會失控。

    回覆刪除
  25. 老师你好!我感觉书本知识和实际情况还是有差别的。比如,我现在需要PID控制一个地暖系统,具体控制boiler的阀门。仿真的结果还不错。可是真正用到实际系统时,问题不少:比如仿真时是对设定温度与实际测量温度的误差进行PID控制,可是实际情况是PID控制器对误差调整后得到的输出控制信号u(t)具体是个什么值?如何作用到阀门上?即从u(t)到控制阀门的开度(0-100%)还需要一个过程转换或者是一个比例转换吗?我的邮箱地址wanghongyang1767@gmail.com.不胜感激!

    回覆刪除
  26. 您好,

    關於你的問題回答如下,
    一、PID控制器对误差调整后得 到的输出控制信号u(t)具体是个什么值?
    以你的例子,U(t) 的單位為溫度,它是—個控制程序中的過渡目標,假設你想從20 C加熱到40 C,你不可能一次到位,因此這一秒可能是21 C,下一秒為22 C,逐步控制到40 C。

    二、如何作用到阀 门上?即从u(t)到控制阀门的开度(0-100%)还需要一个过程 转换或者是一个比例转换吗?
    假設閥門0%時20 C,100%為60 C,那你就要線性轉換。

    請細讀另一篇
    http://4rdp.blogspot.com/2008/05/pid-speed-control.html
    本文及此篇文章的問答,應該有你想要的關鍵知識。

    回覆刪除
  27. 請問老師,
    目前在製作一個倒單擺系統,想請教老師幾個問題:

    現在物理公式已經知道,但要寫入MCU內是否要轉換成狀態方程式才可以撰寫成程式呢?

    如果MCU本身計算速度不快,是不是可以PID控制去補償時間誤差呢?
    (假如系統反應速度需要1ms,但是從mcu計算速度是5ms)這樣有辦法用PID補償嗎?

    我是剛接觸控制這門領域,有點陌生,請老師指導指導。
    感謝。

    回覆刪除
    回覆
    1. 同學您好,

      控制這領域,條條道路通羅馬,沒有必要非寫成狀態方程式才能程式控制,通常列出狀態方程式是為了系統鑑定,尋找該系統重要參數,以便模擬該系統運作特性。倒單擺適合角度型態 PID 控制,控制它需要有角度檢知器及伺服馬達,完全不知道它的系統參數(如單擺長度、質量)也可以寫程式,只是你要花時間去試 Kp,Ki,Kd 參數。

      關於第二個問題,最短控制時間週期 = 檢知時間 + 計算時間 + 馬達運轉時間,你的系統控制時間週期莫短於這個時間,時間過短系統就會過度補償而過衝,拉長時間間隔有助於穩定控制。

      歡迎留言討論。

      刪除
    2. 意思是不一定要寫入物理方程的CODE,單靠PID程式控制就可以控制嗎?
      現在我的硬體可以感測單擺角度與馬達轉速正反控制,接下來該如何做呢?

      請老師指點指點

      刪除
    3. 同學您好,

      是的,可以不用寫物理方程式即可控制。

      請先參考另一篇貼文 http://4rdp.blogspot.tw/2008/05/pid-speed-control.html 改寫程式為角度控制,假設單擺平衡時為零度,你也期望它是平衡,因此設定角度為零度,然後檢知傾斜角度,角度差異越大馬達出力修正也越大,自己試調三個 K 參數值,以及尋找馬達控制式 power = M*U(t),以 NXT 轉速控制為例,M = 1/8。

      找出這四個參數即可程式控制,歡迎回文說明你的實驗結果。

      刪除
    4. 有個問題想再請教老師,

      假設:
      感測器讀取角度經由ADC給MCU的時間+得到角度誤差e給PID計算輸出控制u的時間+u值給轉換為pwm輸出馬達=需要t秒時間。

      假如現在我手碰觸單擺,偏移5度。經過t秒時間後輸出誤差5度對應到的pwm值,但此時單擺角度已經>5度了。
      請問這該如何解決呢?是不是要修改pid的哪個參數?如果老師看不懂我可以在講更詳細。麻煩老師了。

      刪除
    5. 同學您好,

      參數 Kd 是用來解決這種問題的,從 D(t) = E(t) – E(t-1) 可知,如果不修正可以預期誤差會越來越大,D(t)表示誤差的趨勢,基本上調大 Kd 是有幫助的,但不要設定過大而產生過度補償。

      刪除
  28. 老師
    我目前有一個狀況,感測器(電位器)感測到單擺正中央的值會一直漂移,正中央沒有一個固定的值,
    因為這原因會一直有誤差產生,造成I項無法收斂到0...單擺一直反覆在中心點震盪.
    請問是程式的問題還是必須換掉感測器呢?

    回覆刪除
    回覆
    1. 同學您好,

      倒單擺想完全 I=0 應該不太可能,因此單擺一直反覆在中心點震盪是很正常。你可以想像用手指頂一隻筷子平衡的樣子。
      想放慢調整頻度,有三個方式可以試看看:
      一、延長調整時間週期
      二、減小 Kp,也就是減慢調整速度
      三、調小 M 值,power = M*U(t)

      刪除
    2. 再補充一個方法,換一個解析度較差的檢知器。這些方法都是避免頻繁調整。

      刪除
  29. U=kp*p+i+kd*d 需要寫在中斷裡面嗎?
    感測器經由ADC出來的值需不需要做平均才比較準確?
    我有調整過kp,從小到大都嘗試過,最好狀況是在中心點一直左右來回,但過一會又倒下.
    如果再不行可能就決定放棄換題目了,畢竟金費不夠,目前控制器是用MSP430...馬達也是12V玩具馬達...
    感謝老師這麼晚還回復,如果學校老師有像您這麼熱情回答該有多好...

    回覆刪除
    回覆
    1. 同學您好,

      因為平時工作忙碌,只有晚上才有空閒回覆問題,而且從讀者的問題中,讓我學習各位的經驗,教學相長感覺很好,我想您的老師應該也會樂於解答你的疑惑,有空你可以試看看,問你的老師在我部落格的問題,看有沒有其它見解。

      寫任何韌體,中斷裡的程式碼越少越好,儘量設完旗標就離開,然後在主程式處理,如果會遇到中斷很多次的情形,應該再加次數計數,以便主程式不會遺漏。因此 U 式不要寫在中斷裡,務必養成好習慣。

      ADC 取得的數值需要平均,主要目的是濾除雜訊,讓控制比較穩定,而非比較準確。
      不錯可以在中心點平衡一段時間,或許你能夠拍一段影片提供我參考,可以再給你建議。
      此外,整理各種係數的運動情形比較,可以當作報告的一部分。

      就盡量善用現有資源達成目標,成功屬於有意志力完成任務的人的。

      刪除
    2. OK!這幾天先把硬體換些零件,至於影片改天再MAIL給您.

      刪除
    3. Jhih Jie Hong,

      期待你的作品分享。

      刪除
    4. 不好意思這麼久才回覆,單擺的題目可能要之後有空自己完成.
      目前是硬體完成,差寫入程式.
      但是前陣子更換組員,題目也跟著更改.
      抱歉

      刪除
    5. Jhih Jie Hong,

      東西完成就是自己的,無論成果為何,這些經驗只有歷練過的人才能體悟,加油。

      刪除
  30. 还没看完,楼主诲人不倦,了不起!此前看了下面链接的第一篇,觉得蛮清楚的:
    http://ishare.iask.sina.com.cn/download/explain.php?fileid=22755461
    还不特别清楚的,是如何对具体的系统,确定参数值的高效办法,特别是负载变动的系统。

    回覆刪除
    回覆
    1. 您好,

      在此發表文章,只當做網路義工傳播知識而已,還有很多好文值得你細讀。謝謝提供連結參考,PID 控制法是不怕負載變動的,當輸出出力固定一樣但負載變大時,那會產生較大誤差,這部分 P 項就會補償回來,因此使用 PID 無需擔心負載變動,可以恆定控制。

      刪除
  31. 您好 :
    想像您請教一個問題 因為我剛接觸PID 
    看到 文中有說到
    KP> 1 代表系統輸出很強的力 因此 Ki 與 Kd 要搭配負值 否則無法調整
    這句話看不太懂, 因為前面看到的 都是說
    一般調整PID 都是從 P 開始調 Ki 跟 Kd 先給很小 再慢慢往上調
    不知道 有要 給 Ki 或 Kd 負值 ??

    回覆刪除
    回覆
    1. 建議你先參考 PID Control 精彩討論 (1) 中 A3 答覆裡的試算表,試調看看,然後我們再來討論。

      刪除