比例(proportional)控制方法是一種控制理論,可用來讓一個自動控制系統能夠對不同的環境狀況做出不同的反應,誤差愈大時,修正幅度也愈大,反之則只要小幅度修正即可。換言之系統的反應會與誤差大小呈現一定的比例關係,因此得名。
當然 P控制不是萬能,所以還有後續的積分(Integral)與微分(Differential)控制法,但本文先不介紹。一般來說, 我們都是機器人循跡這個範例中來應用比例控制方法,對於學生來說是個非常好的練習,可以充分體會理論與現實狀況的差異(ㄎㄎ)
本文內容是發想自[A PID Controller For Lego Mindstorms Robots] 一文,歡迎延伸閱讀,本文中的示意圖也是引用自該網頁,您也可以參考維基百科對於 PID 控制器的定義。
傳統的循線方法一言以蔽之就是二分法:向右前方移動,直到偵測到黑線之後向左修正。(白場地黑線,機器人置於左邊),從這裡我們可以看出許多理想性的假設:
- 每次修正都要能夠回到白色場地,這就是為什麼當軌跡曲率變化太大(例如許多左彎後接一個右彎、髮夾彎甚至直角灣)時,都會在此陣亡…
- 機器人根本不會直走,因為我們的程式就是這樣寫的,左前方右前方一直重複移動。這樣會造成明明是大直線,但是機器人還在那邊左右左右修正,太慢了。
- 機器人不知道彎道的變化程度,每次修正的動作皆相同,傳統的兩分法是取黑色軌跡線與白色場地的光值之中間值作為判斷邊界,例如 (30+50) / 2 = 40。小於40視為偵測到黑線,反之則代表在白色場地上。如果光值是46或47,代表此時只有偏離一點點,應該進行小幅度修正就好。但是二分法就是無法作到。
- 黑就是均勻的黑,白就是均勻的白,怎麼可能嘛!這要考慮到光照,桌面乾淨程度等等… 實際上是不可能有均勻顏色這種事的。
所以由此可以延伸出非常多東西可以深入去玩,您的機器人也會愈來愈聰明:
- 導入比例控制方法,讓機器人碰到劇烈彎道時可以修正得更快,而誤差很小或甚至為零時,機器人就是直走!
- 導入比例控制方法,以本文的設定來說,光值會在30~50之間連續變化,誤差產生時會影響機器人的馬達轉速。以髮夾彎來說,機器人一定會瞬間切入黑色軌跡線較深,這時光值會下降比較多,機器人便是藉由這種方法來得知彎道的曲率,作出更適合的修正。
- 每次都重新更新判斷邊界值,機器人對於環境的適應力會更高
下圖中我們可以看到二分法就是很簡單的 if / else,機器人只有兩個動作。到了中間的三階段之後,我們設計一個區間(光值43~47),這時代表機器人略偏但是不算太偏,所以還是直走。直到光值小於43或是大於47代表篇很多了才進行修正。
有三階段就有四階段五階段,最後這麼多階段就會變成一條直線,比例控制方法的比例事實上就是這條線的斜率。斜率愈大代表機器人對於誤差愈敏感,修正幅度也愈大。這在程式中我們是用一個參數 kp 來調整。kp 不是愈大愈好唷!kp過大會讓機器人變得神經兮兮,一點點誤差也一直在修正反而效果不好。這裡都需要反覆地調整,請加油~
簡單用 EV3 程式寫一個來玩玩看吧:阿吉老師在淡江電機所開的[機器人程式模擬與開發],就是使用 leJOS Java程式語言來控制樂高NXT機器人,歡迎跟著我們的教學網站一同學習。以下是上周四的 P控制機器人上課影片與照片:
這是我們另一個使用 NXC 寫的雙光感測器循跡程式,是不是有如刀切豆腐一樣順暢呢? 附上NXC程式碼:
task main()
{
SetSensorLight(S3);
int kp=2; //比例參數
int light_initial = Sensor(S3); //half
int light_realtime;
int vl,vr;
while(true)
{
light_realtime = Sensor(S3);
vl = 40 + kp*(light_realtime-light_initial);
vr = 40 + kp*(light_realtime+light_initial);
OnFwd(OUT_B,vl);
OnFwd(OUT_C,vr);
}
}