Mobot#
文章作者:Cosku Acay、Edwin Cho、Kenneth Li 與 Nishant Pol。PDF。
專案說明#
在卡內基美隆的 Mobot 競賽中,機器人必須通過一系列 14 個閘門,這些閘門設置在戶外人行道上一條 255 英尺長的彎曲白線上方。賽道包括兩個陡峭的斜坡,以及一個決策點區域,機器人必須在此選擇正確的路線,才能依序通過 14 個閘門。由於這條線位於戶外並受匹茲堡天氣的影響,機器人必須在各種條件下運作。今年競賽當天下著雨且颳著風。更多資訊請見 http://www.cs.cmu.edu/mobot/mobot.html


使用 CMUcam4 的解決方案#
我們選擇使用 CMUcam4 來處理循線任務,因為它所需的硬體最少,而且具有非常適合追蹤線條的介面。

CMUcam4 以每秒 30 個畫格擷取線條的影像,並透過三條序列線路之一將色彩追蹤影像饋送給 Arduino Mega。接著 Arduino Mega 處理這個影像(請參閱下方的軟體說明),並透過另一條序列線路將馬達速度與轉向命令傳送給 PID 控制器。PID 控制器則反過來向 Arduino Mega 提供左右兩輪的編碼器計數,這讓我們能夠追蹤相對於 gate 0 的位置與航向。
PID 控制器(MD-25)由英國的 Robot-Electronics 製造。它驅動兩個帶有馬達軸磁性編碼器的齒輪式直流有刷馬達。LCD 螢幕用於除錯目的。我們有兩條電源軌,12V 供馬達、5V 供邏輯電路,共用同一個接地,兩者皆由單一的 12V 充電電池供電。
我們最初計劃用木製底座製作一個原型,好讓我們快速進入程式設計階段,然後再打造一個更快、更可靠的底座,例如一台遙控車。然而,我們發現這個原型非常可靠且容易使用,因此我們將它保留為最終設計。車身的防水處理由一層玻璃紙包裝下再蓋一層封箱膠帶所構成。不過雨水會滲過封箱膠帶,所幸並未滲過玻璃紙包裝。相機被一片來自 Ziploc 夾鏈袋的方形塑膠所覆蓋,因為我們發現這個「濾鏡」提升了相機忽略線條上小塊斑點的能力,那些斑點在相機看來就像是背景的混凝土。
演算法說明#
背景#
我們在啟用 YUV 模式的色彩追蹤模式下使用 CMUcam4,這會給我們一個線條的二值影像表示。相機軟體會濾除任何非白色的東西(即背景),並在有線條之處(即白色之處)放置一個「on」像素。我們使用 YUV 模式,好讓色彩追蹤對光線強度不敏感,如此我們的機器人就能在包括室內與室外在內的各種各樣條件下運作。
循線#
CMUcam4 為我們的 Arduino 晶片提供一個 80 乘 60 的二值影像。我們從影像中取樣 10 列等間距的像素,並計算「on」像素的形心(請參閱此處:https://en.wikipedia.org/wiki/Centroid#Of_a_finite_set_of_points)。接著我們假設線條位於該形心上。透過在影像中 10 個不同的列上進行此操作,我們便可藉由連接這些點而得到線條的良好近似。然後我們可以運用這些資料,找出線上每個點與位於影像中央的垂直線之間的距離,以得到一個代表線條彎曲程度的值。這可以視為類似於找出切線與曲線之間的面積,並利用該面積來決定我們需要轉多少。正負號決定是向左還是向右轉,而其大小則決定為了循線我們需要轉多少。正如您所料,如果我們測得的面積為零,那麼線條就正好在機器人的正前方,而且是一條直線。如果面積的大小很大,那麼機器人就需要轉向以持續嘗試將此面積的大小最小化。
決策點#
若要判斷機器人是否處於決策點,我們會取用相機從循線所蒐集的資料,並檢查有多少個平均中心點出現在黑色空間中。這是基於以下假設運作的:兩條線之間的平均點不應落在任一條線上,除非這兩條線是同一條線。如果機器人在黑色空間中偵測到多個平均點,它就可以斷定此處必定有兩條線。然後它會選擇適當的轉向,並將其轉向偏向該方向,直到它只看到一條線為止。
請前往 https://github.com/cacay/Mobot 查看我們程式碼的簡化版本,或 這裡 取得本機複本。

