引言
今天我們將展示一個高度自動化的模擬場景,展示多個機械臂與傳送帶協(xié)同工作的高效分揀系統(tǒng)。在這個場景中,機械臂通過視覺識別技術(shù)對物體進行分類,并通過精確的機械操作將它們放置在指定的位置。這一系統(tǒng)不僅提高了分揀的速度和準(zhǔn)確性,還展示了現(xiàn)代自動化技術(shù)在工業(yè)領(lǐng)域的巨大潛力。無論是處理大量的日常物品,還是在復(fù)雜的工業(yè)流程中應(yīng)用,這種自動化分揀解決方案都體現(xiàn)出了極高的靈活性和效率。
場景描述
在這個高度自動化的分揀場景中,主要設(shè)備包括兩個機械臂和一條800mm的傳送帶。右側(cè)的上料機器人負(fù)責(zé)識別和抓取標(biāo)記物,并將它們放置到傳送帶上。傳送帶將標(biāo)記物運輸?shù)阶髠?cè)的下料機器人工作范圍內(nèi)。下料機器人則根據(jù)分類要求識別標(biāo)記物,并將它們有序地放置在指定區(qū)域。
放個視頻gif
接下來我們簡要介紹產(chǎn)品的相關(guān)參數(shù)
產(chǎn)品
列表中是幾個主要的產(chǎn)品。
UltraArm P340
ultraArm 是4自由度的機械臂,全身采用經(jīng)典金屬設(shè)計結(jié)構(gòu),本體占用體積只有A4紙張的一半,搭載高性能的步進電機,能夠?qū)崿F(xiàn)±0.1mm重復(fù)定位精度和高穩(wěn)定性。
高性能的步進電機能夠進行7*24的工作時長,且保持性能良好,也是比較適合高度自動化這一場景的選擇。
Conveyor belt
這個也是步進電機來進行驅(qū)動的傳送帶,需要用到Arduino mega 2560開發(fā)板來作為控制器,給物體提供運輸?shù)囊粋€設(shè)備。
USB Camera 2D
攝像頭作為機器視覺必不可少的一部分,是獲取標(biāo)記物的重要設(shè)備,usb 攝像頭,能夠提供畫面,通過各種機器視覺的算法來確定標(biāo)記物的具體位置,坐標(biāo)來反饋給機械臂去執(zhí)行抓取。
工作原理
整個項目的被分為以下幾個功能模塊,以實現(xiàn)整個自動化分揀場景。
我們具體看看各個功能模塊的功能是如何在代碼當(dāng)中實現(xiàn)的。
Visual recognition module
本次項目用的標(biāo)記物是Aruco碼,是一種廣泛使用的二進制方形標(biāo)記,主要用于增強現(xiàn)實和機器人導(dǎo)航等場景中,Aruco碼的設(shè)計使得它們在圖像中易于檢測和識別,有以下幾個特點。
1易于檢測和識別:Aruco碼的設(shè)計使得它們在圖像中易于檢測和識別
2 唯一性和抗誤識別:每個Aruco碼都有一個唯一的ID,具有一定的糾錯能力
3姿態(tài)估計:Aruco碼不僅可以用于識別和定位,還可以用于估計相機相對于標(biāo)記的姿態(tài)(位置和方向)。
4開源和易于使用:OpenCV庫提供了對Aruco碼的完整支持,包括生成、檢測和解碼。
5靈活性和多樣性:Aruco碼可以生成各種尺寸和復(fù)雜度的碼,以適應(yīng)不同的應(yīng)用需求。
6低成本:生成和使用Aruco碼的成本非常低。它們可以簡單地打印在紙上,或者制作在物體表面,不需要昂貴的硬件設(shè)備。
#導(dǎo)入庫 import cv2.aruco as aruco #加載字典 aruco_dict = aruco.Dictionary_get(aruco.DICT_6X6_250) parameters = aruco.DetectorParameters_create() #灰度處理并且識別 gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) corners, ids, rejectImaPoint = cv.aruco.detectMarkers( gray, self.aruco_dict, parameters=self.aruco_params ) #檢測Aruco碼 if len(corners) > 0: if ids is not None: id = int(ids[0][0])
姿態(tài)估計,確定Aruco碼的姿態(tài)位置,對于抓取是非常重要的,為控制算法提供反饋,調(diào)整機器人的動作。姿態(tài)估計后再進行數(shù)據(jù)的轉(zhuǎn)換和補償,計算和調(diào)整角度最終反饋位置和姿態(tài)角度。
#姿態(tài)估計 ret = cv.aruco.estimatePoseSingleMarkers( corners, 0.022, self.camera_matrix, self.dist_coeffs ) (rvec, tvec) = (ret[0], ret[1]) #位置計算 xyz = tvec[0, 0, :] xyz = [round(xyz[0]*1000 + self.pump_x, 2), round(xyz[1]*1000 + self.pump_y, 2), round(xyz[2]*1000, 2)] #旋轉(zhuǎn)向量處理 try: rvec = np.reshape(rvec, (3, 1)) except ValueError as e: print("reshape錯誤:", e) print("rvec1=", rvec) rvec = np.array([[[-2.86279729, -0.00687534, -0.05316529]]]) print("rvec2=", rvec) #計算旋轉(zhuǎn)矩陣和歐拉角 rotation_matrix, _ = cv.Rodrigues(rvec) euler_angles = cv.RQDecomp3x3(rotation_matrix)[0] yaw_angle = int(euler_angles[2]) #返回結(jié)果 for i in range(rvec.shape[0]): cv.aruco.drawDetectedMarkers(img, corners, ids) if num < 100: num += 1 elif num == 100: cv.destroyAllWindows() print("final_x:", xyz[0]) print("final_y:", xyz[1]) print("final_yaw_angle=", -yaw_angle) return xyz[0], xyz[1], -yaw_angle, id
在此之前需要進行手眼標(biāo)定,標(biāo)定的目前是確定相機與機器人末端執(zhí)行器的相對位置和姿態(tài)關(guān)系。
Robotic arm control module
ultraArm有一個python的控制庫pymycobot,安裝好環(huán)境之后即可使用,一下是簡單控制的使用
from pymycobot.ultraArm import ultraArm #創(chuàng)建實例,com為機械臂的串口號 ua = ultraArm(COM) # 角度控制 ua.send_angles([angle_list],speed) # 坐標(biāo)控制mode,控制走直線還是非直線 ua.send_coords([coords_list),speed,mode) #吸泵的使用1-open ;0-close def pub_pump(self, flag): if flag: self.ua.set_gpio_state(0) else: self.ua.set_gpio_state(1) ua.pub_pump(state)
機械臂的運動控制很簡單,只需要簡單的調(diào)用就好了,但是需要注意的是,在機械臂運動的過程中需要設(shè)計運動軌跡,不能撞到一些物體,以及根據(jù)獲取到標(biāo)記嗎的坐標(biāo)后的點位,比如說起始點位,待抓取點位等等。
Conveyor control module
傳送帶配備的步進電機通常需要通過微控制器(Arduino Mega 2560)來進行輸出控制,mega為此提供了足夠的I/O引腳和處理能力,能夠精確控制步進電機的步進和方向,從而實現(xiàn)傳送帶的啟動、停止、速度調(diào)節(jié)和方向控制。
#初始化設(shè)置 self.serial = serial.Serial(port, baudrate, timeout=1) #寫入命令 def write_command(self, command): self.serial.write(command.encode()) #設(shè)置傳送帶的方向 def set_direction(self, direction): command = f'DIR {direction}n' self.write_command(command) #設(shè)置速度 def set_speed(self, speed): command = f'SPD {speed}n' self.write_command(command) #啟動和停止 def start(self): self.write_command('STARTn') def stop(self): self.write_command('STOPn')
Data processing and communication module
在這個自動化分揀系統(tǒng)項目中,數(shù)據(jù)處理和通信是關(guān)鍵部分,為了讓他們互相知道彼此在干什么,將整體連貫起來,只要有一個地方出錯就會停止程序。
第一步-上料機器人的視覺檢測,如果發(fā)現(xiàn)檢測的物體不復(fù)合要求(擺滿),將不會執(zhí)行后續(xù)的程序。
第二步-上下料機器人協(xié)作好,上料機器人先進行拆碼垛工作,搬運到傳送帶上。
第三步-傳送帶將物體運輸?shù)较铝蠙C器人的攝像頭識別范圍和機械臂工作半徑內(nèi)。
第四步-下料機器人將物體的姿態(tài)進行識別,下料機器人得到反饋的姿態(tài)進行調(diào)整后抓去物體放置在指定區(qū)域。第五步-每當(dāng)完成六次物體的抓取后,會重新再進行一次上料機器人的視覺檢測,如果在此期間上料機器人的物體有所變化會導(dǎo)致抓取失敗。(這是邏輯上的設(shè)定,可自行更改)
while robot2.count18: data=obj.detect() while len(data)6: print("二維碼檢測數(shù)目不對,請確保二維碼在相機范圍內(nèi)并且能正確識別") time.sleep(1) data=obj.detect() for i in range(len(data)): robot.move(data[i][2],data[i][1]) conveyer.open_conveyor(100) time.sleep(5.2) conveyer.close_conveyor() for i in range(3): try: print("i=",i) pose=cam.detect() if pose is not None: break except Exception as e: if i==2: message() temp=obj.exception_handling() robot.Special_handling(temp[0][2],temp[0][1],temp[0][3]) conveyer.open_conveyor(100) time.sleep(5.2) conveyer.close_conveyor() id=robot2.move(pose[0],pose[1],pose[2],pose[3]) robot2.judge(id)
總結(jié)
本項目展示了一個基于UltraArm P340機械臂和傳送帶的自動化分揀系統(tǒng),主要應(yīng)用于教育場景,旨在教學(xué)和演示自動化分揀技術(shù)。系統(tǒng)結(jié)合計算機視覺、步進電機控制、手眼標(biāo)定和機械臂運動控制,實現(xiàn)了高效的自動化分揀流程。
如果你覺得該項目有什么可以改進的地方歡迎在下方留下評論,你的留言和支持是對我們更新最大的鼓勵。
審核編輯 黃宇
-
機器人
+關(guān)注
關(guān)注
211文章
28379瀏覽量
206908 -
開源
+關(guān)注
關(guān)注
3文章
3309瀏覽量
42471 -
機械臂
+關(guān)注
關(guān)注
12文章
513瀏覽量
24552
發(fā)布評論請先 登錄
相關(guān)推薦
評論