
引言
今天我們將展示一個高度自動化的模擬場景,展示多個機械臂與傳送帶協同工作的高效分揀系統。在這個場景中,機械臂通過視覺識別技術對物體進行分類,并通過精確的機械操作將它們放置在指定的位置。這一系統不僅提高了分揀的速度和準確性,還展示了現代自動化技術在工業領域的巨大潛力。無論是處理大量的日常物品,還是在復雜的工業流程中應用,這種自動化分揀解決方案都體現出了極高的靈活性和效率。
場景描述
在這個高度自動化的分揀場景中,主要設備包括兩個機械臂和一條800mm的傳送帶。右側的上料機器人負責識別和抓取標記物,并將它們放置到傳送帶上。傳送帶將標記物運輸到左側的下料機器人工作范圍內。下料機器人則根據分類要求識別標記物,并將它們有序地放置在指定區域。
放個視頻gif
接下來我們簡要介紹產品的相關參數
產品
NAME | QUANTITY |
UltraArm P340 | 2 |
USB Camera 2D | 2 |
Conveyor belt | 1 |
Conveyor Controller | 1 |
Vertical suction pump | 2 |
Quick-change servos | 2 |
Kit base Plate | 1 |
列表中是幾個主要的產品。
UltraArm P340
ultraArm 是4自由度的機械臂,全身采用經典金屬設計結構,本體占用體積只有A4紙張的一半,搭載高性能的步進電機,能夠實現±0.1mm重復定位精度和高穩定性。
高性能的步進電機能夠進行7*24的工作時長,且保持性能良好,也是比較適合高度自動化這一場景的選擇。
Conveyor belt
這個也是步進電機來進行驅動的傳送帶,需要用到Arduino mega 2560開發板來作為控制器,給物體提供運輸的一個設備。
USB Camera 2D
攝像頭作為機器視覺必不可少的一部分,是獲取標記物的重要設備,usb 攝像頭,能夠提供畫面,通過各種機器視覺的算法來確定標記物的具體位置,坐標來反饋給機械臂去執行抓取。
工作原理
整個項目的被分為以下幾個功能模塊,以實現整個自動化分揀場景。
我們具體看看各個功能模塊的功能是如何在代碼當中實現的。
Visual recognition module
本次項目用的標記物是Aruco碼,是一種廣泛使用的二進制方形標記,主要用于增強現實和機器人導航等場景中,Aruco碼的設計使得它們在圖像中易于檢測和識別,有以下幾個特點。
1易于檢測和識別:Aruco碼的設計使得它們在圖像中易于檢測和識別
2 唯一性和抗誤識別:每個Aruco碼都有一個唯一的ID,具有一定的糾錯能力
3姿態估計:Aruco碼不僅可以用于識別和定位,還可以用于估計相機相對于標記的姿態(位置和方向)。
4開源和易于使用:OpenCV庫提供了對Aruco碼的完整支持,包括生成、檢測和解碼。
5靈活性和多樣性:Aruco碼可以生成各種尺寸和復雜度的碼,以適應不同的應用需求。
6低成本:生成和使用Aruco碼的成本非常低。它們可以簡單地打印在紙上,或者制作在物體表面,不需要昂貴的硬件設備。
#導入庫
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])
姿態估計,確定Aruco碼的姿態位置,對于抓取是非常重要的,為控制算法提供反饋,調整機器人的動作。姿態估計后再進行數據的轉換和補償,計算和調整角度最終反饋位置和姿態角度。
#姿態估計
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)]#旋轉向量處理
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)#計算旋轉矩陣和歐拉角
rotation_matrix, _ = cv.Rodrigues(rvec)
euler_angles = cv.RQDecomp3x3(rotation_matrix)[0]
yaw_angle = int(euler_angles[2])#返回結果
for i in range(rvec.shape[0]):cv.aruco.drawDetectedMarkers(img, corners, ids)if num < 100:num += 1elif 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
在此之前需要進行手眼標定,標定的目前是確定相機與機器人末端執行器的相對位置和姿態關系。
Robotic arm control module
ultraArm有一個python的控制庫pymycobot,安裝好環境之后即可使用,一下是簡單控制的使用
from pymycobot.ultraArm import ultraArm#創建實例,com為機械臂的串口號
ua = ultraArm(COM)# 角度控制
ua.send_angles([angle_list],speed)
# 坐標控制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)
機械臂的運動控制很簡單,只需要簡單的調用就好了,但是需要注意的是,在機械臂運動的過程中需要設計運動軌跡,不能撞到一些物體,以及根據獲取到標記嗎的坐標后的點位,比如說起始點位,待抓取點位等等。
Conveyor control module
傳送帶配備的步進電機通常需要通過微控制器(Arduino Mega 2560)來進行輸出控制,mega為此提供了足夠的I/O引腳和處理能力,能夠精確控制步進電機的步進和方向,從而實現傳送帶的啟動、停止、速度調節和方向控制。
#初始化設置
self.serial = serial.Serial(port, baudrate, timeout=1)#寫入命令
def write_command(self, command):self.serial.write(command.encode())#設置傳送帶的方向
def set_direction(self, direction):command = f'DIR {direction}\n'self.write_command(command)#設置速度
def set_speed(self, speed):command = f'SPD {speed}\n'self.write_command(command)#啟動和停止
def start(self):self.write_command('START\n')def stop(self):self.write_command('STOP\n')
Data processing and communication module
在這個自動化分揀系統項目中,數據處理和通信是關鍵部分,為了讓他們互相知道彼此在干什么,將整體連貫起來,只要有一個地方出錯就會停止程序。
第一步-上料機器人的視覺檢測,如果發現檢測的物體不復合要求(擺滿),將不會執行后續的程序。
第二步-上下料機器人協作好,上料機器人先進行拆碼垛工作,搬運到傳送帶上。
第三步-傳送帶將物體運輸到下料機器人的攝像頭識別范圍和機械臂工作半徑內。
第四步-下料機器人將物體的姿態進行識別,下料機器人得到反饋的姿態進行調整后抓去物體放置在指定區域。第五步-每當完成六次物體的抓取后,會重新再進行一次上料機器人的視覺檢測,如果在此期間上料機器人的物體有所變化會導致抓取失敗。(這是邏輯上的設定,可自行更改)
while robot2.count<18:data=obj.detect()while len(data)<6:print("二維碼檢測數目不對,請確保二維碼在相機范圍內并且能正確識別")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: breakexcept 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)
總結
本項目展示了一個基于UltraArm P340機械臂和傳送帶的自動化分揀系統,主要應用于教育場景,旨在教學和演示自動化分揀技術。系統結合計算機視覺、步進電機控制、手眼標定和機械臂運動控制,實現了高效的自動化分揀流程。
如果你覺得該項目有什么可以改進的地方歡迎在下方留下評論,你的留言和支持是對我們更新最大的鼓勵。