EV3循跡機器人
在工廠,要儲存或提取一些貨物時,若是由一個個工人慢慢搬,這樣為未免太浪費資源與資金,所以不太可能吧,通常是以機器人代替人去做的,而循跡機器人在工廠可以快速且高效率運送大量的貨物和訊息。將來我們會看到公路上有公車沿著磁力線跑,和循跡機器人的原理差不多,只是把有形的黑線變成無形的磁力線。而循跡機器人在沿著線跑時,必須不斷修正行徑的軌跡,以免跑到線外。
基本控制理論
紅外線感測模組可以藉由讀取到不同比例的紅外線反射量來判別是否為黑線,以數字來舉例,當紅外線感測器放在完全黑色的線上面,感測器讀取到40,而當放在完全白色物件的時候,感測器讀取到50,而當有一半看到黑色,有一半看到白色的時候則會讀取到45,因為讀取進來的紅外線反射量恰好是白色反射和黑色反射的平均值。
經過簡單的測量知道,當數字越接近40則表示車子越靠右(黑線區域),當數字越大越接近50時,則表示車子越靠近左(白線區域),而當車子偏左時,得下指令給車子向右邊走,反之亦然,這邊使用簡單的二分法來決定偏左或是偏右,就是黑白平均值為45,這個數值我們稱為Offset,當紅外線小於45則我要讓車子左轉,大於的時候要右轉。
上述稱為二段循跡法,車子走動時呈Z字型的運動軌跡,遇到黑線就朝另一個方向避開,遠離黑線則朝黑線靠近,行動時只有左轉或右轉兩個動作,因在轉彎時會停下另一邊的馬達,所以會慢慢前行。此循跡法在行動時會大幅度的左右搖擺,浪費時間與電池電量,但是只需要簡單的材料、程式,就可以使用,非常適合初學者練習使用。
大部分都是在直線的部份,二段法在直線在行走直線時,耗費了太多的不必要位移,一直抖動,因此將直線獨立出來,設定光感值靠近45的狀態大,都屬於直走。三段循跡法在直走偵測到黑、白的中間值時,會向前行走,直到偏離黑、白的中間區域,在走直線時會比較迅速,抖動變小了,為此優點,但在轉彎方面卻無突破如。
由於是為了沿著黑線前進,關於馬達該下什麼樣的指令,不同的馬達有不同的方式,這邊使用馬達的動力百分比來表示轉速,當使用這種方式走直線的時候盡可能讓車子走的不要太快,要走的緩慢一點,否則會有衝出去黑線的情況常常發生。
車子要直走很簡單,只要讓馬達都往前旋轉即可,轉彎的部分,兩輪平台又和我們一般的車子不同,沒有方向盤這種東西,可以去帶動轉向機構,然而這樣的機器車平台,比較像是坦克車,只有兩條履帶,但是卻能夠前後左右甚至原地旋轉,以向左轉為例,將右邊的輪子給予50% Power,左邊則是給予20% Power,此刻車子就會慢慢向左邊前進,或是右邊給30%,左邊給0%,車子就會轉左邊靠近,但不太會往前,後者就是相對於前著更緩慢的走法,更不容易跑出去黑線之外,上述是循機車的基本架構理論。
P control
依此類推,切割越多穩定性就越高,這就是PID中的P (Proportion),比例循跡法是按照光的強度,來決定轉彎的程度,讓車子保持行走的順暢,看起來就像在溜直排輪一樣的移動方式,在轉彎與直走方面都很滑順,程式較複雜。
將本來的40到50減去他們的平均值45,則變成-5到5,而轉換成這樣之後,將X軸的數值稱為Error,也就是誤差量,Y軸的部分將設定成轉速差百分比(100%
= 1),因此剛剛的斜率公式變成
Y=m*X
變成轉動角度的大小
Turn=m*Error
而 m的計算方式就是(Y軸每單位變化)/(X軸每單位變化),m是一個很重要的比例常數(proportionality
constant),之後將感測器所讀取到的的資料轉換成Error之後就可以藉由這個比例常數將Error直接轉換成Turn,這是一個很大的重點因素,而這個m在PID控制理論裡面有一個特別的名字,稱為Kp,是constant的簡稱,在之後我們還會有另外兩個K也會加進來這個PID控制裡面,K這個數值是一個轉換值,可以讓輸入進來的數據轉換成Turn。
在PID裡面還有一件關於P很重要的事情,就是P的範圍大小(proportional range) ,就是線性範圍,舉例來說,紅外線感測器的proportional
range 是40~50,而馬達我們是假設從-100~100,而從proportional range 可以探討兩個部份。
第一部份,proportional
range 越大越好,從剛剛的2-Level和3-Level那邊可以知道,如果可以讓proportional range 越大,則表示我們可以有越多種的速度變化,假如現在車子稍微遠離黑線,他可以稍微修正回來,假如非常嚴重遠離黑線,他就會相對應地強烈的修正回來,因此能夠有越多變化的話,就能夠讓車子適應更多種的變化,也就是說不怕曲率大的轉彎。
第二部份,如果超出了proportional
range ,大致上車子走的方向不會錯,但是計算出來的Turn就不一定正確了,因此我們必須限制車子不要超出proportional range。
經過紅外線感測器並且經過一連串的運算取得了Turn,那麼他要怎麼轉成馬達用的Power,首先先定義一個新名詞,Tp (Target Power Level) 目標馬力,簡單來說,這個就是直走的時候的速度,接下來將一顆馬達的速度設定為 Tp + Turn 和另外一顆設定為 Tp - Turn,因為有時候馬達再設定正反轉的時候會有相反的狀況發生,如果出現這樣的情況,把 Tp ± Turn的正負號倒過來試試看。計算我們剛剛說的斜率,也就是K,在這邊的K是表示proportiona,因此稱之為Kp,為了測試我們先粗估Error和馬達的Power,當Error從0到-5的時候,希望馬達可以從50%到10%。
I control
最簡單的積分,就是將每次的錯誤加起來,利用下圖舉例說明。在這裡取得五個數值,分別為-1,-4,5,3,-2,把他們全部加起來就是所謂的 I control的誤差,(-1) + (-4) + 5 + 3 + (-2) = 1 ,Error就是這個算出來的1。
積分誤差樣本圖
如果用程式語言的方式來表達,如下公式
Integral
= Integral + Error
這樣表示我們將每一次的誤差量都記錄在Integral這個變數裡面,藉由這個Integral來作為PI control的判斷,下列是一個最基本的PI control 的式子,如同 P control一樣,Error會乘上一個Kp值,而Integral也會乘上一個 Ki。
Turn = Kp*(Error) + Ki*(Integral)
假如車子使用P control已經很靠近了黑白線的交錯區,但是還是有一點點的些微誤差,例如Error總是1,那麼我們的Integral就會不斷的增加,進而增加
Turn 的數量,那麼我們就可以在把這樣的微小誤差給修正回來,Integral就是為了這樣的目的而加進來的。
Integral是為了微小誤差而存在的,但是事情總是優點缺點共存,他可以記起來以前所有的錯誤,同時表示微小的誤差將會大大的影響我們的 Turn,即使我們早就走在正確的黑白交錯區了,還是會受到之前的影響而開始走偏。
在Integral的前面乘上一個小於1的分數,這樣一來之前的記憶就會不斷地變小,就可以稍微減輕剛剛說的那種效應的產生囉,當然,相對的得犧牲本來的integral的反應速度了。在程式方面可以這樣來表示
D control
利用微分的方式,可以預測數值接下來的發展,物體的位移函數利用微分可以求得速度和加速度,利用趨勢等於現在的偏差值減去過去的偏差值,也就是未來的偏差值等於趨勢加上現在的偏差值,將此D用PID控制裡面的稱呼方式來說的話,稱之為Kd,PID控制可表現下列公式。
馬達旋轉量(Turn) = Kp * (現在的偏差量) + Ki * (過去的偏差量) + Kd * (未來的偏差量)