myCobot 280 Pi 是一款 6 自由度多功能桌面機(jī)械臂。它由大象機(jī)器人研發(fā),使用 Raspberry Pi 作為主控制器。該機(jī)器人結(jié)構(gòu)緊湊,運(yùn)行穩(wěn)定,非常適合新手入門。它還可以使用多種語言進(jìn)行編程,簡單易用,功能豐富。適合那些有興趣學(xué)習(xí)如何對(duì)機(jī)械臂進(jìn)行編程控制和項(xiàng)目開發(fā)的人。
myCobot 280 Pi開箱
myCobot 280 Pi 機(jī)械臂工作半徑為 280 毫米,本體重量為 850 克,可處理高達(dá) 250 克的有效載荷。它由 6 個(gè)伺服電機(jī)驅(qū)動(dòng),每個(gè)自由度一個(gè),配備矩陣5×5 LED 顯示屏,末端 Lego接口可接各種傳感器。
MyCobot 280 采用樹莓派微處理器,可以搭配任意攝像頭進(jìn)行圖像識(shí)別,具有4個(gè) USB 端口,可以通過 Raspberry Pi 的微型 HDMI 端口連接到顯示器. 最后,40 個(gè)GPIO 接頭可以進(jìn)行更多擴(kuò)展應(yīng)用,機(jī)械臂每個(gè)接口都有清晰的標(biāo)記,面板上還有一個(gè)電源開關(guān)和一個(gè)直流電源插孔。
MicroSD 卡插槽位于 MyCobot 280 Pi 機(jī)械臂下方。
包裝中還有一個(gè)100-240V~50/60Hz 1.2A 電源線,具有 8-12V輸出高達(dá) 5A(42 瓦)。
myCobot 套裝中的其他配件包括:
myCobot-平面底座
4 個(gè)硅膠吸盤,確保底座牢固地固定在桌面上
myCobot 攝像頭
myCobot 吸泵
各種連接線
樂高連接件
如何將機(jī)械臂連接到平面底座上
組裝很簡單。只需將吸盤插入四個(gè)角的安裝孔中,然后用塑料螺絲頭固定即可。
這是完成后的樣子。
提供的樂高連接件,讓您可以輕松地將底座連接到 myCobot 280 Pi 機(jī)械臂。
根據(jù)需要在安裝板插槽中插入一些樂高連接件。
最后,將 myCobot 280 Pi 機(jī)械臂放在底座頂部,確保其與螺紋和樂高連接件對(duì)齊。您現(xiàn)在可以將機(jī)器人放在地板或桌子上,并用力擰緊吸盤,以確保機(jī)械臂的底座在操作過程中不會(huì)移動(dòng)。最好將它放在光滑的表面上,例如玻璃或大理石。
myCobot 280 Pi 附帶 Ubuntu Linux 操作系統(tǒng),可以使用 myBlockly 可視化編程或者Python 進(jìn)行編程。
Python
myCobot 280 Pi 可使用 Python 編程,增加了使用攝像頭檢測(cè)物體的能力,并支持用于人工智能、圖像處理和機(jī)器學(xué)習(xí)的 OpenCV 庫。
機(jī)器人操作系統(tǒng)(ROS)依靠Rviz 模擬機(jī)械臂的運(yùn)動(dòng),通過ROS遠(yuǎn)程控制機(jī)械臂。
使用 MyBlockly 對(duì) MyCobot 280 Pi 機(jī)械臂進(jìn)行編程
MyBlockly 是一個(gè)完全可視化的模塊化編程軟件,用戶可以通過拖曳模塊,來構(gòu)建代碼邏輯,過程很像搭積木,而不是手動(dòng)編寫基于文本的代碼。如此一來,復(fù)雜又抽象的編程語言就變得容易理解。這些模塊包括邏輯、循環(huán)、數(shù)學(xué)、文本、列表、顏色、變量、函數(shù)以及控制機(jī)械臂的函數(shù)等等,所以用戶可以輕松入門編程,只需單擊右上角的運(yùn)行就可以啟動(dòng)程序,做一些有趣的應(yīng)用。
MyBlockly 中的時(shí)間
操作機(jī)械臂運(yùn)動(dòng)的程序是需要時(shí)間來完成的,所以在一個(gè)動(dòng)作之后需要接上一個(gè)睡眠模塊,給機(jī)械臂運(yùn)動(dòng)的時(shí)間再進(jìn)行下一個(gè)運(yùn)動(dòng)。睡眠模塊允許您以秒為單位添加延遲。
樹莓派-GPIO
這組模塊控制 GPIO(通用輸入/輸出)。它用于在輸出模式下將任何 Raspberry Pi GPIO 引腳設(shè)置為高電平或低電平或?qū)⑺鼈兣渲脼檩斎搿?/p>
ATOM IO
這模塊控制著機(jī)械臂末端的 5×5 LED 矩陣。您可以更改每個(gè) LED 的 RGB 數(shù)據(jù)(紅色、藍(lán)色、綠色)的值,也可以使用 PWM 控制。
LED 的顏色將根據(jù)我們輸入的數(shù)據(jù)而變化。
狀態(tài)
一組針對(duì)于 MyCobot 280 Pi機(jī)械臂的模塊,主要用于打開或關(guān)閉機(jī)械臂電源、檢查工作狀態(tài)以及釋放所有伺服系統(tǒng)。
MDI運(yùn)行和操作
這些模塊控制機(jī)械臂在每個(gè)軸上的運(yùn)動(dòng)程度??梢酝瑫r(shí)輸入數(shù)據(jù),包括速度控制,或者如果您愿意,可以使用協(xié)調(diào)模式。這使得對(duì)機(jī)械臂進(jìn)行編程非常容易。
點(diǎn)動(dòng)控制
控制機(jī)械臂在每個(gè)軸上的移動(dòng)程度。
運(yùn)行狀態(tài)和設(shè)置
可以設(shè)置機(jī)械臂的速度,查詢當(dāng)前速度,以及特定關(guān)節(jié)的最小和最大角度。
找到機(jī)械臂在每個(gè)軸上的角度
我們可以通過從程序中讀取值來找到每個(gè)軸的角度。這個(gè)功能有助于減少通過單擊右上角來查找角度的時(shí)間。
將彈出一個(gè)窗口。我們可以手動(dòng)調(diào)整機(jī)械臂的角度,點(diǎn)擊Read Angles讀取角度按鈕。這些值將自動(dòng)輸入到“設(shè)置角度”模塊中。
MyCobot 280 Pi 精度測(cè)試
我們測(cè)試了 myCobot 280 Pi 機(jī)械臂的運(yùn)動(dòng)精度,測(cè)量精度為 +/– 0.5。在測(cè)試中,將畫出5種不同顏色的圓圈,同時(shí)更改機(jī)械臂末端 LED 矩陣顯示屏以匹配該顏色圓圈,如下面的視頻所示。
https://www.bilibili.com/video/BV1JP4y197ZY/?spm_id_from=333.999.0.0&vd_source=bb3d7739950ffca01b2e2089b2a5c22a
myCobot 吸泵
吸附物體使用,可以通過吸力提升和移動(dòng)物體,從而增強(qiáng) myCobot 280 Pi 機(jī)械臂的拓展能力。使用 吸泵舉起的物體的最大重量為 250 克。
吸泵亮點(diǎn)
功能——吸住物體以提起和移動(dòng)它們
被提升物體的最大重量 – 250 克
材料 – 光聚合物/尼龍
顏色-白色
尺寸 – 94 x 74 x 51 毫米
重量 – 220 克
將吸泵安裝到 myCobot 280 Pi
吸泵,通過吸泵控制套件作為機(jī)械臂的末端執(zhí)行器,執(zhí)行吸附物體的功能,吸泵提供樂高連接件插入的孔位,接上末端ATOM
將吸泵盒連接到機(jī)械臂底座IO接口
我們?nèi)匀恍枰獙⑽煤羞B接到機(jī)械臂底部接口。可以通過將四根杜邦線連接到 Raspberry Pi的 GPIO 接頭連接器來完成:5V、GND、G2 (GPIO21)、G5 和 (GPIO22)。
我們將使用插入 GPIO 接頭的公杜邦電纜,即 5V、GND、G2 連接到 GPIO21,G5 連接到 GPIO22。
將 myCobot 吸泵與 myBlockly 結(jié)合使用
讓我們進(jìn)入 Raspi-GPIO 菜單,并選擇“Set Mode BCM”模塊以使用 Set pin 命令模塊將引腳 20 和 21 作為輸出 (OUT)。
兩組模塊用于控制 myCobot吸泵
為了使吸泵工作,我們將引腳 20 和 21 設(shè)置為高電平
為了阻止它,我們將引腳 20 和 21設(shè)置為低電平。
這就是啟用和禁用 myCobot吸泵 所需的全部內(nèi)容。
吸泵升降復(fù)位測(cè)試
我們通過將特定顏色的積木塊移動(dòng)到相同顏色的填充圓來測(cè)試機(jī)械臂與吸泵同時(shí)工作的狀態(tài)。我們已經(jīng)注意到,如果物體很重,則需要一段時(shí)間才能吸住物體,如果物體很輕,則需要一些時(shí)間才能將其釋放。但是從下面的測(cè)試視頻中可以看出,機(jī)械臂和吸泵可以非常準(zhǔn)確地工作。
https://www.bilibili.com/video/BV1g8411j7k9/?spm_id_from=333.999.0.0
MyCobot 280 攝像頭
該攝像頭重量輕,可以在幾分鐘內(nèi)輕松安裝到機(jī)械臂上。它基本上是即插即用的,緊湊的設(shè)計(jì)意味著您不必?fù)?dān)心它會(huì)占用太多空間。USB 2.0彩色攝像頭最高支持720p高清分辨率,色彩廣角,適用于人臉識(shí)別、智慧屏、智能快遞、自動(dòng)售貨機(jī)、條碼/二維碼掃描、門禁、醫(yī)療設(shè)備等。
將 myCobot 吸泵和 攝像頭安裝到 myCobot 280 Pi
我們現(xiàn)在將 MyCobot 280攝像頭連接到 myCobot 吸泵,方法是首先將樂高連接器插入吸泵……
在將其插入相機(jī)之前,我們將向其添加更多 LEGO 連接器
以便將其安裝在 MyCobot 280 Pi 機(jī)械臂上。
完美安裝!非常簡單。
使用 pip 安裝 OpenCV 和 Numpy
我們需要安裝庫,即 OpenCV 和 Numpy,以便在機(jī)器人上運(yùn)行圖像處理工作負(fù)載。我們可以通過機(jī)器人操作系統(tǒng)中的終端安裝它們。
OpenCV是一個(gè)流行的基本圖像處理庫,例如模糊、混合、增強(qiáng)圖像質(zhì)量、提高視頻質(zhì)量、圖像識(shí)別、圖像和視頻中的人臉檢測(cè),以及我們將在本項(xiàng)目/評(píng)論中使用的顏色識(shí)別.
1 | pip install opencv-python |
Numpy是一個(gè) Python 擴(kuò)展模塊,具有通常用于數(shù)據(jù)集(數(shù)組)和矩陣操作的數(shù)學(xué)函數(shù)。
1 | pip install numpy |
圖像閾值
閾值處理是將對(duì)象與背景圖像分離的技術(shù)之一。這是通過獲取灰度圖像并將其轉(zhuǎn)換為像素值為 0(黑色)或 255(同時(shí))的二值圖像來工作的,并使用用于將圖像的每個(gè)像素分類為黑色或白色的恒定閾值。我在 VSCode 中編寫了一個(gè) Python 程序,可以檢測(cè)具有 3 種不同顏色的對(duì)象。程序的下一步將首先嘗試使用相機(jī)輸入找到紅色物體。為紅色定義了以下下限和上限范圍:lowerR = np.array([142, 114, 181]) 和 upperR = np.array([194, 255, 255])
對(duì)于藍(lán)色對(duì)象,我們將使用以下值:lowerB = np.array([83, 228, 206]) 和 upperB = np.array([106, 255, 255])
最后,這里是綠色對(duì)象的值: lowerG = np.array([54, 82, 228]) upperG = np.array([81, 255, 255])
Python 中的閾值示例代碼
導(dǎo)入了兩個(gè)模塊:cv2 用于處理圖像,numpy 用于處理數(shù)組和矩陣。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
import cv2 import numpy as np def nothing(x): pass cv2.namedWindow("Tracking") cv2.createTrackbar("LH", "Tracking", 0, 255, nothing) cv2.createTrackbar("LS", "Tracking", 0, 255, nothing) cv2.createTrackbar("LV", "Tracking", 0, 255, nothing) cv2.createTrackbar("UH", "Tracking", 255, 255, nothing) cv2.createTrackbar("US", "Tracking", 255, 255, nothing) cv2.createTrackbar("UV", "Tracking", 255, 255, nothing) vs = cv2.VideoCapture(0) while True: _, frame = vs.read() hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) l_h = cv2.getTrackbarPos("LH", "Tracking") l_s = cv2.getTrackbarPos("LS", "Tracking") l_v = cv2.getTrackbarPos("LV", "Tracking") u_h = cv2.getTrackbarPos("UH", "Tracking") u_s = cv2.getTrackbarPos("US", "Tracking") u_v = cv2.getTrackbarPos("UV", "Tracking") l_b = np.array([l_h, l_s, l_v]) u_b = np.array([u_h, u_s, u_v]) mask = cv2.inRange(hsv, l_b, u_b) res = cv2.bitwise_and(frame, frame, mask=mask) cv2.imshow("frame", frame) cv2.imshow("mask", mask) cv2.imshow("res", res) key = cv2.waitKey(1) if key == 27: break cv2.destroyAllWindows() |
使用帶有傳送帶的 myCobot 280 Pi 對(duì)物體進(jìn)行分類(顏色分類)
我們將使 myCobot 280 Pi 機(jī)械臂與傳送帶一起工作,以對(duì)不同顏色的物體進(jìn)行分類。該項(xiàng)目由兩部分組成:
傳送帶依靠 Arduino 板來控制其電機(jī),程序/草圖檢查傳感器的狀況以根據(jù)傳送帶位置測(cè)量物體的停止距離。
myCobot 280 Pi 使用圖像閾值檢測(cè)顏色,并使用吸泵選擇紅色、藍(lán)色或綠色對(duì)象并將其移動(dòng)到相同顏色的桶中。設(shè)置了四個(gè)位置:
1、紅框位置
2、藍(lán)框位置
3、綠框位置
4、在方便 myCobot 280 Pi 的位置檢測(cè)彩色物體的初始位置。我們可以將機(jī)械臂移動(dòng)到那個(gè)位置,從Serial Monitor中讀取數(shù)值,并將得到的數(shù)值放入程序中,這是一個(gè)很好的尋找不同位置的點(diǎn)
myCobot 280 Pi 顏色識(shí)別示例代碼
調(diào)用庫MyCobot來控制機(jī)械臂,庫RPi.GPIO用于啟用/禁用吸泵,cv2庫用于操作圖像,numpy用于操作數(shù)組和矩陣。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
from pymycobot.mycobot import MyCobot from pymycobot import PI_BAUD, PI_PORT import RPi.GPIO as GPIO import numpy as np import time import cv2 GPIO.setmode(GPIO.BCM) GPIO.setup(20, GPIO.OUT) GPIO.setup(21, GPIO.OUT) vs = cv2.VideoCapture(0) print("Camera On: {}".format(vs.isOpened())) lR = np.array([142, 114, 181]) uR = np.array([194, 255, 255]) lG = np.array([54, 82, 228]) uG = np.array([81, 255, 255]) lB = np.array([83, 228, 206]) uB = np.array([106, 255, 255]) def pump(state): if state == 1: #On print('Pump on') GPIO.output(20, 0) GPIO.output(21, 0) elif state == 0: #Off print('Pump off') GPIO.output(20, 1) GPIO.output(21, 1) def findContour(mask): minArea = 10000 found = False x, y, w, h = 0, 0, 0, 0 contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) for pic, contour in enumerate(contours): area = cv2.contourArea(contour) if area >= minArea: x, y, w, h = cv2.boundingRect(contour) found = True break return x, y, w, h, found camera = [7.82, -15.82, -110.12, 37.7, -19.59, -123.04] preTrash = [29.0, -4.21, -78.75, -1.75, -23.2, -150.46] trashAngle, comebackAngle = [], [] pickup = [ [33.92, -5.53, -117.94, 39.63, -21.79, -133.5], [32.69, -17.57, -121.46, 52.73, -20.83, -123.31] ] trashR = [-79.27, -16.25, -85.95, 16.78, -15.11, -139.83] trashG = [-37.0, -35.41, -55.01, 13.44, -15.73, -136.66] trashB = [-55.72, -17.4, -78.83, 15.55, -12.04, -134.56] comebackR = [-75.93, -17.49, -57.04, -9.58, -21.0, -136.93] comebackB = [-51.85, -17.22, -60.29, -0.26, -20.3, -136.93] comebackG = [-35.77, -31.02, -41.3, -3.69, -19.95, -164.44] mc = MyCobot("/dev/ttyAMA0", 1000000) pump(0) time.sleep(1) while True: try: mc.set_color(255, 255, 255) mc.send_angles(camera, 40) time.sleep(2) dR, dG, dB = False, False, False while True: # Clearing buffer for i in range(30): _, frame = vs.read() _, frame = vs.read() #cv2.imwrite("a.jpg", frame) hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) maskR = cv2.inRange(hsv, lR, uR) maskG = cv2.inRange(hsv, lG, uG) maskB = cv2.inRange(hsv, lB, uB) xr, yr, wr, hr, dR = findContour(maskR) xg, yg, wg, hg, dG = findContour(maskG) xb, yb, wb, hb, dB = findContour(maskB) if dR: trashAngle = trashR comebackAngle = comebackR mc.set_color(255, 0, 0) print("Detected Red Block") cv2.rectangle(frame, (xr, yr), (xr+wr, yr+hr), (0, 0, 0), 2) elif dG: trashAngle = trashG comebackAngle = comebackG mc.set_color(0, 255, 0) print("Detected Green Block") cv2.rectangle(frame, (xg, yg), (xg+wg, yg+hg), (0, 0, 0), 2) elif dB: trashAngle = trashB comebackAngle = comebackB mc.set_color(0, 0, 255) print("Detected Blue Block") cv2.rectangle(frame, (xb, yb), (xb+wb, yb+hb), (0, 0, 0), 2) cv2.imshow("frame", frame) cv2.waitKey(1) if dR or dG or dB: break for angle in pickup: mc.send_angles(angle, 40) time.sleep(1.5) pump(1) time.sleep(1) mc.send_angles(preTrash, 40) time.sleep(1) mc.send_angles(trashAngle, 40) time.sleep(3) pump(0) time.sleep(3.5) mc.send_angles(comebackAngle, 40) time.sleep(1.5) except KeyboardInterrupt: break pump(0) time.sleep(1) mc.send_angles(pickup[1], 40) time.sleep(3) mc.release_all_servos() GPIO.cleanup() vs.release() cv2.destroyAllWindows() time.sleep(1) |
myCobot 280 Pi 具有很多功能。它適合機(jī)器人教育的初學(xué)者,起價(jià)為5999元,可用于從高中到大學(xué)的教學(xué)。myCobot 280 Pi 機(jī)械臂也是學(xué)習(xí)工業(yè)機(jī)器人入門首選。正如您將從我們上面的示例中看到的那樣,編寫程序來讀取手臂的角度非常容易,它還可以用于研究正向和逆向運(yùn)動(dòng)學(xué)來控制機(jī)器人。
審核編輯黃昊宇
-
機(jī)器人
+關(guān)注
關(guān)注
211文章
28511瀏覽量
207495 -
python
+關(guān)注
關(guān)注
56文章
4799瀏覽量
84812 -
機(jī)械臂
+關(guān)注
關(guān)注
12文章
515瀏覽量
24628 -
樹莓派
+關(guān)注
關(guān)注
117文章
1710瀏覽量
105719
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論