江毓光


● 研究問題
前不久,筆者帶領學生參加了深圳市學生創客節中的“Arduino開源機器人現場挑戰賽”,在此挑戰賽中,巡線(讓機器人小車沿規定黑色賽道行走)是其中一項最基本的內容,要實現巡線,一般采用四灰度傳感器形式(如圖1):傳感器2和3用于夾線巡跡,傳感器1和4用于判斷路口。但在實際競賽中,經常會巡線脫軌,這是受場地光線或噴繪工藝等因素的影響,灰度傳感器常將比賽圖上暗的白色區域誤判為黑色區域,或將亮的黑色區域誤判為白色區域所致。因此,如何提高巡線的成功率成為急需解決的一大難題。
● 改進策略
誤判原因:程序中的灰度閾值通常都固定取為550,但當外部因素(場地光線或噴繪工藝等)影響比賽圖上某個區域的灰度時,灰度閾值550不會隨之變化,導致程序誤判。
改進策略:在4灰度傳感器的基礎上增加一個灰度傳感器5,專門用來讀取黑線的灰度值(如圖2),從而構造出一個取代550的動態灰度閾值:動態灰度閾值=M+0.2M =1.2M(其中M為傳感器5實時讀取的黑線灰度值,加上0.2M的目的是允許一定范圍的誤差)。
● 具體做法
將傳感器1、2、3、4、5分別接在模擬口A1、A2、A3、A4、A5接口上,下文統一用A1代表模擬口A1獲取的傳感器1的灰度值,A5代表模擬口A5獲取的傳感器5的灰度值,以此類推。在ArduinoScratch軟件中,筆者用如上頁圖3所示的程序來讀取“動態灰度閾值”,并將程序定義為“讀取標準數”模塊,其中“hd”就是前面所說的“動態灰度閾值”,程序含義是:當灰度傳感器5在黑線上時,動態灰度閾值等于傳感器5實時讀取的灰度值的1.2倍,當灰度傳感器5脫離黑線時,動態灰度閾值等于灰度傳感器5離開黑線最后那一刻灰度值的1.2倍。
動態灰度閾值構造出來后,就可以將它嵌入到巡線程序中,取代灰度閾值550。原四灰度傳感器夾線巡線程序如圖4所示,修改后的程序如圖5所示:調用“讀取標準數”模塊來讀取動態灰度閾值,然后把動態灰度閾值代替圖4中的灰度閾值550即可。
同理,修改后的左轉程序如圖6所示。其中“讀取模擬口A1量” “讀取模擬口A2量”等的意義與“讀取灰色傳感器(模擬)A1”“讀取灰色傳感器(模擬)A2”等相同。程序重復調用“讀取標準數”模塊來讀取動態灰度閾值以判斷黑線。
右轉等程序在此不再一一贅述。
● 實際成效
動態灰度閾值的構造,大大優化了Arduino小車的巡線程序,既解決了場地光線或噴繪工藝等因素影響而導致的比賽圖上白色區域灰度值變低的問題,又解決了上述因素導致的黑色區域灰度值增高的問題,顯著提高了巡線的準確性和成功率。筆者應用優化后的巡線程序在各種逆反射系數、分辨率、覆膜工藝不同的比賽圖上進行多次測試,巡線成功率高達95%以上。