Nghiên cứu, thiết kế Rocker Bogie Robot (Mar Rover) tích hợp xử lý ảnh và Deep Learning của sinh viên HAUI (đầy đủ file code, chương trình thử nghiệm, video)
BỘ CÔNG THƯƠNG TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI KHOA CƠ KHÍ - - ĐỒ ÁN TỐT NGHIỆP Đề tài: Nghiên cứu, thiết kế Rocker - Bogie Robot (Mar Rover) tích hợp xử lý ảnh Deep Learning Giảng viên hướng dẫn: ThS Bùi Huy Anh Nhóm sinh viên thực hiện: Lê Đình Lợi MSV: 2019601478 Phạm Văn Kiên MSV: 2019600883 Đặng Quang Minh MSV: 2019601729 Đinh Thanh Ngọc MSV: 2019600002 Hà Nội – 2023 MỤC LỤC MỤC LỤC DANH MỤC HÌNH ẢNH DANH MỤC BẢNG BIỂU 11 LỜI NÓI ĐẦU 12 CHƯƠNG TỔNG QUAN VỀ ROCKER - BOGIE ROBOT VÀ XỬ LÝ ẢNH 13 1.1 Tổng quan Rocker - Bogie Robot 13 1.2 Tổng quan xử lý ảnh 15 1.2.1 Khái niệm xử lý ảnh 15 1.2.2 Lịch sử đời phát triển xử lý ảnh 15 1.3 Tính cấp thiết đề tài 18 1.4 Các vấn đề đặt 19 1.5 Phương pháp phạm vi giới hạn nghiên cứu 19 CHƯƠNG CƠ SỞ LÝ THUYẾT CỦA ROCKER - BOGIE ROBOT VÀ XỬ LÝ ẢNH 21 2.1 Cơ sở lý thuyết Rocker – Bogie Robot 21 2.2 Cơ sở lý thuyết xử lý ảnh 23 2.2.1 Xử lý ảnh 23 2.2.2 Giới thiệu ngôn ngữ Python thư viện Open CV 26 2.3 Giới thiệu trí tuệ nhân tạo Deep learning 27 2.3.1 Giới thiệu chung trí tuệ nhân tạo 27 2.3.2 Deep learning 27 2.3.3 Mạng neural tích chập 28 2.3.4 Giới thiệu chung YOLO 33 2.4 Giới thiệu phần cứng 41 2.4.5 Bánh xe 41 2.4.6 Động giảm tốc 41 2.4.7 Khung xe 45 2.4.8 Module điều khiển động ESC 46 2.4.9 Module thu sóng điều khiển – Mạch RX X6FG 47 2.4.10Module điều khiển từ xa thu tín hiệu 48 2.4.11Pin 49 2.5 Sơ đồ thu phát hình ảnh từ xa 50 2.5.1 Trình bày mạng Wifi 51 2.5.2 Trình bày Router 51 2.5.3 Trình bày Camera IP 52 2.5.4 Camera TP-Link C200 53 CHƯƠNG TÍNH TỐN VÀ THIẾT KẾ 55 3.1 Thiết kế hệ thống 55 3.1.1 Tính tốn hệ thống khí 55 3.1.2 Sơ đồ khối 58 3.1.3 Lưu đồ thuật toán robot 59 3.2 Thiết kế vẽ hệ thống 61 3.3 Sơ đồ kết nối hệ thống 69 3.4 Thi công hệ thống 73 3.5 Các cài đặt điều khiển 81 3.6 Nhận diện 83 3.7 Tạo giao diện từ Tkinter ngôn ngữ Python 92 3.7.1 Các widgets tkinter python 93 3.7.2 Giao diện hoàn chỉnh sử dụng cho đề tài 101 CHƯƠNG KHỞI CHẠY GIAO DIỆN VÀ THỬ NGHIỆM ĐÁNH GIÁ HỆ THỐNG 105 4.1 Thử nghiệm đánh giá hệ thống 105 4.2 Kết nhận diện 107 4.3 Kết luận phương hướng phát triển 109 TÀI LIỆU THAM KHẢO 111 PHỤ LỤC 112 DANH MỤC HÌNH ẢNH Hình 1.1 Robot Lunokhod 14 Hình 1.2 Robot Sojourner 14 Hình 1.3 Tàu thám hiểm Hỏa tự hành Opportunity 15 Hình 1.4 Bức ảnh giới 16 Hình 1.5 Ảnh màu Louis Ducos du Hauron – 1877 16 Hình 1.6 Ảnh kỹ thuật số giới 17 Hình 2.1 Cơ chế Rocker – Bogie điển hình 21 Hình 2.2: Bánh trước vượt chướng ngại vật 22 Hình 2.3: Bánh vượt chướng ngại vật 22 Hình 2.4: Bánh sau vượt chướng ngại vật 22 Hình 2.5 Các bước xử lý ảnh 24 Hình 2.6 Hình ảnh chuyển qua ngơn ngữ máy tính 29 Hình 2.7 Làm phẳng (flattening) ma trận 3×3 thành vecto 9×1 29 Hình 2.8 Một hình GRB có kích thước 4×4×3 30 Hình 2.9 Tích chập hình ảnh 5×5×1 với lọc 3×3×1 hình ảnh chập 3×3×1 31 Hình 2.10 Ma trận gộp 3×3 từ ma trận tích chập 5×5 32 Hình 2.11 Các kiểu ghép gộp 32 Hình 2.12 Cấu trúc mạng Darknet 33 Hình 2.13: Residual blocks 35 Hình 2.14: Bounding box 36 Hình 2.15: Intersection over union 36 Hình 2.16: YOLO 37 Hình 2.17 Độ xác model train YOLOv8 so với phiên trước 39 Hình 2.18 Tốc độ xử lí YOLOv8 so với phiên trước 40 Hình 2.19 Cấu trúc nhận diện vật thể YOLOv8 40 Hình 2.20 Bánh xe 41 Hình 2.21 Cấu tạo động giảm tốc 41 Hình 2.22 Cấu tạo động giảm tốc 43 Hình 2.23 Động giảm tốc 370 45 Hình 2.24 Khung Rocker 46 Hình 2.25 Khung Bogie 46 Hình 2.26 Module ESC 480A 47 Hình 2.27 Mạch thu sóng RX X6FG 48 Hình 2.28 Tay điều khiển DumboRC nút chức 48 Hình 2.29 Pin Lipo ShangYi 3s 2200 mAh 45C - XT60 49 Hình 2.30 Sơ đồ thu phát hình ảnh 50 Hình 2.31 Router 51 Hình 2.32 IP Camera 52 Hình 2.33 Camera TP Link Tapo C200 53 Hình 3.1 Khung robot mặt phẳng 55 Hình 3.2 Robot địa hình khơng phẳng 55 Hình 3.3 Robot bánh trước vượt qua vật cản 56 Hình 3.4 Robot bánh trước vượt qua vật cản 56 Hình 3.5 Thơng số khung robot 57 Hình 3.6 Sơ đồ khối hệ thống 58 Hình 3.7 Bố trí vị trí động khung xe 59 Hình 3.8 Lưu đồ thuật toán điều khiển robot 60 Hình 3.9 Lưu đồ thuật tốn nhận diện 61 Hình 3.10 Mơ hình thiết kế 3D 62 Hình 3.11 Wireframe với cạnh nhìn thấy 62 Hình 3.12 Phân tách tồn Robot 63 Hình 3.13: Khung trước 63 Hình 3.14: Khung sau 63 Hình 3.15 Tấm plate liên kết khung xe 64 Hình 3.16 Liên kết khung trước sau 64 Hình 3.17 Khung thân 64 Hình 3.18 Tấm plate liên kết khung thân khung xe 65 Hình 3.19 Liên kết khung thân khung xe 65 Hình 3.20 Phân tách khung xe phần mềm 65 Hình 3.21 Phân tách khung bên 66 Hình 3.22 Bánh xe 66 Hình 3.23 Khớp lục giác mm 66 Hình 3.24 Động DC 370 67 Hình 3.25: Khối động bánh xe 67 Hình 3.26 Camera Tapo 67 Hình 3.27 Nắp xe hộp nguồn 68 Hình 3.28 Sơ đồ kết cấu Robot 68 Hình 3.29 Sơ đồ kết nối tổng thể 70 Hình 3.30 Kết nối ESC với nguồn 70 Hình 3.31 Kết nối ESC với động 71 Hình 3.32 Dây BEC kết nối ESC với RX 71 Hình 3.33 Các chân RX màu dây BEC 72 Hình 3.34 Cách cắm dây BEC vào RX 72 Hình 3.35 Kết nối nguồn với Camera 73 Hình 3.36 Khung trước thực tế 75 Hình 3.37 Khung sau thực tế 75 Hình 3.38 Tấm plate liên kết khung xe 76 Hình 3.39 Khung xe sau lắp ráp thực tế 76 Hình 3.40 Khung thân thực tế 76 Hình 3.41 Động DC 370 77 Hình 3.42 Khớp lục giác 4mm 77 Hình 3.43 Khối động 77 Hình 3.44 Khung robot 78 Hình 3.45 Nắp xe 78 Hình 3.46 Khung robot hồn chỉnh 79 Hình 3.47: Hệ thống nguồn 79 Hình 3.48 Hệ thống điều khiển 80 Hình 3.49 Đường dây 80 Hình 3.50 Robot hoàn chỉnh 81 Hình 3.51 Đèn báo cài đặt đồng thời kênh ( mix mode ) 82 Hình 3.52 Điều khiển chạy tiến phía trước 82 Hình 3.53 Điều khiển chạy lùi sau 82 Hình 3.54 Điều khiển rẽ trái 83 Hình 3.55 Điều khiển rẽ phải 83 Hình 3.56 Dịch chuyển ảnh 84 Hình 3.57 Xoay ảnh 85 Hình 3.58 Làm mịn ảnh 85 Hình 3.59 Dữ liệu ảnh ban đầu 86 Hình 3.60 Dữ liệu đầu vào gán nhãn 86 Hình 3.61 Khởi tạo chương trình Colab 87 Hình 3.62 Cài đặt thư viện cần thiết 87 Hình 3.63 liên kết với google colab giải nén tập ảnh 87 Hình 3.64 Tệp tên class cần huấn luyện 88 Hình 3.65 Huấn luyện mơ hình 88 Hình 3.66 Kết huấn luyện 89 Hình 3.67 Giá trị mát sau train 89 Hình 3.68 Giá trị độ tin cậy độ nhạy sau train 90 Hình 3.69 Mối quan hệ số confidence precision 91 Hình 3.70 Mối quan hệ số confidence recall 91 Hình 3.71 Cửa sổ Tkinter 93 Hình 3.72 Tạo giao diện 95 Hình 3.73 Ví dụ đơn giản label 97 Hình 3.74 Hàm tạo button đơn giản 99 Hình 3.75 Chọn Setting 102 Hình 3.76 Tạo access token 103 Hình 3.77 Giao diện hồn chỉnh hệ thống 103 Hình 4.1 Robot leo dốc 105 Hình 4.2 Robot di chuyển địa hình khơng phẳng 106 Hình 4.3 Robot leo bậc 106 Hình 4.4 Nhận diện người 107 Hình 4.5 Nhận diện nhiều người 107 Hình 4.6 Nhận diện mèo 108 Hình 4.7 Robot nhận diện người điều kiện thiếu sáng 108 Hình 4.8 Robot nhận diện nhiều người điều kiện thiếu sáng 108 10 Giao diện thích hợp chế độ điều khiển, phím điều hướng phím chức năng: • Các chế độ nhận diện bằng: Yolo v5, Yolo v8 • Các phím chức năng: Start Detection, Stop Detection 104 CHƯƠNG KHỞI CHẠY GIAO DIỆN VÀ THỬ NGHIỆM ĐÁNH GIÁ HỆ THỐNG 4.1 Thử nghiệm đánh giá hệ thống Thử nghiệm robot leo dốc Hình 4.1 Robot leo dốc Kết quả: - Quãng đường di chuyển: 𝑆 = 2m, độ dốc 30 độ - Thời gian trung bình hồn thành qng đường: 𝑡 ≈8s - Xe với tốc độ ổn định, hình ảnh truyền có rung lắc nhẹ 105 Thử nghiệm robot vượt địa hình khơng phẳng Hình 4.2 Robot di chuyển địa hình khơng phẳng Kết quả: - Qng đường di chuyển: 𝑆 = 5m - Thời gian trung bình hồn thành qng đường: 𝑡 ≈ 25s - Xe di chuyển với tốc độ chậm, cấu robot thích hợp vượt địa hình có độ gồ ghề thấp, phần động giảm tốc bị vướng vượt qua sỏi đá có độ cao lớn Thử nghiệm robot leo bậc thang Hình 4.3 Robot leo bậc 106 Kết quả: Nhóm thử nghiệm robot vượt qua bậc thang có độ cao 20cm, xe vượt qua bậc thang cách dễ dàng 4.2 Kết nhận diện Sau thực nghiệm, khả nhận diện robot hoạt động ổn định Robot có khả nhận diện đầy đủ ánh sáng hay điều kiện bóng tối khơng có ánh sáng Robot có khả nhận diện có phận thể có khung hình Hình 4.4 Nhận diện người Hình 4.5 Nhận diện nhiều người 107 Hình 4.6 Nhận diện mèo Hình 4.7 Robot nhận diện người điều kiện thiếu sáng Hình 4.8 Robot nhận diện nhiều người điều kiện thiếu sáng 108 4.3 Kết luận phương hướng phát triển Kết luận Sau thời gian thực nghiên cứu, chế tạo, lắp ráp mơ hình đồ án tốt nghiệp cố gắng, nhiệt huyết tất thành viên nhóm hướng dẫn, giúp đỡ nhiệt tình thầy ThS Bùi Huy Anh, nhóm hồn thành đồ án tốt nghiệp tiến độ đáp ứng yêu cầu đề thu kết quả: - Xây dựng mơ hình hệ thống khí, điều khiển xe chạy tiến, chạy lùi, rẽ trái, rẽ phải, thay đổi tốc độ di chuyển - Thiết kế hệ thống điện, điều khiển hệ thống - Thiết kế giao diện máy tính thân thiện dễ sử dụng - Hệ thống hoạt động đáp ứng theo yêu cầu thiết kế - Mơ hình nhỏ gọn, có tính thẩm mỹ, an tồn, dễ dàng sử dụng - Hiểu ngun lí hoạt động động module - Mô hình có tính ứng dụng để phát triển thực tế Ngồi ra, việc thực thành cơng mơ hình đồ án giúp nâng cao tinh thần làm việc nhóm, nâng cao tinh thần học hỏi tìm tịi, bước đà cho phát triển thân sau Phương hướng phát triển Phát triển hệ thống điều khiển: điều khiển qua máy tính, điện thoại hệ thống mạng vệ tinh điều khiển nhiều điều kiện khác thích hợp ứng dụng nhiều cơng việc đặc thù có điều kiện hoạt động khó khăn Sử dụng thêm cảm biến khác như: cảm biến nhiệt độ, độ ẩm, ánh sáng, khí độc hại để thăm dị mơi trường Tích hợp hệ thống định vị GPS để xác định vị trí robot Thiết kế mơ hình hoạt động hai chế độ: thủ công (điều khiển tay) tự động (xe tự động di chuyển theo lộ trình yêu cầu) 109 Thiết kế khung xe cứng cáp, chắn, động công suất lớn hơn, hệ thống điều khiển ổn định, xác để xe hoạt động tốt nhiều loại địa hình 110 TÀI LIỆU THAM KHẢO [1] N T Hải, Giáo trình Xử Lý Ảnh, Đại học Sư Phạm Kỹ Thuật Thành Phố Hồ Chí Minh [2] N V Long, Ứng dụng xử lý ảnh thực tế với OpenCV, Đại học Sư Phạm Kỹ Thuật Thành Phố Hồ Chí Minh [3] J E Grayson, Python and Tkinter programming, Manning Publications Co Greenwich, 2000 [4] A D Moore, Python GUI Programming with Tkinter: Develop responsive and powerful GUI applications with Tkinter, Packt Publishing Ltd, 2018 [5] N Q Khang, Vật lí đại cương 1, Đại học Bách Khoa Hà Nội, 2008 [6] G T T Đ Thám, Cơ học kỹ thuật, Đại Học Quốc Gia Hà Nội, 2019 [7] K H Chandu, P H Narayana, K C C Teja, B Sai Y M Mohan, FABRICATION OF ROCKER BOGIE MECHANISM, August 2020 [8] Elgendy Mohamed, Deep Learning for Vision Systerms, Manning, November 10, 2020 [9] P T Đ N Tồn, Giáo trình môn học Xử lý ảnh, 2013 111 PHỤ LỤC Các vẽ thiết kế phân tách chi tiết: 1) Bản vẽ chế tạo khí Rocker Bogie Robot 2) Bản vẽ chế tạo khí 3) Bản vẽ chế tạo khí 4) Bản vẽ chế tạo khí 5) Bản vẽ khung thân 6) Bản vẽ khung bên 7) Bản vẽ phân tách Robot 8) Bản vẽ phân tách khung xe 9) Bản vẽ phân tách khung bên 10) Bản vẽ hệ thống điều khiển Souce code giao diện: # Khai bao thu vien import PIL from pathlib import Path from tkinter import * import tkinter as tk from tkinter import Tk, Canvas, Entry, Text, Button, ttk, PhotoImage from tkinter.messagebox import showinfo from PIL import Image, ImageTk from threading import Thread from ultralytics import YOLO from yolov5 import * from imutils.video import VideoStream #Tao duong dan den thu muc luu anh va khoi chay model yolo OUTPUT_PATH = Path( file ).parent ASSETS_PATH = OUTPUT_PATH / Path(r"F:\Apphoctap\Code\Allcode\Giaodien\Main\build\assets\frame0") def relative_to_assets(path: str) -> Path: return ASSETS_PATH / Path(path) modelyolov8 = YOLO("yolov8s-seg.pt") #Khai bao bien dieu khien stop = None start = None waitz=None # Cac ham dieu khien nut def start_process(): global stop global start stop = start = print("Start") if chosenet_cb.get() video() if chosenet_cb.get() yolov5det() if chosenet_cb.get() print("yolov8") wait() print(waitz) wind() nhan == 'None': == 'YOLO V5': == 'YOLO V8': #Khoi tao giao dien def stop_dectect(): global stop global start stop = start = window = Tk() window.geometry("1200x700") window.configure(bg="#FFFFFF") canvas = Canvas( window, bg="#FFFFFF", height=700, width=1200, bd=0, highlightthickness=0, relief="ridge" ) canvas.place(x=0, y=0) image_image_1 = PhotoImage( file=relative_to_assets("image_1.png")) image_1 = canvas.create_image( 600.0, 350.0, image=image_image_1 ) image_image_2 = PhotoImage( file=relative_to_assets("image_2.png")) image_2 = canvas.create_image( 65.0, 65.0, image=image_image_2 ) button_image_1 = PhotoImage( file=relative_to_assets("button_1.png")) button_1 = Button( image=button_image_1, borderwidth=0, highlightthickness=0, command=lambda: print("button_1 clicked"), relief="flat" ) button_1.place( x=53.0, y=150.0, width=310.0, height=60.0 ) button_image_2 = PhotoImage( file=relative_to_assets("button_2.png")) button_2 = Button( image=button_image_2, borderwidth=0, highlightthickness=0, command=start_process, relief="flat" ) button_2.place( x=53.0, y=285.0, width=310.0, height=60.0 ) button_image_3 = PhotoImage( file=relative_to_assets("button_3.png")) button_3 = Button( image=button_image_3, borderwidth=0, highlightthickness=0, command=stop_dectect, relief="flat" ) button_3.place( x=53.0, y=360.0, width=310.0, height=60.0 ) image_image_3 = PhotoImage( file=relative_to_assets("image_3.png")) image_3 = canvas.create_image( 692.0, 80.0, image=image_image_3 ) # Tab tab_control = ttk.Notebook(window, width=315, height=200) tab_control.pack(expand=True) tab_control.place(x=53,y=460) tab_1 = ttk.Frame(tab_control) tab_2 = ttk.Frame(tab_control) tab_3 = ttk.Frame(tab_control) tab_control.add(tab_1, text='Wellcome') tab_control.add(tab_2, text='Guide') tab_control.add(tab_3, text='Info') lbl1 = Label(tab_1) ipimglb = Image.open(r'C:\Users\ngokh\Desktop\willdel\Main\build\assets\frame1 \image_4.png') img1 = ImageTk.PhotoImage(ipimglb) lbl1.place(x=0, y=0) lbl1.configure(image=img1) lbl2 = Label(tab_2) lbl2.place(x=0, y=0) ipimglb2 = Image.open(r'C:\Users\ngokh\Desktop\willdel\Main\build\assets\frame1 \image_5.png') img2 = ImageTk.PhotoImage(ipimglb2) lbl2.place(x=0, y=0) lbl2.configure(image=img2) lbl3 = Label(tab_3) lbl3.place(x=0, y=0) ipimglb3 = Image.open(r'C:\Users\ngokh\Desktop\willdel\Main\build\assets\frame1 \image_6.png') img3 = ImageTk.PhotoImage(ipimglb3) lbl3.place(x=0, y=0) lbl3.configure(image=img3) # create a combobox selected_net = tk.StringVar() chosenet_cb = ttk.Combobox(window, font="Times 30", textvariable=selected_net, width=14) chosenet_cb['values'] = ['None', 'YOLO V5', 'YOLO V8'] chosenet_cb['state'] = 'readonly' chosenet_cb.current(0) chosenet_cb.place(y=220, x=55) # Thong bao chon mang nhan dien def net_changed(event): showinfo( title='Result', message=f'You selected {selected_net.get()}!' ) chosenet_cb.bind('', net_changed) # Lay hinh anh tu camera rtsp_url = "rtsp://tapoadmin:Khongcomatkhau1@192.168.0.101:554/stream2" cap = VideoStream(rtsp_url).start() # Normal def video(): image = cap.read() image = cv2.resize(image, (820, 520)) cv2image = cv2.cvtColor(image, cv2.COLOR_BGR2RGBA) img = PIL.Image.fromarray(cv2image) imgtk = PIL.ImageTk.PhotoImage(image=img) canvas.imgtk = imgtk canvas.create_image(373, 160, anchor=NW, image=imgtk) if stop == and start == 0: return window.after(1, video) # YOLO V5 def yolov5det(): image = cap.read() def yolov5t(): detection = model(image) results = detection.pandas().xyxy[0].to_dict(orient="records") x = numpy.array(results) for result in results: # confidence = result['confident'] name = result['name'] clas = result['class'] x1 = int(result['xmin']) y1 = int(result['ymin']) x2 = int(result['xmax']) y2 = int(result['ymax']) cv2.putText(image, name, (x1 + 3, y1 - 10), font, fontScale, color1, thickness, cv2.LINE_AA) cv2.rectangle(image, (x1, y1), (x2, y2), color, 4) t1 = Thread(target=yolov5t) t1.start() t1.join() showimage = cv2.resize(image, (820, 520)) cv2image = cv2.cvtColor(showimage, cv2.COLOR_BGR2RGBA) img = Image.fromarray(cv2image) imgtk = ImageTk.PhotoImage(image=img) canvas.imgtk = imgtk canvas.create_image(373, 160, anchor=NW, image=imgtk) if stop == and start == 0: return window.after(1, yolov5det) # YOLO V8 yolowin = '' def wind(): global yolowin global waitz yolowin = Toplevel(window) yolowin.geometry("820x520") yolowin.title("Instance segmentation") yolowin.resizable(False, False) btn2 = Button(yolowin, text="Close me", command=windetroy ) btn2.place(x=400, y=480) label = Label(yolowin) label.place(x=0, y=0) print(waitz) if waitz==1: # global yolowin def yolov8dect(): _, frame = cap.read() result = modelyolov8(frame,classes=[0, 15, 16]) showimage = result[0].plot() resized = cv2.resize(showimage, (820, 520)) cv2image = cv2 cvtColor(resized, cv2.COLOR_BGR2RGBA) img = Image.fromarray(cv2image) imgtk = ImageTk.PhotoImage(image=img) label.imgtk = imgtk label.configure(image=imgtk) label.after(1, yolov8dect()) yolov8dect() def wait(): global waitz waitz=1 print(waitz) def windetroy(): global waitz waitz=0 print(waitz) yolowin.destroy() window.resizable(False, False) window.mainloop()