小笨手魔方機器人
硬體設計:
一、整體設計思路
小笨手魔方機器人採用樹莓派3b+(包括攝像頭和其他外設)+Arduino+機械臂(由PCA9685舵機驅動板和4路mg995舵機)組成的。通過樹莓派的攝像頭對魔方每個面的顏色塊組成進行識別,然後樹莓派通過計算得到出解決步驟,利用樹莓派的USB介面與Arduino連接為Arduino提供電源,並且採用串口的方式與Arduino通信,將解決步驟傳送給Arduino,Arduino對解決步驟進行分解,將控制信號同I2C匯流排發送給PCA9685舵機驅動板,舵機驅動板產生4路PWM信號同時控制由4路舵機組成的兩組機械手臂。由兩組機械手臂完成魔方還原動作。魔方還原會在8分鐘左右完成
I2C
串口
圖 1 總體設計思路
二、樹莓派3B+主要特性如下:
- 1.4GHz 64位4核 ARM Cortex-A53 CPU
- 雙頻 802.11ac 無線網卡和藍牙 4.2
- 更快的乙太網(千兆乙太網 over USB 2.0)
- 1G LPDDR2
- PoE 支持(Power-over-Ethernet,with PoE HAT)
- 改進 PXE 網路與 USB 大容量存儲啟動
- 具有HDMI和攝像頭介面
樹莓派體積小而且具有攝像頭介面,很適合用作圖像識別上。而且外圍介面豐富,在調試過程可以減少很多時間。
三、Arduino+PAC9685
下位機採用Arduino單片機,Arduino具有13個數字IO介面和5個模擬介面,並且自帶兩路PWM輸出,Arduino程序是採用燒錄的方式,可以實時的運行,而且運行時間基本一致,而樹莓派有操作系統,所以程序的執行時間很難固定,並且樹莓派的PWM信號是採用軟體的方式控制的,在某些情況下PWM信號不是特別精確很穩定,輸出不適合直接控制舵機。Arduino使用硬體的方式控制PWM輸出,所以非常適合控制舵機。但是由於需要同時控制4路舵機,所以採用PAC9685舵機驅動板。PCA9685舵機驅動板可以通過I2C匯流排控制,並且可以產生12位精度的PWM信號,並且可以級聯增加舵機的數量,驅動板可以採用外接電源, 可以為多路舵機提供穩定的電源。舵機採用輝盛mg995舵機(180度),由金屬齒輪,雙軸承 ,空杯電機構成,擁有13kg扭力,正常電壓3,4V-7.2V,運行電流為300mA,堵轉電流為1.2A。在旋轉魔方過程中會有兩個舵機處於堵轉狀態(產生的堵轉的原因會在稍後解釋),因此電流會在3A左右,為了使運行穩定,使用了5V3A直流電源給舵機驅動板供電,為舵機提供穩定的電源。樹莓派則採用5v2.5A的電源適配器供電。圖 2 Arduino UNO
圖 3 PCA9685舵機驅動板
四、機械手臂
機械手臂由兩組180度舵機構成一路舵機負責加持動作,一路舵機負責旋轉動作(旋轉角度由0度到180度,可以滿足魔方旋轉的需要),還原魔方需要對6個面分別的旋轉,因此,兩個機械手臂採用相互垂直放置,加持魔方的相鄰的兩個面,而且每個舵機加持的都是魔方的棱塊。當一個機械手臂鬆開的時候,另一個機械手臂旋轉,就可以完成魔方整體的旋轉動作,兩個機械手臂相互配合就可以使每個面都被照顧到。當兩個手臂都處於加持狀態,就可以單獨對某一面進行旋轉,而且魔方的每個面之間不會產生相對轉動。舵機的高扭矩可以為機械手臂提供較高的夾持力,防止魔方掉落,並提高旋轉魔方的速度,也可以通過提高電壓的方式提高轉速。
圖 4 整體實物圖
程序設計:
- 顏色識別
顏色識別通過樹莓派的python3 +openCV實現的,由於樹莓派沒有openCV的python3環境,openCV是通過c文件手動編譯添加到python3中。
首先利用openCV開啟樹莓派的攝像頭,通過攝像頭拍攝魔方獲取紅色方框範圍內的300*300像素大小的BGR圖像,將獲得BGR圖像轉換為HSV色域空間,HSV圖像對顏色識別非常方便,只要判斷H(色相)值的大小,就基本上可以確定顏色範圍。而BRG圖像需要同時確定B、R、G三個顏色的值,才能知道顏色範圍,很不適合確定顏色區分。
黑
灰
白
紅
橙
黃
綠
青
藍
紫
Hmin
0
0
0
0
156
11
26
35
78
100
125
Hmax
180
180
180
10
180
25
34
77
99
124
155
Smin
0
0
0
43
43
43
43
43
43
43
Smax
255
43
30
255
255
255
255
255
255
255
Vmin
0
46
221
46
46
46
46
46
46
46
Vmax
46
220
255
255
255
255
255
255
255
255
表格 1 HSV顏色空間
通過對HSV圖像進行三次卷積濾波,分別對6種目標顏色進行分離,並且將其目標轉化為白色,將其他顏色轉化為黑色,獲得6種顏色的二值化圖像,通過對6張二值化圖像上所對應魔方9個色塊區域進行檢測,判斷當前區域是否存在目標顏色。將顏色所對應的魔方位置(前面F,後面B,左面L,右面R,頂面U,底面D)轉化為字元串(UUU UUU UUU RRR RRR RRR LLL LLL LLL BBB BBB BBB FFF FFF FFF DDD DDD DDD)。
圖 5 顏色識別
- two phase演算法
two phase演算法,或者Kociembas Algorithm。wiki說,目前速度最快且解決魔方平均步驟最少的軟體是Cube Explorer。以下是按照官網上作者公開的mathematica文檔,對演算法的分析。
1.魔方狀態表示
{{{角方塊排列},{角方塊旋轉}},{{中間方塊排列},{中間方塊旋轉}}}還原狀態下的魔方,其中方塊的標號如下圖所示
[plain]
- {{{1, 2, 3, 4, 5, 6, 7, 8}, {0, 0, 0, 0, 0, 0, 0, 0}},
- {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}}
角方塊有三面,其中必有一面屬於U或D,該面朝向作為方塊旋轉標識,如果該面朝向為U或D則為0,否則按順時針旋轉數計算(好像這個地方也可以隨意定義,因為感覺演算法中用到的旋轉是相對的)
中間方塊同理,不過計算朝向的優先順序為UD>FB>LR
2.用到的列表
對還原狀態魔方分別進行18種(6個面*3)旋轉對應的魔方狀態
魔方狀態,18中操作下的轉換,魔方狀態,用排列的字典序表示,或者旋轉對應的3進位或2進位數
角方塊旋轉與9,10,11,12方塊對應位置的深度檢索表(第一階段搜索用)(A)
中間塊旋轉與9,10,11,12方塊對應位置的深度檢索表(第一階段搜索用)(B)
角方塊排列與9,10,11,12方塊排列的深度檢索表(第二階段搜索用)(C)
中間塊排列與9,10,11,12方塊排列的深度檢索表(第二階段搜索用)(D)
演算法第一階段,試圖找到使 角方塊和 中間方塊旋轉 為0 ,並且中間塊9,10,11,12 按照任意排列位於9,10,11,12的位置。演算法第二階段,用4,6,7,9,13,15,16,18這8種動作之外的動作使魔方還原。因為這8種動作會導致第一階段中已經為0的選擇變為非零,並且會使9,10,11,12四個方塊換到其他位置。兩個階段均類似於寬度優先搜索。如果第二階段動作書為0,也就是第一階段就還原了魔方,那麼這個結果是最優的。
在樹莓派上運行two phase演算法開啟了網路層,通過監聽網路埠獲得結果,並且同時開啟6個線程加快運算速度,將上一步獲得的字元串通過two phase 演算法分析之後得到解決步驟,通過串列介面將解決步驟發送給Arduino(例如解決步驟:F1 U2 R3 D3 R4……),字母代表需要旋轉的面,數字表示順時針旋轉次數,90度為一次。
- 舵機控制
Arduino採用類C語言編程,程序將接收到的解決步驟字元串拆分,從頭開始遍歷字元串,判斷當前字元串是F、R、U、L、D、B中的哪一種,然後控制舵機將舵機旋轉到機械手可以操作的位置,通過旋轉次數控制舵機旋轉魔方,當旋轉角度為90度或180度時,一隻機械手在鬆開狀態旋轉到0度後夾住魔方,然後將魔方順時針旋轉到目標角度。若旋轉角度為270度,首先將機械手鬆開旋轉到90度的位置後夾住魔方,然後逆時針旋轉到0度位置。這樣就完成了魔方某一個面的旋轉操作。
推薦閱讀:
※如何選擇機器人電機
※智伴機器人團隊,智伴是不是微商?
※AI做錯事的話,如何給機器人劃分刑事責任?
※安川2050機器人防護服
※帝聰(智能雙語機器人)