您的位置:首页 > 其它

PID控制理論(2)-P control

2016-06-23 15:16 239 查看




作者J. Sluka http://www.inpharmix.com/jps/PID_Controller_For_Lego_Mindstorms_Robots.html
準備好了上前一篇所說的機器人平台之後。
接著就準備開始控制了,但是我們還不會這麼快就進入PID控制,我們會先使用一個最簡單的控制方式,也就是”非黑即白”的控制方式,首先我們的紅外線模組,可以藉由讀取到不同比例的紅外線反射量來判別是否為黑線,如圖片一,我用數字來舉例,當紅外線感測器放在完全黑色的線上面,感測器讀取到40,而當放在完全白色的地毯上的時候,感測器讀取到50,而當我有一半看到黑色,有一半看到白色的時候則會讀取到45,因為讀取進來的紅外線反射量恰好是白色反射和黑色反射的平均值。



圖一
經過簡單的測量知道,當數字越接近40則表示車子越靠右黑線區域),當數字越大越接近50時,則表示車子越靠近左(白線區域),而當車子偏左時,得下指令給車子向右邊走,反之亦然,這邊使用簡單的二分法來決定偏左或是偏右,就是剛剛的黑白平均值(50+40)/2 = 45,這個數值我們稱為offset,當紅外線小於45則我要讓車子左轉,大於的時候要右轉,如圖二。
 


圖二
由於是為了沿著黑線前進,關於馬達該下什麼樣的指令,不同的馬達有不同的方式,這邊使用馬達的動力百分比來表示轉速,作者J. Sluka說道,當使用這種方式走直線的時候盡可能讓車子走的不要太快,要走的溫柔一點,否則會有衝出去黑線的情況常常發生(或許看到這邊的時候,各位的車子早就衝出去好幾次了也說不定。
車 子要直走很簡單,只要讓馬達都往前旋轉即可,但是要轉彎怎麼辦?兩輪平台又和我們一般的車子不同,沒有方向盤這種東西,可以去帶動轉向機構。說的沒錯,然 而這樣的機器車平台,比較像是坦克車,只有兩條履帶,但是卻能夠前後左右甚至原地旋轉,以向左轉為例,將右邊的輪子給予50%power,左邊則是給予20%power,此刻車子就會慢慢向左邊前進,或是右邊給30%,左邊給0%,車子就會轉左邊靠近,但不太會往前,後者就是相對於前著更溫柔的走法,更不容易跑出去黑線之外。
其 實走黑線車的最基本架構就是這樣,這就是一台循跡自走車了,但是當你坐好的時候你會感覺十分的氣餒,因為雖然會沿著黑線走,但是實在走的不是很好,總是抖 來抖去的,而且常常還是會跑出去,甚至他在直線的部分其實也未曾走過真正的直走,那何不再多另外弄出一個判別區段是直走呢?沒錯,從這邊開始就是準備和PID接軌的第一步,在此之前全部都是概念和簡單的實作方式,如下圖三,中間多出一塊區域判別走,只有在真的Error很多的時候開始左轉或是右轉,多了這項判別,你將會發現車子的抖動變小了,至少會有一些時候真正開始走直線了。



圖三
此刻,你會突然發現,既然三個判別區比兩個好,那個分成四個、五個、六個……不就會越來越好嗎?沒錯,這就是PID的P(Proportion(al))。
 PID_Proportional部分
 


圖四
最初使用了2-Level Line Follower 的方式來控制,後來又用了3-Level Line Follower,而效果有越來越好的趨勢,因此接著要讓這個Level變得盡可能越大越好,如圖四來說,Turn表示右邊輪子的圈數減去左邊輪子旋轉的 圈數,而這個Trun在之後將會提供給馬達作為指令參考用,Turn越大則表示右邊的速度得比左邊更快,當這個Level越分越多,漸漸地,你將會發現本 來應該是階梯狀的圖案,漸漸會變成一條有斜率的斜直線。
 斜率公式:y = m * x +b
在數學上面一般會用這樣的方程式來表示一條斜直線, 然後為了讓事情看起來簡單點,將圖四的最右邊那張轉換成新的XY軸。
 


圖五
我們將本來的40~50減去他們的平均值45,則變成-5~5,而轉換成這樣之後,我們將X軸的數值稱為ERROR,也就是誤差量,Y軸的部分將設定成轉速差百分比(100% = 1),因此剛剛的斜率公式變成
y = m * x   or  Turn =  m * error
而 m的計算方式就是(Y軸每單位變化)/(X軸每單位變化),以上面的例子來說
m = ( -1  –  1 ) / ( 5  –  -5 ) =  – 0.2
 m是一個很重要的 比例常數(proportionality constant),之後將感測器所讀取到的的資料轉換成error之後就可以藉由這個比例常數將error直接轉換成Turn,這是一件很重要的事情, 而這個m在PID控制理論裡面有一個特別的名字,稱為K,是constant的簡稱,在之後我們還會有另外兩個K也會加進來這個PID控制裡面,K這個數 值是一個轉換值,可以讓輸入進來的數據轉換成Turn。
在PID裡面還有一 件關於P很重要的事情,就是P的範圍大小(proportional range) ,就是線性範圍,在這邊的範例來說,紅外線感測器的proportional range 是40~50,而馬達我們是假設從-100~100,而從proportional range 這個議題中,衍生出兩項重點。
 1.proportional range 越大越好,從剛剛的2-Level和3-Level那邊可以知道,如果可以讓proportional range 越大,則表示我們可以有越多種的速度變化,假如現在車子稍微遠離黑線,他可以稍微修正回來,假如非常嚴重遠離黑線,他就會相對應地強烈的修正回來,因此能 夠有越多變化的話,就能夠讓車子適應更多種的變化(就不怕很彎的轉彎了)。
2.如果超出了proportional range ,那車子會怎麼辦?大致上車子走的方向不會錯,但是計算出來的Turn就不一定正確了,因此我們必須限制車子不要超出proportional range 。
Turn???!!!!! 剛剛就是為了這個Turn弄了半天,但他到底要麼實際應用在車子上面?我現在經過紅外線感測器並且經過一連串的運算取得了Turn,那麼他要怎麼轉成馬達 用的Power%?首先先定義一個新名詞,Tp (Target Power Level) 目標馬力,簡單來說,這個就是直走的時候的速度,接下來將一顆馬達的速度設定為 Tp + Turn 和另外一顆設定為 Tp – Turn,因為有時候馬達再設定正反轉的時候會有相反的狀況發生,如果出現這樣的情況,把 Tp ± Turn的正負號倒過來試試看。
 在進去程式碼之前,先計算我們剛剛說的斜率,也就是K,在這邊的K是表示proportiona,因此稱之為Kp,為了測試我們先粗估error和馬達的Power,當error從0~-5的時候,希望馬達可以從50%~10%
Kp = ( 50 –  0 ) / ( 0 – -5 ) = 10
 下面的 Pseudo Code是來自作者J. Sluka
 Pseudo Code for a Pcontroller  (原作者在Kp那邊輸入1000到了後來除100的用意是為了使用浮點樹的關係)
Kp = 10                              //Initialize our three variables
offset = 45
Tp = 50
Loop forever
LightValue = read light sensor     //what is the current light reading?
error = LightValue - offset        //calculate the error by subtracting the offset
Turn = Kp * error
//the "P term", how much we want to change the motors' power

powerA = Tp + Turn                //the power level for the A motor
powerC = Tp - Turn                //the power level for the C motor
MOTOR A direction=forward power=powerA
//issue the command with the new power level in a MOTOR block
MOTOR C direction=forward power=powerC
//same for the other motor but using the other power level

end loop forever
//done with this loop, go back to the beginning and do it again

由上面可以知道有兩個可調變數和一個常數是關鍵。
offset常數是需要藉由模組編寫過的資料來的或是自行編寫程式製作出來的。
Kp和Tp這兩個可 調變數是需要經過多次的錯誤嘗試才能夠測量出來的,Kp決定當車子偏離軌道時,所修正回來的強度,Tp則是車子在直線行走的速度,在不同的場合所需要的 Kp和Tp是不相同的 ,當路徑大多是直線的時候,Tp可以調大一點,Kp可以小一些,反之,當遇到很多大轉彎,則需要Tp小一點,Kp大一點。
最後總結一下
P control 有幾個重點
1.輸入的動態範圍要大點比較好,以本例子來說,也就是紅外線40~50的這個範圍要大一點,能看得越多,因為輸入的動態範圍就直接影響到Error的範圍,這將決定我們能夠有多少的辨識條件。
2.輸出的動態範圍也得大一點,不然即使有了很大的輸入動態範圍,結果馬達卻只能夠作正反轉的輸出,那麼就一切都免談了,又回到之前說的2-Level的模式,所以說輸入輸入的動態範圍要盡可能的大,但是這兩者還是要能夠互相匹配才能夠互相發揮良好的作用。
3. 接著這是之前都沒提過的部分,程式的所在地,控制板,它的系統運作速度不能夠太慢,否則當車子都跑出去後他才說趕快回來,那也是白白浪費了P control 的強大效益了。
大家先試玩看看吧~~加油!!!!!!下一篇就會開始寫  I control進來囉
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: