myCobot 280 Pi 是一款 6 自由度多功能桌面機械臂。它由大象機器人研發,使用 Raspberry Pi 作為主控制器。該機器人結構緊湊,運行穩定,非常適合新手入門。它還可以使用多種語言進行編程,簡單易用,功能豐富。適合那些有興趣學習如何對機械臂進行編程控制和項目開發的人。
myCobot 280 Pi開箱
myCobot 280 Pi 機械臂工作半徑為 280 毫米,本體重量為 850 克,可處理高達 250 克的有效載荷。它由 6 個伺服電機驅動,每個自由度一個,配備矩陣5×5 LED 顯示屏,末端 Lego接口可接各種傳感器。
MyCobot 280 采用樹莓派微處理器,可以搭配任意攝像頭進行圖像識別,具有4個 USB 端口,可以通過 Raspberry Pi 的微型 HDMI 端口連接到顯示器. 最后,40 個GPIO 接頭可以進行更多擴展應用,機械臂每個接口都有清晰的標記,面板上還有一個電源開關和一個直流電源插孔。
MicroSD 卡插槽位于 MyCobot 280 Pi 機械臂下方。
包裝中還有一個100-240V~50/60Hz 1.2A 電源線,具有 8-12V輸出高達 5A(42 瓦)。
myCobot 套裝中的其他配件包括:
myCobot-平面底座
4 個硅膠吸盤,確保底座牢固地固定在桌面上
myCobot 攝像頭
myCobot 吸泵
各種連接線
樂高連接件
如何將機械臂連接到平面底座上
組裝很簡單。只需將吸盤插入四個角的安裝孔中,然后用塑料螺絲頭固定即可。
這是完成后的樣子。
提供的樂高連接件,讓您可以輕松地將底座連接到 myCobot 280 Pi 機械臂。
根據需要在安裝板插槽中插入一些樂高連接件。
最后,將 myCobot 280 Pi 機械臂放在底座頂部,確保其與螺紋和樂高連接件對齊。您現在可以將機器人放在地板或桌子上,并用力擰緊吸盤,以確保機械臂的底座在操作過程中不會移動。最好將它放在光滑的表面上,例如玻璃或大理石。
myCobot 280 Pi 附帶 Ubuntu Linux 操作系統,可以使用 myBlockly 可視化編程或者Python 進行編程。
Python
myCobot 280 Pi 可使用 Python 編程,增加了使用攝像頭檢測物體的能力,并支持用于人工智能、圖像處理和機器學習的 OpenCV 庫。
機器人操作系統(ROS)依靠Rviz 模擬機械臂的運動,通過ROS遠程控制機械臂。
使用 MyBlockly 對 MyCobot 280 Pi 機械臂進行編程
MyBlockly 是一個完全可視化的模塊化編程軟件,用戶可以通過拖曳模塊,來構建代碼邏輯,過程很像搭積木,而不是手動編寫基于文本的代碼。如此一來,復雜又抽象的編程語言就變得容易理解。這些模塊包括邏輯、循環、數學、文本、列表、顏色、變量、函數以及控制機械臂的函數等等,所以用戶可以輕松入門編程,只需單擊右上角的運行就可以啟動程序,做一些有趣的應用。
MyBlockly 中的時間
操作機械臂運動的程序是需要時間來完成的,所以在一個動作之后需要接上一個睡眠模塊,給機械臂運動的時間再進行下一個運動。睡眠模塊允許您以秒為單位添加延遲。
樹莓派-GPIO
這組模塊控制 GPIO(通用輸入/輸出)。它用于在輸出模式下將任何 Raspberry Pi GPIO 引腳設置為高電平或低電平或將它們配置為輸入。
ATOM IO
這模塊控制著機械臂末端的 5×5 LED 矩陣。您可以更改每個 LED 的 RGB 數據(紅色、藍色、綠色)的值,也可以使用 PWM 控制。
LED 的顏色將根據我們輸入的數據而變化。
狀態
一組針對于 MyCobot 280 Pi機械臂的模塊,主要用于打開或關閉機械臂電源、檢查工作狀態以及釋放所有伺服系統。
MDI運行和操作
這些模塊控制機械臂在每個軸上的運動程度。可以同時輸入數據,包括速度控制,或者如果您愿意,可以使用協調模式。這使得對機械臂進行編程非常容易。
點動控制
控制機械臂在每個軸上的移動程度。
運行狀態和設置
可以設置機械臂的速度,查詢當前速度,以及特定關節的最小和最大角度。
找到機械臂在每個軸上的角度
我們可以通過從程序中讀取值來找到每個軸的角度。這個功能有助于減少通過單擊右上角來查找角度的時間。
將彈出一個窗口。我們可以手動調整機械臂的角度,點擊Read Angles讀取角度按鈕。這些值將自動輸入到“設置角度”模塊中。
MyCobot 280 Pi 精度測試
我們測試了 myCobot 280 Pi 機械臂的運動精度,測量精度為 +/– 0.5。在測試中,將畫出5種不同顏色的圓圈,同時更改機械臂末端 LED 矩陣顯示屏以匹配該顏色圓圈,如下面的視頻所示。
https://www.bilibili.com/video/BV1JP4y197ZY/?spm_id_from=333.999.0.0&vd_source=bb3d7739950ffca01b2e2089b2a5c22a
myCobot 吸泵
吸附物體使用,可以通過吸力提升和移動物體,從而增強 myCobot 280 Pi 機械臂的拓展能力。使用 吸泵舉起的物體的最大重量為 250 克。
吸泵亮點
功能——吸住物體以提起和移動它們
被提升物體的最大重量 – 250 克
材料 – 光聚合物/尼龍
顏色-白色
尺寸 – 94 x 74 x 51 毫米
重量 – 220 克
將吸泵安裝到 myCobot 280 Pi
吸泵,通過吸泵控制套件作為機械臂的末端執行器,執行吸附物體的功能,吸泵提供樂高連接件插入的孔位,接上末端ATOM
將吸泵盒連接到機械臂底座IO接口
我們仍然需要將吸泵盒連接到機械臂底部接口。可以通過將四根杜邦線連接到 Raspberry Pi的 GPIO 接頭連接器來完成:5V、GND、G2 (GPIO21)、G5 和 (GPIO22)。
我們將使用插入 GPIO 接頭的公杜邦電纜,即 5V、GND、G2 連接到 GPIO21,G5 連接到 GPIO22。
將 myCobot 吸泵與 myBlockly 結合使用
讓我們進入 Raspi-GPIO 菜單,并選擇“Set Mode BCM”模塊以使用 Set pin 命令模塊將引腳 20 和 21 作為輸出 (OUT)。
兩組模塊用于控制 myCobot吸泵
為了使吸泵工作,我們將引腳 20 和 21 設置為高電平
為了阻止它,我們將引腳 20 和 21設置為低電平。
這就是啟用和禁用 myCobot吸泵 所需的全部內容。
吸泵升降復位測試
我們通過將特定顏色的積木塊移動到相同顏色的填充圓來測試機械臂與吸泵同時工作的狀態。我們已經注意到,如果物體很重,則需要一段時間才能吸住物體,如果物體很輕,則需要一些時間才能將其釋放。但是從下面的測試視頻中可以看出,機械臂和吸泵可以非常準確地工作。
https://www.bilibili.com/video/BV1g8411j7k9/?spm_id_from=333.999.0.0
MyCobot 280 攝像頭
該攝像頭重量輕,可以在幾分鐘內輕松安裝到機械臂上。它基本上是即插即用的,緊湊的設計意味著您不必擔心它會占用太多空間。USB 2.0彩色攝像頭最高支持720p高清分辨率,色彩廣角,適用于人臉識別、智慧屏、智能快遞、自動售貨機、條碼/二維碼掃描、門禁、醫療設備等。
將 myCobot 吸泵和 攝像頭安裝到 myCobot 280 Pi
我們現在將 MyCobot 280攝像頭連接到 myCobot 吸泵,方法是首先將樂高連接器插入吸泵……
在將其插入相機之前,我們將向其添加更多 LEGO 連接器
以便將其安裝在 MyCobot 280 Pi 機械臂上。
完美安裝!非常簡單。
使用 pip 安裝 OpenCV 和 Numpy
我們需要安裝庫,即 OpenCV 和 Numpy,以便在機器人上運行圖像處理工作負載。我們可以通過機器人操作系統中的終端安裝它們。
OpenCV是一個流行的基本圖像處理庫,例如模糊、混合、增強圖像質量、提高視頻質量、圖像識別、圖像和視頻中的人臉檢測,以及我們將在本項目/評論中使用的顏色識別.
1 | pip install opencv-python |
Numpy是一個 Python 擴展模塊,具有通常用于數據集(數組)和矩陣操作的數學函數。
1 | pip install numpy |
圖像閾值
閾值處理是將對象與背景圖像分離的技術之一。這是通過獲取灰度圖像并將其轉換為像素值為 0(黑色)或 255(同時)的二值圖像來工作的,并使用用于將圖像的每個像素分類為黑色或白色的恒定閾值。我在 VSCode 中編寫了一個 Python 程序,可以檢測具有 3 種不同顏色的對象。程序的下一步將首先嘗試使用相機輸入找到紅色物體。為紅色定義了以下下限和上限范圍:lowerR = np.array([142, 114, 181]) 和 upperR = np.array([194, 255, 255])
對于藍色對象,我們將使用以下值:lowerB = np.array([83, 228, 206]) 和 upperB = np.array([106, 255, 255])
最后,這里是綠色對象的值: lowerG = np.array([54, 82, 228]) upperG = np.array([81, 255, 255])
Python 中的閾值示例代碼
導入了兩個模塊:cv2 用于處理圖像,numpy 用于處理數組和矩陣。
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 對物體進行分類(顏色分類)
我們將使 myCobot 280 Pi 機械臂與傳送帶一起工作,以對不同顏色的物體進行分類。該項目由兩部分組成:
傳送帶依靠 Arduino 板來控制其電機,程序/草圖檢查傳感器的狀況以根據傳送帶位置測量物體的停止距離。
myCobot 280 Pi 使用圖像閾值檢測顏色,并使用吸泵選擇紅色、藍色或綠色對象并將其移動到相同顏色的桶中。設置了四個位置:
1、紅框位置
2、藍框位置
3、綠框位置
4、在方便 myCobot 280 Pi 的位置檢測彩色物體的初始位置。我們可以將機械臂移動到那個位置,從Serial Monitor中讀取數值,并將得到的數值放入程序中,這是一個很好的尋找不同位置的點
myCobot 280 Pi 顏色識別示例代碼
調用庫MyCobot來控制機械臂,庫RPi.GPIO用于啟用/禁用吸泵,cv2庫用于操作圖像,numpy用于操作數組和矩陣。
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 具有很多功能。它適合機器人教育的初學者,起價為5999元,可用于從高中到大學的教學。myCobot 280 Pi 機械臂也是學習工業機器人入門首選。正如您將從我們上面的示例中看到的那樣,編寫程序來讀取手臂的角度非常容易,它還可以用于研究正向和逆向運動學來控制機器人。
審核編輯黃昊宇
-
機器人
+關注
關注
211文章
28466瀏覽量
207306 -
python
+關注
關注
56文章
4797瀏覽量
84745 -
機械臂
+關注
關注
12文章
515瀏覽量
24609 -
樹莓派
+關注
關注
116文章
1708瀏覽量
105683
發布評論請先 登錄
相關推薦
評論