看了網路上的OOXX迷因影片這部影片後,我們這組想做一個無情的圈圈叉叉機器人。玩家在紙上畫圈圈後,這個機器人會使用webcamera拍攝紙上的情況(玩家的圈圈),再經由raspberry pi辨識圈圈,然後計算該把叉叉下在哪裡才更有機會贏玩家,最後機械手臂會在紙上畫上叉叉,一來一往完成比賽。
1. OpenCV
2. Adafruit Python PCA9685:
git clone https://github.com/adafruit/Adafruit_Python_PCA9685.git
cd Adafruit_Python_PCA9685
sudo python setup.py install
python3: sudo apt install python3
fswebcam: sudo apt-get install fswebcam
- raspberry pi環境安裝
- 組裝機器手
- 把PCA插到raspberry pi上(太小力根本插不進去!但也不用太用力,因為不用插到最緊就可以使用了。)
- 把3顆sg90馬達依照對應的顏色(黑G、紅V、黃S)插到PCA上的針腳
- 用橡皮筋把筆固定在機械手前面的爪子上(橡皮筋固定筆時要綁緊,因為機器手臂在紙上操作的頗大力,不綁緊的話筆會歪掉,不便操作)
- -> 完成!
在一張A4的空白紙上照著規格圖的規格繪製場地(一定要畫準,因為我們對精準度非常要求!)
python3 execute.py
實際遊玩結果:遊玩影片
-
原本是要用 feature matching 的方式去抓圓形物體,且也有成功,不過前提是照片畫質要夠。所以當換成用 webcamera 拍照時,畫質不夠或是沒對焦到就偵測得不太準。
所以後來改成用 template matching 的方式,不過有個問題是因為 webcamera 放置的角度不是垂直地由上而下,所以用 template matching 會變成要用很多角度的模板。
但是如果要用多個模板,就要把重複辨識的圓形過濾掉,理論上不難,但是那天半夜想了老半夜(天)。
雖然想出來可以用多個模板解決不同角度的問題,不過我之後發現有一個神之模板,可以偵測到全角度的圈圈,所以目前是採用只用單一模板辨識圈圈。 - 一開始不知如何把馬達停下來,再加上原本 adafruit 給的頻率太高(它的註解上寫 good for server motor),不過可能是因為我們是用樹梅派供電,然後,就有一顆應該是因為這樣燒壞了。
不過因為我們用不到爪子的引擎,所以就把原本裝在爪子的馬達拆掉,然後和壞掉的馬達互換。(材料給了4顆馬達,但我們只會用到3顆)
然後終於裝回去後,發現機械手臂用來栓螺絲的木板孔鬆掉,讓螺絲沒辦法很緊地鎖進去,所以就算馬達移動位置的是正確的,但是機械手臂的實際位置因為鬆鬆的所以會很不穩定。 - 有一天早上我們要繼續做的時候,原本丈量好的機械手臂要畫叉叉的座標都跑掉了,且程式碼完全沒有動。
然後當我們都準備好要全部重新量座標的時候,不小心讓馬達敲一下地板,就回到之前的狀態了,真是神奇。 - 又有一顆馬達卡死,我們把馬達的電都拔掉還是一樣。把馬達拆下來看後,發現它裡面有一帶動大齒輪的小齒輪卡死。
最大可能的原因是上面提到,一開始我們亂操馬達,可能就有一點秀斗了,所以就算後來正常跑也是會壞掉。 - 在更換馬達時,因為機械手臂結構幾乎都是連貫的,需拆解多部份零件,才能找到角度去更換。
- 馬達在長時間測試、運作下,功能開始異常,最終導致燒壞卡死。所以我們得出一結論,要避免馬達在高溫情況下運作太久,並且要注意使用壽命。
-
影像辨識和遊戲程式在整合時,因為雙方的程式都寫得蠻醜的(尤其是某人寫的函數和變數名稱!!!),所以整合和debug時弄得非常辛苦QQ,以後合作的話要寫好看點嘿
- 黃瑜楓:
- 圈叉演算法、手臂畫叉叉函式、材料購買、創意發想。
- 王冠權:
- 影像辨識、手臂畫叉叉函式、程式彙整。
- 蔣馥安:
- 程式彙整、手臂維修、材料購買、創意發想。
- 李維:
- 手臂組裝、維修、創意發想。
- 李恩榮:
- 手臂組裝、維修、創意發想。
- linux系統基本指令