天啊,沒想到時間過得真快,一下子就跨到2011年來,John真的是很慚愧,好像最近blog都沒有在update,不過為了幫各位準備很棒的內容,我還是希望能夠秉持先求質,再求量的原則。這次為大家準備的是我最近在研究的機器人影像處理專題,希望對大家有所幫助。
我們都知道,網路上已經有很多有關循跡機器人(Line-following robot)的範例,大部份其實都是用LEGO NXT和光感應器來做循跡的動作。原理很簡單,假設地上貼了一條黑色膠帶,當往地面指的光感應器經過了這條黑線,光感應器就會回傳不同的反應值,由此機器人就可以判斷左右行走的策略。一般的程式應該會有像這樣的邏輯:
while
if (lightsensor <= threshold)
turn left
else
turn right
當然,只用光感應器會有一些限制…光感應器的感測距離沒有很遠,接收器離地面的距離通常要在5cm以內才能擷取到有意義的反應。換言之,機器人必須已經接近軌道才能去追隨它。假設機器人離軌道還有一段距離,那這該怎麼辦呢?
理想中,如果我們有個相機能夠往前方拍攝,這樣機器人說不定就能夠「預測」軌道的位置,如果機器人離軌道還有一段距離,它就可以自主搜尋軌道方向並往其方向前進。(*為達到這目的當然還有很多其它做法,不過以這次的分享我們先以影像來探討解決方案。)
用相機來拍聽起來很簡單,但是整個演算法計算過程其實是有很多要考量的。我們可以先把這問題先簡化 … 在之前的文章我有分享過用LabVIEW做影像物件追蹤 (ex 1 2。) 基本概念是,如果可以取得物件的X座標,那麼我們可以拿這座標和畫面的中心點做比對,例如一張640x480的畫面的橫軸中心點為320 (因為640/2=320),如果物件的X座標是400,那機器人應該要往右轉,若座標為200,那就應該要左轉,這時候機器人的行為就會像之前的LEGO NXT循跡機器人,它會隨著物件的相對位置來調整它的行走方向。
如果我們要追蹤的是一條線而不是一個單一物件,我們必須要先對畫面做些前處理。在之前的物件範例,我們把物件的位置收斂成畫面上的一個單一中心點。以線來講的話,我們可以抓這條線與畫面下方的交叉點為機器人的行走方向。為增加此範例的複雜度,我們乾脆用兩條平行的線來做示範。
在這兒先給各位看我是如何從彩色畫面中抓到線與畫面下方的交叉點位置。首先這是原始畫面(我在書房地板上貼了兩條平行的白膠帶):
1. 先進行色彩HSL二值化,將白色的物件先獨立出來。二值化的參數則是可以從Vision Assistant的互動式界面來調的。若不了解怎麼調參數,請參考這篇文章: http://riobotics.blogspot.com/2009/06/hsl.html
2. 畫面中難免會有一些其它相同顏色的物件,這時候再用個Convex Hull函式,把小物件和雜訊添滿。
3. 看起來我們的「線」和其它的物件有個很明顯的差異,「線」看起來都是細細長長的,只要不是「線」的物件都看起來圓圓肥肥的。NI Vision的particle filter函式裡面有個篩選條件叫做elongation factor,意思是說,越細越長的物件,它的elongation factor的分數會越高。我們可以用particle filter把elongation分數較低的物件濾掉。
4. 嗯,看起來偶爾還是會有漏網之魚。左邊多出來的物件應該可以靠它的高度(Height)把它濾掉,也是一樣用particle filter。
5. 呼,畫面經過了一番處理,終於只剩下我們需要的兩條線了。我們可以再用Particle Analysis的Max Feret Diameter Start和Max Feret Diameter End把線的兩端X,Y回傳回來。如果需要的話,可以再加一個Bisecting Line含式來計算兩條線之間的中心線。再加一些overlay的含式,就可以把這些資料重疊在畫面上。現在所回傳的三個數據是線與畫面下方邊緣交叉的X座標。
現在是還沒有時間把這個演算法套在一個實際車體上來測試,不過近期之內應該會完成,到時候會拍幾個影片給大家參考。基本上,只要把中心線的X座標鎖定在畫面的中心320,車體就會隨著軌道的方向進行了。
軌跡追蹤 Vision Assistant 範例.zip
軌跡追蹤 LabVIEW 範例.zip
(這個LabVIEW的檔案會比較大,差不多80MB,因為我有附了一些測試的AVI影片)
-John
(4/14/2011 更新:)
以上演算法實際上到底跑起來效果如何呢? 我們在一個小型的機器人平臺上 Easy Robot來驗證演算法這個演算法的實用性。我們先用一條線來代表軌跡。在影片裡,請注意當機器人尋找軌跡時,後面的惰輪幾乎是完全壓在線上的,代表此機器人的準確度。
嗯,測試結果比想像中的還好。可以出貨了!
-John