Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 108 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
108
Dung lượng
4,09 MB
Nội dung
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI LUẬN VĂN THẠC SĨ Thiết kế hệ thống điều khiển robot thu hoạch dứa dựa cơng nghệ xử lý ảnh NGUYỄN CƠNG TUẤN ANH Anh.NCTCA190086@sis.hust.edu.vn Ngành Kỹ thuật Điều khiển Tự động hóa Giảng viên hướng dẫn : PGS.TS Nguyễn Phạm Thục Anh Chữ ký GVHD Viện : Điện HÀ NỘI, 12/2021 CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tự – Hạnh phúc BẢN XÁC NHẬN CHỈNH SỬA LUẬN VĂN THẠC SĨ Họ tên tác giả luận văn : Nguyễn Công Tuấn Anh Đề tài luận văn: Thiết kế hệ thống điều khiển thu hoạch dứa dựa công nghệ xử lý ảnh Chuyên ngành: Kỹ thuật Điều khiển Tự động hóa Mã số SV: CA190086 Tác giả, Người hướng dẫn khoa học Hội đồng chấm luận văn xác nhận tác giả sửa chữa, bổ sung luận văn theo biên họp Hội đồng ngày 30/12/2021 với nội dung sau: - Sửa chữa lỗi tả, lỗi đánh máy - Bổ sung tài liệu tham khảo liên quan đề cập luận văn - Bổ sung phần phụ lục: Chương trình viết SFC Ladder cho tay máy, chương trình điều khiển giám sát ngôn ngữ Python Giáo viên hướng dẫn Hà Nội, Ngày 25 tháng 01 năm 2022 Tác giả luận văn CHỦ TỊCH HỘI ĐỒNG Mẫu 1c ĐỀ TÀI LUẬN VĂN Đề tài: “Thiết kế hệ thống điều khiển robot thu hoạch dứa dựa công nghệ xử lý ảnh” Giáo viên hướng dẫn: PGS.TS Nguyễn Phạm Thục Anh Giáo viên hướng dẫn Ký ghi rõ họ tên LỜI CẢM ƠN Luận văn tốt nghiệp môn học cuối học viên, qua luận văn tốt nghiệp giúp học viên tổng kết lại kiến thức học thời gian ngồi ghế nhà trường, giúp học viên hiểu sâu sắc chuyên ngành học Em xin chân thành cám ơn thầy cô Bộ mơn Tự động hóa cơng nghiệp dành hết tâm huyết để truyền đạt kiến thức chuyên môn, kinh nghiệm quý báu cho em ngày em theo học tai nhà trường Đặc biệt em xin cảm ơn cô Nguyễn Phạm Thục Anh, suốt thời gian nghiên cứu, tận tình giúp đỡ hướng dẫn để em hồn thành luận án tốt nghiệp thời gian quy định Sau thời gian tìm tịi nghiên cứu hướng dẫn tận tình giáo PGS.TS Nguyễn Phạm Thục Anh thầy cô khác môn đồ án em hồn thành Em xin chân thành cảm ơn biết ơn giúp đỡ cô Thục Anh cá thầy cô môn Do thời gian làm đề tài kiến thức kinh phí có hạn, chắn đề tài nghiên cứu em cịn nhiều thiếu sót Em mong nhận nhiều đóng góp từ cá thầy cô bạn để đề ài kiến thức em ngày hoàn thiện TÓM TẮT NỘI DUNG LUẬN ÁN Hiện Tây Nam Bộ diện tích đất trồng dứa nhiều tất trình thu hoạch dứa làm thủ công nên hiệu suất thu hoạch chưa ao q trình thu hoạch gây cho người thu hoạch bị vết thương khơng đáng có dứa vương miện dứa sắc nên nhu cầu đưa thiết kế robot cắt dứa tự động để người dân vùng Tây Nam Bộ thu hoạch dứa cách suất hiệu Với mong muốn góp phần vào phát triển nông nghiệp nước nhà giúp đỡ bà nông dân áp dụng tự động hóa vào thu hoạch sản xuất, kiến thức học nhà trường thầy cô hướng dẫn, em chọn đề tài “Thiết kế hệ thống điều khiển robot thu hoạch dứa dựa công nghệ xử lý ảnh” làm luận văn tốt nghiệp Đề tài “Thiết kế hệ thống điều khiển robot thu hoạch dứa dựa công nghệ xử lý ảnh” gồm phần sau: Chương 1: Tổng quan robot thu hoạch dứa tự động Chương 2: Thiết kế khí hệ thống robot cắt dứa tự động Chương 3: Thiết kế hệ thống điều khiển robot cắt dứa tự động Chương 4: Phương pháp phân tích ảnh nhận diện dứa Chương 5: Kết thực nghiệm hướng phát triển HỌC VIÊN Ký ghi rõ họ tên MỤC LỤC MỤC LỤC DANH MỤC HÌNH VẼ DANH MỤC BẢNG SỐ LIỆU DANH MỤC TỪ VIẾT TẮT 10 CHƯƠNG TỔNG QUAN ROBOT THU HOẠCH DỨA TỰ ĐỘNG 1.1 Tổng quan đề tài 1.2 Tổng quan hệ thống thu hoạch tự động 1.3 1.2.1 Khái quát 1.2.2 Quy trình thu hoạch dứa Tổng quan hệ thống liên hợp máy cắt dứa tự động CHƯƠNG THIẾT KẾ CƠ KHÍ HỆ THỐNG ROBOT CẮT DỨA TỰ ĐỘNG 2.1 Tổng quan thiết kế 2.2 Kết cấu khí khu robot cắt dứa 2.3 Mơ hình thiết kế cho cánh tay cắt dứa 2.4 Thiết kế hệ truyền động cho cấu tay máy 2.4.1 Nhiệm vụ hệ truyền động động 2.4.2 Khớp chuyển động trục X 2.4.3 Khớp chuyển động trục Y 10 2.4.4 Khớp chuyển động trục Z 11 CHƯƠNG THIẾT KẾ HỆ THỐNG ĐIỀU KHIỂN ROBOT CẮT DỨA TỰ ĐỘNG 13 3.1 Cấu trúc hệ thống điều khiển trung tâm 13 3.1.1 Cấp điều khiển giám sát 13 3.1.2 Cấp điều khiển 14 3.1.3 Thiết bị trường 17 3.2 Thiết kế phần cứng hệ thống máy thu hoạch dứa tự động 19 3.3 Thiết kế mạch nguyên lý cho cấp điều khiển 19 3.4 Xây dựng chương trình phần mềm cho cấp điều khiển máy thu hoạch dứa tự động 20 3.4.1 Lưu đồ điều khiển cho điều khiển hai cánh tay 20 3.4.2 Các thiết bị điều khiển theo chương trình logic viết Ladder 20 3.4.3 3.5 3.6 Các thiết bị điều khiển theo chương trình viết SFC 23 Chương trình điều khiển viết cho PLC cánh tay 26 3.5.1 Chương trình điều khiển viết ngơn ngữ Ladder 26 3.5.2 Chương trình điều khiển viết SFC 27 Chương trình điều khiển viết cho PLC cánh tay 27 3.6.1 Chương trình điều khiển viết ngôn ngữ Ladder 27 3.6.2 Chương trình điều khiển viết SFC 27 3.7 Xây dựng phần mềm giao diện cho cấp điều khiển giám sát Robot thu hoạch dứa 27 3.8 3.9 3.7.1 Lưu đồ điều khiển cho cấp giám sát 27 3.7.2 Xây dựng giao diện HMI 28 Xây dựng chương trình 31 3.8.1 Lưu đồ điều khiển chương trình 31 3.8.2 Lưu đồ điều khiển trình truyền thơng chương trình 32 3.8.3 Chương trình viết ngơn ngữ python 34 Lựa chọn thiết bị cấp trường 34 3.9.1 Động Stepper 86HSE 12N B32 34 3.9.2 Driver HBS86H 34 CHƯƠNG PHƯƠNG PHÁP PHÂN TÍCH ẢNH VÀ NHẬN DIỆN QUẢ DỨA 38 4.1 Mục tiêu nhiệm vụ chương 38 4.2 Giải toán 38 4.3 4.4 4.5 4.2.1 Phương pháp Machine Learning (học máy) 38 4.2.2 Phương pháp Deep Learning 40 4.2.3 CNN – mạng nơ-ron tích chập (Convolutional Neural Network) 42 Bài tốn nhận diện vật thể 43 4.3.1 Thuật toán YOLO 43 4.3.2 Kỹ thuật Transfer Learning 47 Xây dựng sở liệu 48 4.4.1 Chụp ảnh 48 4.4.2 Gán nhãn liệu 48 Cài đặt chương trình 50 4.5.1 Môi trường cài đặt 50 4.6 4.5.2 Tiền xử lý 50 4.5.3 Huấn luyện 51 4.5.4 Kết huấn luyện 53 Bài toán xác định tọa độ 54 CHƯƠNG KẾT QUẢ THỰC NGHIỆM VÀ HƯỚNG PHÁT TRIỂN 59 5.1 Kết việc lắp đặt khí thiết bị phần cứng 59 5.2 Kết toán nhận diện trái dứa 61 5.3 Kết tốn xác định vị trí dứa di chuyển tay máy đến vị trí phịng thí nghiệm 62 5.4 Hướng phát triển đề tài 63 TÀI LIỆU THAM KHẢO 64 PHỤ LỤC 65 DANH MỤC HÌNH VẼ Hình 1.1 Sử dụng băng tải vận chuyển dứa trình thu hái Nam Mỹ Hình 1.2 Ruộng dứa vùng Tây nam Bộ Hình 1.3 Quy trình thu hoạch dứa Hình 1.4 Quá trình thu hoạch dứa miền Tây nam Bộ Hình 1.5 Liên hợp máy thu hoạch dứa Hình 1.6 Sơ đồ khối hệ thống cắt dứa tự động Hình 2.1 Mơ hình tổng thể hệ thống tay robot cắt dứa Hình 2.2 Mơ hình tổng thể hệ thống tay máy cắt dứa Hình 2.3 Mơ hình khung xe Hình 2.4 Mơ hình cánh tay đặt khung xe Hình 2.5 Mơ hình cánh tay Hình 2.6 Mơ hình khí nối cánh tay hái dứa 10 Hình 2.7 Mơ hình khí khớp cánh tay hái dứa 11 Hình 2.8 Mơ hình khí khớp tay máy hái dứa 12 Hình 3.1 Thiết kế hệ thống điều khiển Robot thu hoạch dứa 13 Hình 3.2 Hệ thống điều khiển giám sát xây dựng 14 Hình 3.3 Cấp điều khiển chế tạo 15 Hình 3.4 Cấp điều khiển chế tạo 16 Hình 3.5 Tủ động lực 17 Hình 3.6 Cánh tay Robot 18 Hình 3.7 Mơ hình thiết kế tổng thể bàn tay cắt dứa 19 Hình 3.8 Chu trình hoạt động thao tác chụp ảnh gửi lên PC phân tích 21 Hình 3.9 Lưu đồ hoạt động điều khiển chụp ảnh gửi lên PC phân tích 22 Hình 3.10 Lưu đồ điều khiển hoạt động hạ cánh tay xuống cắt dứa 23 Hình 3.11 Lưu đồ điều khiển hoạt động cánh tay cắt dứa 25 Hình 3.12 Lưu đồ điều khiển hoạt động cánh tay cắt dứa 26 Hình 3.13 Lưu đồ điều khiển cho cấp giám sát 28 Hình 3.14 Lưu đồ điều khiển giao diện HMI 29 Hình 3.15 Lưu đồ điều khiển chương trình 32 Hình 3.16 Lưu đồ điều khiển trình truyền thơng chương trình 33 Hình 3.17 Động Stepper 86HSE 12N B32 34 Hình 3.18 Driver HBS86H 35 Hình 3.19 Sơ đồ đấu dây Driver với PLC động 37 Hình 4.1 Màu sắc dứa đa dạng 39 Hình 4.2 Màu sắc dứa, dứa, vương miện tương đồng 39 Hình 4.3 Kết nhận diện dứa phương pháp Haar Cascade 40 Hình 4.4 Mạng nơ-ron nhân tạo 40 Hình 4.5 Mạng nơ-ron tích chập CNN 42 Hình 4.6 Ý tưởng thuật toán YOLO 43 Hình 4.7 Grid Cell 44 Hình 4.8 Kiến trúc mạng mơ hình YOLO 45 Hình 4.9 Non-maximal suppression 47 Hình 4.10 Dữ liệu ảnh thu thập 48 Hình 4.11 Dán nhãn 49 Hình 4.12 Xuất file xml chứa thơng tin ảnh vừa dán nhãn 50 Hình 4.13 Dữ liệu dạng file txt 51 Hình 4.14 Đồ thị hàm Loss lớp cuối 52 Hình 4.15 Đồ thị hàm Loss toàn mạng 52 Hình 4.16 Kết nhận diện 53 Hình 4.17 Hình ảnh minh họa góc chụp camera điểm ảnh 54 Hình 4.18 Gốc tọa độ cánh tay máy cắt dứa 55 Hình 5.1 Mơ hình thực nghiệm toàn hệ thống 59 Hình 5.2 Tủ điện điều khiển 60 Hình 5.3 Cánh tay máy hái dứa lắp khung công tác 60 Hình 5.4 Kết nhận diện dứa chín điều kiện đủ sáng 61 Hình 5.5 Kết nhận diện dứa chín điều kiện thiếu sáng 61 Hình 5.6 Kết nhận diện dứa với độ cao khác có vật không liên quan gây nhiều 62 Hình 5.7 Giao diện điều khiển tọa độ dứa chín xác định 62 Hình 5.8 Điều khiển tay máy đến vị trí dứa chín trường hợp đủ sáng 63 DANH MỤC BẢNG SỐ LIỆU Bảng 2.1 Tham số khí khớp 10 Bảng 2.2 Tham số khí khớp 11 Bảng 2.3 Tham số khí khớp 12 Bảng 3.1 Bảng phân phối nguồn điện tủ điều khiển 15 Bảng 3.2 Cấp điều khiển chế tạo 16 Bảng 3.3 Bảng thông số kỹ thuật Driver HBS86H B32 35 Bảng 4.1 Kết huấn luyện 53 //Chương trình khối chức S15 //Chương trình khối chức S16 83 //Chương trình khối chức S18 //Chương trình khối chức S17 84 Chương trình điều khiển viết dạng Lader cho tay máy 85 Chương trình điều khiển viết SFC cho tay máy // Khối SFC xây dựng phần mềm 86 //Chương trình khối chức S10 //Chương trình khối chức S11 87 //Chương trình khối chức S12 88 //Chương trình khối chức S13 89 Chương trình điều khiển giám sát ngơn ngữ Python import tkinter import cv2 import pyrealsense2 as rs import operator import time from threading import Thread from yolo import YOLO from utils.PLC_IO import PLC_IO from utils.realSenseDepth import realSenseStream from utils.DepthTool import DepthTool import utils.image2coordc as i2c from time import sleep from PIL import Image, ImageDraw, ImageFont, ImageTK from PLC.PLCASync import PLCASync import queue import numpy as np from tkinter import messengebox import tensorflow as tf from keras.backend.tensorflow_backend import set_session threads = [] teststr = '1' class App: #Giao dien hien thi def init (self, window, window_title): self.window = window self.window.title(window_title) self.window.geometry("1920x1080") self.testThread = None self.realSenseStream = realSenseStream() self.background_label = tkinter.Label(window, bg='grey') self.background_label.place(relx=0, rely=0, relheight=1, relwidth=1) self.recipe = self.input_str = " # open video souce (by default this will try to open the computer webcam) # Creat a canvas that can fit the above video source size self.canvas = tkinter.Canvas(self.background_label) 90 self.canvas.place(relx=0.003, rely=0.1, relheight=0.7, relwidth=0.498) self.canvas1 = tkinter.Canvas(self.background_label) self.canvas1.place(relx=0.052, rely=0.1, relheight=0.7, relwidth=0.497) # Button that lets the user take a snapshot self.btn_snapshot = tkinter.Button(self.background_label,bg='salmon3',text="Start",fg='black',font=(" helvetica",25),command=self.snapshot) self.btn_snapshot.place(relx=0.77, rely=0.85, relheight=0.09, relwidth=0.2) self.btn_update = tkinter.Button(self.background_label,bg='salmon3',text="Update",fg='black',font =("helvetica",25),command=self.btn_update) self.btn_update.place(relx=0.53, rely=0.85, relheight=0.09, relwidth=0.2) # After it is called once, the update method will be automatically called every delay milliseconds self.label1 = tkinter.Label(self.background_label,bg='salmon3',text="Camera Angle",font=("helvetica",25)) self.label1.place(relx=0.05, rely=0.85, relheight=0.09, relwidth=0.25) self.label2 = tkinter.Label(self.background_label,bg='salmon3',text="Pineapples Harverting Machine",fg='white',font=("helvetica",60)) self.label2.place(relx=0.003, rely=0.001, relheight=0.09, relwidth=0.996) self.entry1 = tkinter.Entry(self.background_label,bg='white') self.entry1.place(relx=0.35, rely=0.87) self.delay = 15 self.update() def_delete_window(self) print("delete_window") self.testThread.isstop = True self.testThread.join() try # self.testThread.join() self.window.destroy() except Exception as e: 91 print(e) pass def btn_update(self) teststr = self.entry1.get() if teststr == ": messengebox.showerror("Error","Hay nhap thong so") self.recipe = int(teststr) self.testThread.recipe = self.recipe def snapshot(self) # Get a frame from the video source teststr = self.entry1.get() if teststr == ": messengebox.showerror("Error","Hay nhap thong so") print(teststr) elif teststr!= ": flame1 = self.realSenseStream.get_flame() self.photo1 = ImageTK.PhotoImage(image=Image.fromarray(flame1)) self.canvas1.creat_image(0, 0, image=self.photo1, anchor=tkinter.NW) self.testThread = PLCASync1(self.realSenseStream) self.testThread.start() self.testThread.recipe = self.recipe print(self.testThread.recipe) threads.append(self.testThread) print(len(threads)) self.btn_snapshot.config(state = 'disable') def update(self) # Get a frame from the realsense frame = self.realSenseStream.get_flame() self.photo = ImageTK.PhotoImage(image=Image.fromarray(frame)) self.canvas.creat_image(0, 0, image=self.photo, anchor=tkinter.NW) self.testThread.image = self.testThread.image.resize((956, 756), Image.ANTIALIAS) 92 self.photo1 = ImageTK.PhotoImage(image=self.testThread.image) self.canvas1.creat_image(0, 0, image=self.photo1, anchor=tkinter.NW) super(). init () self.ready = False # flag tay cat dua self.take = False # flag chup anh self.realSenseStream = realSenseStream self.isstop = False self.image = None self.imageUpdate = False self.systemready = False self.recipe = self.parameter = def run(self): gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.5) config = tf.ConfigProto(gpu_options = gpu_options) sess = tf.Session(config = config) detect = YOLO().raw_detect_image take_image = self.realSenseStream.take_image font = ImageFont.truetype('Pillow/Tests/fonts/FreeMono.ttf',size=32) hand_queue = queue.Queue(0) boxList1 = [] boxList2 = [] # PLC plc1 = PLC_IO("PLC1",'/dev/ttyUSB0') plcThread1 = PLCASync(plc1) plcThread1.start() # PLC plc2 = PLC_IO("PLC2",'/dev/ttyUSB1') plcThread2 = PLCASync(plc2) # B2: Camera chup anh va detect # B3: Chuyen sang toa Cam va gui len PLC # B4: Quay lai vong lap while True: if self.isstop: 93 plcThread1.isstop = True plcThread2.isstop = True return plcThread1.ready = False plcThread1.take = False plcThread2.ready = False plcThread2.take = False plcThread1.mode1 = False plcThread2.mode2 = False plcThread1.RESET = False plcThread1.finish = False plcThread2.finish = False print("Wait") plc1.ser.flushOutput() plc1.serialOutready(1,1) plc1.ser.flushInput() self.systemready = True while plcThread1.take == False: if self.isstop: plcThread1.isstop = True plcThread2.isstop = True print("Stop PLC Test") return continue plcThread1.RESET = False # wait for pulse for i in range(2) if plcThread1.RESET == True: break if i == 1: while plcThread1.ready == False or plcThread2.ready == False: if plcThread1.RESET == True: break continue if plcThread1.RESET == True: break 94 boxList1.clear() boxList2.clear() print("Taking image ") path, dataPath, _ = take_image() #chup anh image = Image.open(path) draw = ImageDraw.Draw(image) #khoi tao anh de luu print("Tsh! Detecting ") data = detect(image) #nhan dien qua dua print("Detected.") count_dua = depthTool = DepthTool() depthTool.readCord(dataPath) bias = 0.1 gridSize = 10 for box in data['objects']: if plcThread1.mode2 == True: if box['class'] == count_dua += depth = depthTool.getDepthBoundingBox([box['box']['left'], box['box']['top'], box['box']['right'], box['box']['buttom']], gridSize, bias) * 100 x = (box['box']['left'] + box['box']['right'])/2 y = box['box']['buttom'] rx, ry = i2x.to_coord_from_depth(x,y,depth) draw.rectangle([box['box']['left'], box['box']['top'], box['box']['right'], box['box']['buttom']], outline=(255,0,0), width=10) campov = str(rx)+''+str(ry) draw.text((box['box']['left'], box['box']['top'] -35 ), campov, fill = (255,0,0), font = font) print(box['score'], box['box']['left'], box['box']['top']-35) # xep toa cho tay cat if rx>0: #PLC1 boxList1.append({'x':rx, 'y':ry, 'box':box}) #them vao danh sach cat PLC 95 else boxList2.append({'x':rx, 'y':ry, 'box':box}) #them vao danh sach cat PLC pass if plcThread1.mode1 == True: if box['class'] == or box['class'] == count_dua += depth = depthTool.getDepthBoundingBox([box['box']['left'], box['box']['top'], box['box']['right'], box['box']['buttom']], gridSize, bias) * 100 x = (box['box']['left'] + box['box']['right'])/2 y = box['box']['buttom'] rx, ry = i2x.to_coord_from_depth(x,y,depth) draw.rectangle([box['box']['left'], box['box']['top'], box['box']['right'], box['box']['buttom']], outline=(255,0,0), width=10) campov = str(rx)+''+str(ry) draw.text((box['box']['left'], box['box']['top'] -35 ), campov, fill = (255,0,0), font = font) print(box['score'], box['box']['left'], box['box']['top']-35) # xep toa cho tay cat if rx>0: #PLC1 boxList1.append({'x':rx, 'y':ry, 'box':box}) #them vao danh sach cat PLC else boxList2.append({'x':rx, 'y':ry, 'box':box}) #them vao danh sach cat PLC pass if plc2.serialOut(obj['x'],obj['y']) == True #xuat toa plcThread2.ready = False plcThread2.finish = False #reset tay boxList2.pop() #loai bo qua dua da cat 96 if i==1: while plcThread2.finish == False or plcThread1.finish == False: if plcThread1.RESET == True: break if self.isstop: plcThread1.isstop = True plcThread2.isstop = True return continue # Create a window and pass it to the Application object App(tkinter.Tk(),"PINEAPPLE") 97 ... đề tài ? ?Thiết kế hệ thống điều khiển robot thu hoạch dứa dựa công nghệ xử lý ảnh? ?? làm luận văn tốt nghiệp Đề tài ? ?Thiết kế hệ thống điều khiển robot thu hoạch dứa dựa công nghệ xử lý ảnh? ?? gồm... CHƯƠNG THIẾT KẾ HỆ THỐNG ĐIỀU KHIỂN ROBOT CẮT DỨA TỰ ĐỘNG 3.1 Cấu trúc hệ thống điều khiển trung tâm Để thỏa mã yêu cầu nhiệm vụ Robot thu hoạch dứa tự động nêu trên, hệ thống điều khiển Robot thiết. .. quan robot thu hoạch dứa tự động Chương 2: Thiết kế khí hệ thống robot cắt dứa tự động Chương 3: Thiết kế hệ thống điều khiển robot cắt dứa tự động Chương 4: Phương pháp phân tích ảnh nhận diện dứa