Ứng dụng dobot magician trong hệ thống phân loại sản phẩm Ứng dụng dobot magician trong hệ thống phân loại sản phẩm Ứng dụng dobot magician trong hệ thống phân loại sản phẩm Ứng dụng dobot magician trong hệ thống phân loại sản phẩm Ứng dụng dobot magician trong hệ thống phân loại sản phẩm Ứng dụng dobot magician trong hệ thống phân loại sản phẩm Ứng dụng dobot magician trong hệ thống phân loại sản phẩm
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH KHOA ĐÀO TẠO CHẤT LƯỢNG CAO ĐỒ ÁN TỐT NGHIỆP ỨNG DỤNG DOBOT MAGICIAN TRONG HỆ THỐNG PHÂN LOẠI SẢN PHẨM SVTH : NGUYỄN ĐỨC PHONG MSSV: 15151062 NGUYỄN VĂN VINH MSSV: 15151098 Khóa : 2015 Ngành : CNKT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA GVHD : PGS TS TRƯƠNG ĐÌNH NHƠN Thành phố Hồ Chí Minh, tháng 07 năm 2019 Khoa ĐT CLC – ĐH SPKT TP.HCM LỜI CẢM ƠN Lời đầu tiên, nhóm thực đề tài xin gửi lời cảm ơn chân thành đến PGS TS Trương Đình Nhơn tận tình giúp đỡ, giải đáp thắc mắc, hướng dẫn nhóm thực đề tài, tạo điều kiện tốt từ bố trí phịng thí nghiệm đến thiết bị vật tư suốt thời gian nhóm thực đề tài Để hồn thành tốt đồ án tốt nghiệp này, nhóm nhận giúp đỡ nhiệt tình quý thầy khoa Điện – Điện tử nói chung giảng viên ngành Điều khiển Tự động hóa nói riêng trang bị kiến thức cần thiết, đóng góp ý kiến giải đáp thắc mắc liên quan đến đề tài Nhóm xin gửi lời cảm ơn đến tập thể lớp 15151CL3 đóng góp ý kiến giúp cải thiện hệ thống, giúp đỡ nhóm suốt trình thực đề tài Xin cảm ơn gia đình bạn bè ln bên cạnh động viên, khích lệ tinh thần để nhóm hồn thành tốt nhiệm vụ Nhóm thực đề tài! Khoa ĐT CLC – ĐH SPKT TP.HCM iv TÓM TẮT Trong đề tài này, nhóm sử dụng băng chuyền để vận chuyển khối vật thể, Camera sử dụng để phân loại vật thể dựa màu sắc chúng bao gồm khâu chính: tiền xử lý liệu thu thập từ Camera so sánh, phân loại Quá trình phân loại sản phẩm thực dựa việc thu thập thông tin màu sắc, vị trí hướng vật thể thơng qua hệ thống Camera Nếu sản phẩm có màu sắc theo màu quy định đưa vào kho chứa, sản phẩm có màu sắc khác với màu quy định loại bỏ khỏi băng chuyền Sau xác định vị trí, hướng di chuyển màu sắc vật thể băng chuyền, cánh tay Robot có nhiệm vụ gắp thả vật thể vào vị trí kho chứa tương ứng với màu sắc định trước Việc phân loại sản phẩm dựa màu sắc công nghệ xử lý ảnh thực nghiệm đạt độ xác cao, nhiên hệ thống đơi lúc hoạt động cịn thiếu xác ảnh hưởng số yếu tố ánh sáng tự nhiên gây nên bóng vật thể Vì thiết bị dạng Module có sẵn, kèm với khoa Điện – Điện tử cung cấp nên nhóm khơng thực khâu thiết kế phần cứng tính tốn động học cánh tay Robot mà lắp đặt, canh chỉnh lập trình hệ thống Cuối cùng, nhóm sử dụng phần mềm Visual Studio Code để lập trình điều khiển dựa ngơn ngữ lập trình Python xử lý ảnh theo thời gian thực dựa thư viện nguồn mở OpenCV Kết thu hệ thống phân loại sản phẩm dựa màu sắc vật thể hoạt động với yêu cầu đề Khoa ĐT CLC – ĐH SPKT TP.HCM v SUMMARY In this project, we use the conveyor to move the cubes into position that robot can suck, camera for sorting the cubes based on color This sorting process includes of pre-processing data from camera, consists of color, position and direction of the cubes If the color matches with the one that we need, it will be move to storage, otherwise it will be move to trash can After collecting data including of position, color, moving direction on the conveyor, the robot will suck the cube up place it in the right position in the storage This experiment got high accuracy after running through many test, but there are some problems about contrast and shade of object that affect the result The hardware for this project are provided by the Faculty of Electrical Electronic Engineering so the work of this project is only about assembling modules, adjusting, and programming the system For programming, we user the open-source computer vision library OpenCV and Visual Studio Code for coding The final result matches the goal that we set at the beginning of the project Khoa ĐT CLC – ĐH SPKT TP.HCM vi MỤC LỤC NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP i PHIẾU NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN ii PHIẾU NHẬN XÉT CỦA GIẢNG VIÊN PHẢN BIỆN iii LỜI CẢM ƠN iv TÓM TẮT v SUMMARY vi MỤC LỤC vii DANH MỤC BẢNG BIỂU .x DANH MỤC HÌNH ẢNH x DANH MỤC TỪ VIẾT TẮT xiv CHƯƠNG TỔNG QUAN .1 1.1 Đặt vấn đề 1.2 Mục tiêu nghiên cứu 1.3 Nội dung nghiên cứu 1.4 Giới hạn đề tài CHƯƠNG CƠ SỞ LÝ THUYẾT 2.1 Nguyên lý hoạt động 2.2 Lý thuyết xử lý ảnh 2.2.1 Xử lý ảnh số .4 2.2.2 Điểm ảnh .4 2.2.3 Độ phân giải ảnh 2.2.4 Mức xám 2.2.5 Biểu diễn ảnh .6 2.2.6 Biến đổi ảnh .6 2.2.7 Phân tích ảnh .7 2.2.8 Nhận dạng phân loại ảnh 2.2.9 Các không gian màu xử lý ảnh 2.2.10 Thư viện mã nguồn mở OpenCV 10 2.3 Thuật toán phát cạnh Canny 11 Khoa ĐT CLC – ĐH SPKT TP.HCM vii 2.3.1 Giảm nhiễu 12 2.3.2 Tính độ dốc (Gradient) 13 2.3.3 Chặn không cực đại (Non-maximum suppression) 16 2.3.4 Lọc ngưỡng 18 2.3.5 Điều chỉnh cạnh độ trễ (Edge Tracking by Hysteresis) 19 2.3.6 Giải thuật AutoCanny 19 2.4 Thuật toán phát đường thẳng (Hough Transform) 21 2.4.1 Lý thuyết 21 2.4.2 Hiện thực Hough Transform phát đường thẳng 22 2.4.3 Hiện thực Hough Transform phát đoạn thẳng 24 2.5 Nhận diện vật thể hình vng 24 2.6 Nhận diện màu sắc 25 2.7 Điều khiển chuyển động Robot 26 2.7.1 Phần mềm Dobot Studio 26 2.7.2 Phần mềm Visual Studio 29 CHƯƠNG TÍNH TOÁN THIẾT KẾ 31 3.1 Yêu cầu thiết kế .31 3.2 Yêu cầu điều khiển 31 3.3 Linh kiện phần cứng 32 3.3.1 Camera .32 3.3.2 Băng tải 32 3.3.3 Cánh tay Dobot Magician 33 3.3.4 Bộ bơm khí nén đầu hút 37 3.4 Sơ đồ kết nối phần cứng 38 CHƯƠNG THI CÔNG HỆ THỐNG 40 4.1 Lắp ráp phần cứng 40 4.2 Lập trình điều khiển 41 4.2.1 Thuật toán xử lý ảnh 41 4.2.3 Chương trình điều khiển 47 4.3 Vận hành hệ thống 48 CHƯƠNG KẾT QUẢ NHẬN XÉT ĐÁNH GIÁ 52 Khoa ĐT CLC – ĐH SPKT TP.HCM viii 5.1 Kết vận hành .52 5.2 Sai số hệ thống 56 5.3 Khắc phục lỗi 61 5.3.1 Khơng gắp xác vật thể .61 5.3.2 Không nhận diện vật thể 62 5.4 Nhận xét, đánh giá 62 CHƯƠNG KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 63 6.1 Kết luận 63 6.1.1 Ưu điểm .63 6.1.2 Nhược điểm .63 6.1.3 Khó khăn 64 6.2 Hướng phát triển 64 TÀI LIỆU THAM KHẢO 66 PHỤ LỤC 68 Khoa ĐT CLC – ĐH SPKT TP.HCM ix DANH MỤC BẢNG BIỂU Bảng Chức Module giao diện điều khiển 27 Bảng 2 Các hàm điều khiển nhà sản xuất Dobot 30 Bảng Thông số kỹ thuật Camera .32 Bảng Thông số kỹ thuật băng tải .32 Bảng 3 Thông số kỹ thuật Dobot Magician 35 Bảng Thơng số góc khớp .36 Bảng Ứng dụng 36 Bảng Thông số bơm khí đầu hút 37 Bảng Tỷ lệ nhận dạng màu sắc 53 Bảng Độ lệch đầu hút so với tâm vật thể 54 Bảng Độ lệch khối vật thể kho 55 Bảng Sai số góc lệch 61 DANH MỤC HÌNH ẢNH Hình 1 Xử lý ảnh số Hình Nguyên lý hoạt động hệ thống .4 Hình 2 Mơ tả điểm ảnh Hình So sánh độ phân giải ảnh Hình Dải mức xám Hình Biến đổi ảnh màu (trái) sang ảnh xám (giữa) ảnh nhị phân (phải) Hình Nhận dạng vật thể ảnh Hình Không gian màu RGB Hình Khơng gian màu CMYK Hình Khơng gian màu HSV Hình 10 Logo OpenCV 10 Hình 11 Xử lý cạnh dùng hàm Canny 11 Hình 12 Ảnh gốc (trái) - Ảnh mờ với lọc Gaussian (phải) .13 Hình 13 Mơ tả hai hướng Gx Gy .13 Khoa ĐT CLC – ĐH SPKT TP.HCM x Hình 14 Trích chọn điểm ảnh 14 Hình 15 Ảnh mờ (trái) - Ảnh mật độ độ dốc Gradient (phải) 15 Hình 16 Biểu thị góc Gradient 15 Hình 17 Phương pháp Non-maximum suppression .16 Hình 18 Biểu diễn phương pháp NMS 16 Hình 19 Ơ màu đỏ góc bên trái .17 Hình 20 Trọng tâm đỏ 17 Hình 21 Kết sau áp dụng NMS 17 Hình 22 Lọc ngưỡng 18 Hình 23 Ảnh NMS (trái) - Ảnh lọc ngưỡng (phải) 18 Hình 24 Kết phương pháp Edge Tracking by Hysteresis .19 Hình 25 Ảnh tách biên sử dụng giải thuật AutoCanny 20 Hình 26 Hàm tách biên AutoCanny Python .20 Hình 27 Hình ảnh sử dụng phép biến đổi Hough 21 Hình 28 Đường thẳng xác định tọa độ cực 22 Hình 29 Mảng giá trị (𝜌, 𝜃) 23 Hình 30 Geo_Hough 23 Hình 31 Geo_Canny .23 Hình 32 Geo_Shape 24 Hình 33 Geo_Canny .24 Hình 34 Quy trình nhận diện 25 Hình 35 Các khối màu thực tế 25 Hình 36 Các điểm màu không gian màu .25 Hình 37 Giao diện điều khiển phần mềm Dobot Studio 26 Hình 38 Điều chỉnh hệ tọa độ Đề-các 27 Hình 39 Điều chỉnh trọng hệ tọa độ khớp xoay 27 Hình 40 MOVL/MOVJ mode 28 Hình 41 JUMP mode 28 Hình 42 Arc Mode 28 Hình 43 Giao diện phần mềm Visual Studio 29 Hình Sơ đồ bố trí thiết bị phần cứng 31 Hình Webcam Logitech C920 32 Khoa ĐT CLC – ĐH SPKT TP.HCM xi Hình 3 Băng tải .32 Hình Quy cách thiết kế Dobot Magician 33 Hình Hệ tọa độ Đề - 33 Hình Hệ tọa độ khớp xoay .34 Hình Thơng số kích thước 35 Hình Tầm hoạt động (1) 35 Hình Tầm hoạt động (2) 36 Hình 10 Tầm hoạt động (3) 36 Hình 11 Bộ bơm khí nén đầu hút 37 Hình 12 Sơ đồ kết nối phần cứng 38 Hình 13 Các giao thức kết nối chân đế Dobot Magician 38 Hình 14 Các giao thức kết nối cánh tay 39 Hình Lắp đặt Camera .40 Hình Các chân kết nối đế Robot .40 Hình Lắp đặt đầu hút 40 Hình 4 Kết nối dây tín hiệu cho hút 40 Hình Kết nối tín hiệu cho bơm khí 40 Hình Kết nối tín hiệu động băng tải .40 Hình Thuật toán xử lý ảnh 41 Hình Cấu trúc hàm Detector 41 Hình Vật thể lệch góc độ 42 Hình 10 Vật thể lệch góc θ độ 42 Hình 11 Vị trí vật thể hai khung hình 42 Hình 12 Cạnh xác định Canny .44 Hình 13 Các cạnh cần tìm 44 Hình 14 Cạnh không liên quan .44 Hình 15 Thuật tốn điều khiển Robot 45 Hình 16 Lắp đặt kết nối phần cứng thực tế 48 Hình 17 Mép kho chứa song song với giá đỡ trục .49 Hình 18 Khoảng cách từ tâm giá đỡ đến rìa Camera 49 Hình 19 K/c từ mặt bàn đến Camera 49 Hình 20 Thiết lập yêu cầu khoảng cách 49 Khoa ĐT CLC – ĐH SPKT TP.HCM xii for idx, i in enumerate(cluster[0][:-1]): for j in cluster[0][idx+1:]: dist_l2l = get_distance_l2l(ls_of_cen_dir_len[i], ls_of_cen_dir_len[j]) if dist_l2l >= rect_width*0.85 and dist_l2l = rect_width*0.85 and dist_l2l = rect_width*0.3: if fabs(direction-each[1]) < delta_dir: res[0].append(i) elif fabs(fabs(direction-each[1])-pi/2) < delta_dir: res[1].append(i) elif distance < rect_width*0.3: if fabs(direction-each[1]) < delta_dir: res[0].append(i) return res def get_center_direction_len(ls_of_lines): ''' Calculate center, direction, lenght of all detected lines @param: ls_of_lines: list of all lines defined by end-points format: [(x1, y1, x2, y2), (x1, y1, x2, y2), ] @return: res: result Khoa ĐT CLC – ĐHSPKT TP.HCM 77 format: [[center1, direction1, lenght1], [center2, direction2, lenght2], ] ''' res = list() for line in ls_of_lines: x1, y1, x2, y2 = line[0] p1 = (x1, y1) p2 = (x2, y2) line_center = [(x1+x2)//2, (y1+y2)//2] lenght = get_distance_p2p(p1, p2) if x1 == x2: line_direction = pi/2 elif y1 == y2: line_direction = else: line_direction = atan((y1-y2)/(x1-x2)) res.append([line_center, line_direction, lenght]) return res def find_clusters_of_paral_vert_lines(ls_of_lines): ''' Find the neighbours of each line in ls_of_lines @param: ls_of_lines: list of all lines defined by end-points format: [(x1, y1, x2, y2), (x1, y1, x2, y2), ] @return: clusters_of_paral_vert_lines: list of all clusters format: [[[h1, h2, ], [v1, v2, ]], ] ls_of_cen_dir_len: a list contains center, direction, lenght of all lines format: float[[center, direction, lenght], ] ''' clusters_of_paral_vert_lines = list() Khoa ĐT CLC – ĐHSPKT TP.HCM 78 ls_of_cen_dir_len = get_center_direction_len(ls_of_lines) for line in ls_of_cen_dir_len: if line[2] > rect_width*0.2: # if lenght of line is longer than rect_width*0.2 clusters_of_paral_vert_lines.append(find_in_neighbour(line, ls_of_cen_dir_len)) return clusters_of_paral_vert_lines, ls_of_cen_dir_len def auto_canny(image, sigma=0.33): # compute the median of the single channel pixel intensities v = np.median(image) # apply automatic Canny edge detection using the computed median lower = int(max(0, (1.0 - sigma) * v)) upper = int(min(255, (1.0 + sigma) * v)) edged = cv2.Canny(image, lower, upper) # return the edged image return edged def detect_rects(img, color_center): ''' @return: ls_of_real_rects: a list contains center and directions of real rects format: [[(x0, y0), dir0], [(x1, y1), dir1], ] ''' gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) blur = cv2.GaussianBlur(gray, (5, 5), 0) edged = auto_canny(blur) # edged = cv2.Canny(blur, 100, 200) cv2.imshow("canny", edged) lines = cv2.HoughLinesP(edged, 1, np.pi/180, 18, 1, 7, 4) Khoa ĐT CLC – ĐHSPKT TP.HCM 79 ls_of_real_rects = [] if lines is not None: # print("num of lines:", len(lines)) clusters_of_paral_vert_lines, ls_of_cen_dir_len = find_clusters_of_paral_vert_lines(lines) # print("num of rects:", len(clusters_of_paral_vert_lines)) ls_of_real_rects = detect_real_rect(ls_of_cen_dir_len, clusters_of_paral_vert_lines) detect_color(ls_of_real_rects, color_center, img) for idx, rect in enumerate(ls_of_real_rects): if rect[-1] == 4: ls_of_real_rects.pop(idx) return ls_of_real_rects Chương trình chính: Main import cv2 from time import sleep, time from rect_regconition import detect_rects, get_distance_p2p import threading import DobotDllType as dType # khoang cach gioi han nho nhat giua vat the ref_new = 10 # khoang cach tu tam camera den truc x cua robot d_robot_cam = 330.5 # toc bang tai (mm/s) mm_per_sec = 40 # flag dieu khien ket thuc thread 'arm' end_thread = False Khoa ĐT CLC – ĐHSPKT TP.HCM 80 # list cac vat the dang duoc theo doi ls_obj = [] class Rectangle(object): ''' Moi vat the duoc dinh nghia bang object Rectangle ''' def init (self, location, orientation, color): self.location = location self.orientation = orientation self.color = color def is_new_obj(rect_center, ls_obj): ''' Kiem tra xem vat the o khung hinh hien tai va vat the o khung hinh truoc co phai la vat the khong? Kiem tra toi da vat the ''' if len(ls_obj) > 6: start_idx = -6 else: start_idx = -len(ls_obj) for idx in range(start_idx, 0, 1): dist = get_distance_p2p(ls_obj[idx].location, rect_center) # khoang cach tu vat the dang xet o khung hinh hien tai den vat the o khung hinh truoc nho hon ref_new khong? if dist < ref_new: return False return True def get_real_pos(img_pos, img_shape, delta_s): ''' Khoa ĐT CLC – ĐHSPKT TP.HCM 81 Chuyen doi tu toa vat the tren anh sang toa robot Ty le chuyen doi: 25 pixel ~ 30 mmm ''' return [(img_pos[0]-img_shape[1]/2)*25/30, (img_pos[1]-img_shape[0]/2)*25/31 + delta_s] def convert_base(ls_of_rects, img_shape, delta_s): ''' Chuyen doi toa danh sach vat the tren anh sang toa robot ''' for rect in ls_of_rects: rect[0] = get_real_pos(rect[0], img_shape, delta_s) def get_color_center(): ''' Tinh sample color cua mau ''' color_ls = ['red', 'green', 'blue', 'yellow', 'black'] color_center = [] for color in color_ls: img = cv2.imread('photos/'+color+'.png') # tinh gia tri trung binh cua cac diem anh tren thang mau RGB p = img.mean(axis=0).mean(axis=0).astype(int) # chuyen doi tu dinh dang numpy sang dinh dang list color_center.append(list(p)) return color_center [ [x0, y0, z0], [], [], ] def main(threadname): # mo camera so cap = cv2.VideoCapture(0) Khoa ĐT CLC – ĐHSPKT TP.HCM 82 # setup ty le khung hinh cap.set(3, 320) cap.set(4, 240) # setup FPS cap.set(5, 30) sleep(1) last_time = timef2f = # tinh sample color cua mau color_center = get_color_center() while True: start_time = time() # doc anh tu camera frame = cap.read()[1] # cat khung hinh lay phan chua bang bang chuyen img = frame[frame.shape[0]//3:frame.shape[0]//3*2, 98:-98] # tim tat ca hinh vuong img # ls_of_rects = [ [[x, y], orientation, color] , [], ] ls_of_rects = detect_rects(img, color_center) # calculate time spent by rect_regconition # print("num of detected rect:", len(ls_of_rects)) # print("eslaped time:", time() - start_time) # show rect_regconition results color = [(255, 0, 255), (255, 0, 0), (0, 0, 255)] for rect in ls_of_rects: cv2.circle(img, rect[0], 2, color[0], thickness=1) Khoa ĐT CLC – ĐHSPKT TP.HCM 83 cv2.putText(img,str(int(rect[1])),rect[0],cv2.FONT_HERSHEY_SIMPLEX, 0.5,(0,255,0),1,cv2.LINE_AA) cv2.circle(img, (img.shape[1]//2, img.shape[0]//2), 2, color[2], thickness=1) cv2.imshow('origin', img) # convert coordinate base from image base to robot base delta_s = (time()-start_time) * mm_per_sec # print('time1:', time()-start_time) convert_base(ls_of_rects, img.shape, delta_s) # khai bao ls_obj la global de co the sua doi du lieu global ls_obj # can chinh lai toa cac vat the delta_s = (time()-last_time) * mm_per_sec # print('delta:', delta_s) last_time = time() for obj in ls_obj: obj.location[1] += delta_s # cap nhat danh sach cac vat the ls_obj for rect in ls_of_rects: if is_new_obj(rect[0], ls_obj): end_idx = -len(ls_obj)-1 if end_idx < -7: end_idx = -7 inserted_flag = False for i in range(-1, end_idx, -1): if rect[0][1] cur_cmd: # print(cur_cmd) dType.dSleep(10) cur_cmd = dType.GetQueuedCmdCurrentIndex(api)[0] def arm(threadname): ''' Thread dieu khien robot arm ''' # kich thuoc kho chua hang doi voi tung mau, dinh dang [x, y, z] size_wh = [1, 3, 4] Khoa ĐT CLC – ĐHSPKT TP.HCM 86 # vi tri hien tai cua tung mau kho hang: Red Green Blue Yellow cur_pos_wh = [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] CON_STR = { dType.DobotConnect.DobotConnect_NoError: "DobotConnect_NoError", dType.DobotConnect.DobotConnect_NotFound: "DobotConnect_NotFound", dType.DobotConnect.DobotConnect_Occupied: "DobotConnect_Occupied"} # Load Dll api = dType.load() # Connect Dobot state = dType.ConnectDobot(api, "", 115200)[0] print("Connect status:",CON_STR[state]) dType.SetHOMEParams(api, 230, 0, 50, 0, isQueued=1) dType.SetPTPCoordinateParams(api, 150, 200, 200, 200, isQueued=1) dType.SetPTPCommonParams(api, 100, 100, isQueued=1) dType.SetPTPJumpParams(api, 60, 150, isQueued=1) dType.SetPTPCmd(api, dType.PTPMode.PTPJUMPXYZMode, 200, 0, 50, 0, isQueued=1) lastIndex = dType.SetHOMECmd(api, temp = 0, isQueued = 1)[0] cur_cmd = dType.GetQueuedCmdCurrentIndex(api)[0] while lastIndex > cur_cmd: dType.dSleep(10) cur_cmd = dType.GetQueuedCmdCurrentIndex(api)[0] global mm_per_sec dType.SetQueuedCmdClear(api) dType.SetQueuedCmdStartExec(api) Khoa ĐT CLC – ĐHSPKT TP.HCM 87 f = open('step', 'r') STEP_PER_CIRCLE = float(f.read().strip('\n')) f.close() # so buoc de truc quay du vong # STEP_PER_CIRCLE = 17400 #16625 # chu vi truc quay bang chuyen MM_PER_CIRCLE = 3.1415926535898 * 36.0 # so buoc giay pulse_per_sec = mm_per_sec * STEP_PER_CIRCLE / MM_PER_CIRCLE # dieu khien stepper dType.SetEMotor(api, 0, 1, int(pulse_per_sec), isQueued=1) while state == dType.DobotConnect.DobotConnect_NoError: # print('number:', len(ls_obj)) if ls_obj: # print("ab") if ls_obj[0].location[1] >= d_robot_cam-20: while True: try: if ls_obj[0].location[1] >= d_robot_cam-100: print(cur_pos_wh) # neu kho hang cua mau dang xet chua day if cur_pos_wh[ls_obj[0].color][2] < size_wh[2]: # dung bang chuyen dType.SetEMotor(api, 0, 1, int(0), isQueued=1) mm_per_sec = # gap vat the tu bang chuyen vao kho pick_up(api, ls_obj[0].color, cur_pos_wh, size_wh) ls_obj[0].location, Khoa ĐT CLC – ĐHSPKT TP.HCM ls_obj[0].orientation, 88 # xoa vat the vua gap ls_obj.pop(0) else: break except Exception: break # bang chuyen tiep tuc chay f = open('step', 'r') STEP_PER_CIRCLE = float(f.read().strip('\n')) f.close() # chu vi truc quay bang chuyen MM_PER_CIRCLE = 3.1415926535898 * 36.0 # so buoc giay mm_per_sec = 40 pulse_per_sec = mm_per_sec * STEP_PER_CIRCLE / MM_PER_CIRCLE dType.SetEMotor(api, 0, 1, int(pulse_per_sec), isQueued=1) if end_thread: dType.SetEMotor(api, 0, 1, 0, isQueued=1) print('End process') dType.DisconnectDobot(api) break if name == ' main ': thread_main = threading.Thread(target=main, args=('Thread-1', )) thread_main.start() thread_arm = threading.Thread(target=arm, args=('Thread-2', )) thread_arm.start() Khoa ĐT CLC – ĐHSPKT TP.HCM 89 ... đấu nối hoàn chỉnh hệ thống ? ?Ứng dụng Dobot Magician hệ thống phân loại sản phẩm? ?? dựa module có sẵn đến từ nhà sản xuất Dobot Lập trình điều khiển phân loại màu sắc vật thể, sử dụng cánh tay Robot... nghệ xử lý ảnh phân loại màu sắc để phân loại sản phẩm thay cho khâu kiểm tra ngoại quan người thực Quá trình phân loại sản phẩm thực dựa việc thu thập thông tin màu sắc sản phẩm thông qua hệ thống. .. chứa sản phẩm, ngược lại vật thể có màu sắc khác với màu sắc quy định loại bỏ khỏi băng chuyền 1.2 Mục tiêu nghiên cứu Thiết kế, lập trình vận hành hệ thống ? ?Ứng dụng Dobot Magician hệ thống phân