(Đồ án tốt nghiệp) Tối ưu hóa dữ liệu đầu vào và cải tiến tính ổn định cho xe tự hành(Đồ án tốt nghiệp) Tối ưu hóa dữ liệu đầu vào và cải tiến tính ổn định cho xe tự hành(Đồ án tốt nghiệp) Tối ưu hóa dữ liệu đầu vào và cải tiến tính ổn định cho xe tự hành(Đồ án tốt nghiệp) Tối ưu hóa dữ liệu đầu vào và cải tiến tính ổn định cho xe tự hành(Đồ án tốt nghiệp) Tối ưu hóa dữ liệu đầu vào và cải tiến tính ổn định cho xe tự hành(Đồ án tốt nghiệp) Tối ưu hóa dữ liệu đầu vào và cải tiến tính ổn định cho xe tự hành(Đồ án tốt nghiệp) Tối ưu hóa dữ liệu đầu vào và cải tiến tính ổn định cho xe tự hành(Đồ án tốt nghiệp) Tối ưu hóa dữ liệu đầu vào và cải tiến tính ổn định cho xe tự hành(Đồ án tốt nghiệp) Tối ưu hóa dữ liệu đầu vào và cải tiến tính ổn định cho xe tự hành(Đồ án tốt nghiệp) Tối ưu hóa dữ liệu đầu vào và cải tiến tính ổn định cho xe tự hành(Đồ án tốt nghiệp) Tối ưu hóa dữ liệu đầu vào và cải tiến tính ổn định cho xe tự hành(Đồ án tốt nghiệp) Tối ưu hóa dữ liệu đầu vào và cải tiến tính ổn định cho xe tự hành(Đồ án tốt nghiệp) Tối ưu hóa dữ liệu đầu vào và cải tiến tính ổn định cho xe tự hành(Đồ án tốt nghiệp) Tối ưu hóa dữ liệu đầu vào và cải tiến tính ổn định cho xe tự hành
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH KHOA CƠ KHÍ ĐỘNG LỰC ĐỒ ÁN TỐT NGHIỆP TỐI ƯU HÓA DỮ LIỆU ĐẦU VÀO VÀ CẢI TIẾN TÍNH ỔN ĐỊNH CHO XE TỰ HÀNH SVTH: TRƯƠNG ĐÌNH PHÚC MSSV: 16145599 SVTH: PHẠM HÀ VĨ MSSV: 16145577 GVHD: Th.S NGUYỄN THÀNH TUYÊN Tp Hồ Chí Minh, ngày 25 tháng năm 2021 LỜI CẢM ƠN Trong thời gian làm đề tài tốt nghiệp, nhóm chúng em nhận nhiều giúp đỡ, đóng góp ý kiến bảo nhiệt tình thầy cơ, gia đình bạn bè Nhóm chúng em xin gửi lời cảm ơn chân thành đến Th.s Nguyễn Thành Tuyên, giảng viên Bộ môn Điện-Điện tử - trường Đại Học Sư Phạm Kỹ Thuật Thành Phố Hồ Chí Minh người tận tình hướng dẫn, bảo em suốt trình thực đề tài tốt nghiệp Đồng thời nhóm xin chân thành cảm ơn thầy cô giáo trường Đại Học Sư Phạm Kỹ Thuật Thành Phố Hồ Chí Minh nói chung, thầy Bộ mơn ĐiệnĐiện tử nói riêng dạy dỗ cho em kiến thức môn đại cương môn chuyên ngành, giúp em có sở lý thuyết vững vàng tạo điều kiện giúp đỡ em suốt trình học tập Cuối chúng em xin chân thành cảm ơn gia đình bạn bè, tạo điều kiện, quan tâm, giúp đỡ, động viên nhóm suốt q trình học tập, nghiên cứu hồn thành đề tài tốt nghiệp TĨM TẮT Đề tài: “Tối ưu hóa liệu đầu vào cải tiến ổn định cho xe tự hành.” Đề tài xây dựng tảng “Xe tự hành chạy theo lane nhận diện biển báo” sinh viên Lê Minh Hùng, Nguyễn Trung Trực đề tài nghiên cứu chế tạo trường Đại Học Sư Phạm Kỹ Thuật Thành Phố Hồ Chí Minh Thời gian thực 1/2020 đến 7/2020 đề tài ứng dụng vào thực tế Đề tài chúng em thay thế, nâng cấp số phần cứng, tối ưu thuật tốn, giảm số lượng ảnh training đoạn đường có khoảng cách tương tự, đồng thời đề tài mở rộng phạm vi hoạt động xe so với đề tài ban đầu, điều quan trọng cải tiến thiết kế thuật toán traning với kiến trúc mạng neural tích chập Đề tài chúng em nối tiếp đề tài trước trở thành bước đệm cho đề tài ROS (Robot operating system) cho xe tự hành Mục đích thứ hai nhóm thực đề tài liên quan đến mảng trí tuệ nhân tạo, thị giác máy tính xe tự hành nhằm đem khái niệm, sở lý thuyết trí tuệ nhân tạo đến gần với người học đặc biệt sinh viên nghành ô tô trường Là kỹ sư tơ đam mê tơ chưa đủ,chúng ta phải ngày nâng cao kiến thức,tìm tịi học hỏi cơng nghệ giới Thì xe tự hành xu tất yếu ngành ô tô vài năm tới,nên việc nghiên cứu xây dựng mơ điều cấp thiết Ngành ô tô Việt Nam ngày phát triển mạnh mẽ,rất có tiềm tương lai,cộng thêm đam mê nghiên cứu ngày nhiều chúng em tin tương lai khơng xa tơ tự hành Việt Nam khơng cịn định nghĩa xa vời,mà thay vào thực tế hiển nhiên Bởi lý nhận thấy trên,nên nhóm em định nghiên cứu đề tài: “Tối ưu hóa liệu đầu vào cải tiến ổn định cho xe tự hành” ii MỤC LỤC LỜI CẢM ƠN i TÓM TẮT ii MỤC LỤC iii DANH MỤC CÁC HÌNH vii DANH MỤC CÁC BẢNG xi CHƯƠNG 1: TỔNG QUÁT 1.1 LÝ DO CHỌN ĐỀ TÀI 1.2 CÁC NGHIÊN CỨU TRONG VÀ NGOÀI NƯỚC 1.2.1 Nghiên cứu nước 1.2.2 Nghiên cứu nước 1.3 MỤC ĐÍCH CỦA ĐỀ TÀI 1.4 NHIỆM VỤ VÀ GIỚI HẠN CỦA ĐỀ TÀI 1.5 PHƯƠNG PHÁP NGHIÊN CỨU CHƯƠNG 2: CƠ SỞ LÝ THUYẾT 2.1 XE TỰ HÀNH 2.1.1 Giới thiệu xe tự hành 2.1.2 Cấp độ xe tự hành 2.2 PHƯƠNG PHÁP NHẬN DIỆN LANE 2.3 THUẬT TOÁN PID 12 2.3.1 Giới thiệu 12 2.3.2 Nguyên lý thuật toán 12 2.3.3 Công thức PID 13 2.4 GIỚI THIỆU VỀ PYTHON ANACONDA3 14 2.4.1 Giới thiệu 14 2.4.2 Chức 14 iii 2.5 GIỚI THIỆU VỀ NUMPY- MATPLOTLIB 15 2.5.1 Numpy 15 2.5.2 Matplotlib 16 2.6 LÝ THUYẾT VỀ MẠNG NEURAL TÍCH CHẬP 16 2.6.1 Giới thiệu: 16 2.6.2 Phân loại ảnh (Image Classification) 17 2.6.3 Cấu trúc mạng neural tích chập 17 2.6.3.1 Convolution layer 18 2.6.3.2 Nonline layer 19 2.6.3.3 Pooling layer 19 2.6.3.4 Fully connected layer .20 2.7 GIỚI THIỆU VỀ MỘT SỐ PHẦN MỀM HỖ TRỢ KHÁC 21 2.7.1 Giới thiệu Proteus 21 2.7.2 Giới thiệu Inventor 22 2.7.3 Giới thiệu Arduino IDE 22 CHƯƠNG 3: XÂY DỰNG VÀ LẬP TRÌNH HỆ THỐNG 24 3.1 GIỚI THIỆU 24 3.2 XÂY DỰNG PHẦN CỨNG 26 3.2.1 Xây dựng khối điều khiển lái 26 3.2.1.1 Bộ Bánh vít – Trục vít 27 3.2.1.2 Động bước 57HS7630A4 29 3.2.1.3 Module TB6600 30 3.2.2 Khối điều khiển xử lý trung tâm 32 3.2.2.1 Laptop HP Pavalion 15 32 3.2.2.2 Arduino Uno R3 34 iv 3.2.3 Khối thu thập hình ảnh 37 3.2.3.1 Camera 37 3.2.3.2 Thiết kế kệ chống rung cho Camera .38 3.2.4 Xây dựng khối động 43 3.2.4.1 Động 44 3.2.4.2 Module BTS7960 45 3.2.4.3 Module Encoder xoay .46 3.2.5 Nguồn ắc quy 47 3.3 THIẾT BỊ, LINH KIỆN, MƠ-ĐUN VÀ SƠ ĐỒ NGUN LÝ TỒN MẠCH CỦA HỆ THỐNG 49 3.4 LẬP TRÌNH HỆ THỐNG 54 3.4.1 Lập trình PID cho động 54 3.4.2 Cài đặt Anaconda3 NvidiaCuda 57 3.4.3 Sửa đổi thuật toán training 60 3.4.4 Xây dựng lưu đồ giải thuật 66 3.4.4.1 Lưu đồ nhận diện lane .66 3.4.4.2 Lưu đồ nhận diện biển báo Stop .66 3.4.4.3 Cải tiến thuật toán training cho ảnh màu thiết kế CNN 68 CHƯƠNG 4: THỰC NGHIỆM VÀ ĐÁNH GIÁ 73 4.1 KẾT QUẢ 73 4.2 THỰC NGHIỆM 76 4.2.1 Thực nghiệm xe nhận diện biển báo lane 76 4.2.2 Thực nghiệm PID khối động xe 77 4.3 THỐNG KÊ 78 4.3.1 Thống kê cho xe nhận diện biến báo lane 78 4.3.1.1 Lập bảng thống kê 78 v 4.3.1.2 Lập bảng thống kê đoạn đường xung quanh khuôn viên khoa 82 4.3.1.2.1 Đoạn đường cong thứ 82 4.3.1.2.2 Đoạn đường cong thứ 84 4.3.1.2.3 Đoạn đường cong thứ 85 4.3.1.2.4 Đoạn đường cong thứ 87 4.3.1.3 Lập bảng thống kê PID động .88 4.3.1.4 Lập bảng so sánh liệu đầu vào 90 4.3.2 Các lỗi thường gặp 90 CHƯƠNG 5: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 94 5.1 KẾT LUẬN 94 5.2 HƯỚNG PHÁT TRIỂN 94 TÀI LIỆU THAM KHẢO 96 PHỤ LỤC 97 vi DANH MỤC CÁC HÌNH Trang Hình 2.1 Các cấp độ xe tự hành Hình 2.2 Khởi tạo mơi trường .8 Hình 2.3 Cài đặt kiểm tra thư viện Hình 2.4 Thuật tốn chụp ảnh python .9 Hình 2.5.Chuẩn bị file ảnh training Hình 2.6 Tạo liên kết từ thuật toán traning đến thư mục chứa liệu 10 Hình 2.7 Quá trình traning .10 Hình 2.8 Kết sau hồn tất trình traning 10 Hình 2.9 Thử nghiệm file traning thuật tốn .11 Hình 2.10 Công thức PID (Wikipedia.com) 13 Hình 2.11 Anaconda3 .14 Hình 2.12 Chức Anaconda- Python 15 Hình 2.13 Cấu trúc CNN 18 Hình 2.14 So sánh Filter 18 Hình 2.15 Cơng thức hàm kích hoạt 19 Hình 2.16 Các dạng tổng hợp 20 Hình 2.17 Giao diện Proteus 21 Hình 2.18 Giao diện Inventor 22 Hình 2.19 Giao diện IDE 23 Hình 3.1 Mơ hình xe 24 Hình 3.2 Bánh xe 25 Hình 3.3 Sơ đồ khối hệ thống 26 Hình 3.4 Cơ cấu hệ thống lái 26 Hình 3.5 Hệ thống lái mơ hình 27 Hình 3.6 Mơ nối trục Inventor .28 Hình 3.7 Bánh trục vít mơ hình 29 Hình 3.8 Động bước size 57 29 Hình 3.9 Phương pháp điều khiển động bước .30 Hình 3.10 Module TB6600 31 vii Hình 3.11 Mơ hệ thống lái Proteus 32 Hình 3.12 Laptop HP Pavalion 15 32 Hình 3.13 Arduino Uno R3 34 Hình 3.14 Sơ đồ chân Arduino mạch mô 36 Hình 3.15 Các thơng số Arduino Uno R3 36 Hình 3.16 Camera logitech C270 .37 Hình 3.17 Trục Pitch, Yaw, Roll biểu diễn không gian 38 Hình 3.18 Cảm biến MPU6050 mơ .39 Hình 3.19 Cảm biến MPU6050 39 Hình 3.20 Servo SG90 .40 Hình 3.21 Arduino Nano V3.0 Atmega328P 40 Hình 3.22 Sơ đồ dây thiết bị 42 Hình 3.23 Các phận hệ thống mô để chế tạo 42 Hình 3.24 Cơ cấu hệ thống truyền động thực tế .43 Hình 3.25 Mơ thực CNC khớp nối 43 Hình 3.26 Động RS550 .44 Hình 3.27 Module BTS7690 43A 45 Hình 3.28 Sơ đồ chân Module BTS7690 43A 46 Hình 3.29 Module BTS7690 43A mơ hình .46 Hình 3.30 Mơ khối động Proteus 46 Hình 3.31 Module encoder xoay 47 Hình 3.32 Ắc quy .48 Hình 3.33 Cầu chì 48 Hình 3.34 Sơ đồ mạch hệ thống proteus 53 Hình 3.35 Mạch đo điện áp từ động size 55 Hình 3.36 Mơ 3D bánh dẫn động module encoder .55 Hình 3.37 Mơ 2D bánh dẫn động encoder 56 Hình 3.38 Bánh hoàn chỉnh lắp đặt xe 56 Hình 3.39 Bảng phương pháp dò số 56 Hình 3.40 =>3.47 Các bước thực cài đặt 59 Hình 3.48 Giao diện Anaconda3 60 viii Hình 3.49 Mơi trường chạy thuật tốn .61 Hình 3.50 Môi trường training 62 Hình 3.51 => 3.53 Các bước cài đặt cuDNN 63 Hình 3.54 Lưu đồ nhận diện chạy theo lane 66 Hình 3.55 Lưu đồ nhận diện biển báo 67 Hình 3.56 Nhận diện biến báo Stop xưởng 70 Hình 3.57 Chỉ số Accuracy file traning biểu đồ trình train 70 Hình 4.1 Mơ hình xe 73 Hình 4.2 Mơ hình xe sau thi công 73 Hình 4.3 Sơ đồ mạch điện cũ 74 Hình 4.4 Mạch điện 74 Hình 4.5 Khi xe nhận diện thẳng 74 Hình 4.6 Khi xe thẳng 75 Hình 4.7 Khi xe nhận diện cong 75 Hình 4.8 Khi xe vào cua 76 Hình 4.9 Khi xe nhận diện biển báo 76 Hình 4.10 Thực nghiệm cho xe chạy PID 77 Hình 4.11 Thực nghiệm đoạn thẳng cũ 79 Hình 4.12 Thực nghiệm biển báo 79 Hình 4.13 Thực nghiệm đường cong cũ 80 Hình 4.14 Biểu đồ so sánh bảng thống kê 81 Hình 4.15 Cụm ảnh thực nghiệm đường cong số 82 Hình 4.16 Biểu đồ so sánh cung đường thược nghiệm cong số 83 Hình 4.17 Cụm ảnh thực nghiệm đường cong số 84 Hình 4.18 Biểu đồ so sánh cung đường thược nghiệm đường cong 85 Hình 4.19 Cụm ảnh thực nghiệm đường cong số 85 Hình 4.20 Biểu đồ so sánh cung đường thược nghiệm đường cong số 86 Hình 4.21 Cụm ảnh thực nghiệm đường cong số 87 Hình 4.22 Biểu đồ so sánh cung đường thực nghiệm P4 88 Hình 5.23 Biểu đồ thể liệu đầu vào 90 ix // === INTERRUPT DETECTION ROUTINE === // ================================================================ volatile bool mpuInterrupt = false; // indicates whether MPU interrupt pin has gone high void dmpDataReady() { mpuInterrupt = true; } // ================================================================ // === INITIAL SETUP === // ================================================================ void setup() { // join I2C bus (I2Cdev library doesn't this automatically) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin(); Wire.setClock(400000); // 400kHz I2C clock Comment this line if having compilation difficulties #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire::setup(400, true); #endif // initialize serial communication // (115200 chosen because it is required for Teapot Demo output, but it's // really up to you depending on your project) Serial.begin(38400); while (!Serial); // wait for Leonardo enumeration, others continue immediately // initialize device //Serial.println(F("Initializing I2C devices ")); mpu.initialize(); pinMode(INTERRUPT_PIN, INPUT); devStatus = mpu.dmpInitialize(); // supply your own gyro offsets here, scaled for sensitivity mpu.setXGyroOffset(17); mpu.setYGyroOffset(-69); mpu.setZGyroOffset(27); mpu.setZAccelOffset(1551); // 1688 factory default for my test chip // make sure it worked (returns if so) if (devStatus == 0) { // turn on the DMP, now that it's ready // Serial.println(F("Enabling DMP ")); mpu.setDMPEnabled(true); 111 attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus(); // set our DMP Ready flag so the main loop() function knows it's okay to use it //Serial.println(F("DMP ready! Waiting for first interrupt ")); dmpReady = true; // get expected DMP packet size for later comparison packetSize = mpu.dmpGetFIFOPacketSize(); } else { // ERROR! // = initial memory load failed // = DMP configuration updates failed // (if it's going to break, usually the code will be 1) // Serial.print(F("DMP Initialization failed (code ")); //Serial.print(devStatus); //Serial.println(F(")")); } // Define the pins to which the servo motors are connected servo0.attach(10); servo1.attach(9); servo2.attach(8); } // ================================================================ // === MAIN PROGRAM LOOP === // ================================================================ void loop() { // Nếu chương trình hỏng khơng nên thử, khơng nạp đủ lib if (!dmpReady) return; // wait for MPU interrupt or extra packet(s) available while (!mpuInterrupt && fifoCount < packetSize) { if (mpuInterrupt && fifoCount < packetSize) { // try to get out of the infinite loop fifoCount = mpu.getFIFOCount(); } } // reset interrupt flag and get INT_STATUS byte mpuInterrupt = false; 112 mpuIntStatus = mpu.getIntStatus(); // get current FIFO count fifoCount = mpu.getFIFOCount(); // check for overflow (this should never happen unless our code is too inefficient) if ((mpuIntStatus & _BV(MPU6050_INTERRUPT_FIFO_OFLOW_BIT)) || fifoCount >= 1024) { // reset so we can continue cleanly mpu.resetFIFO(); fifoCount = mpu.getFIFOCount(); Serial.println(F("FIFO overflow!")); // otherwise, check for DMP data ready interrupt (this should happen frequently) } else if (mpuIntStatus & _BV(MPU6050_INTERRUPT_DMP_INT_BIT)) { // wait for correct available data length, should be a VERY short wait while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount(); // read a packet from FIFO mpu.getFIFOBytes(fifoBuffer, packetSize); // track FIFO count here in case there is > packet available // (this lets us immediately read more without waiting for an interrupt) fifoCount -= packetSize; // Get Yaw, Pitch and Roll values #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&gravity, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); // Yaw, Pitch, Roll values - Radians to degrees ypr[0] = ypr[0] * 180 / M_PI; ypr[1] = ypr[1] * 180 / M_PI; ypr[2] = ypr[2] * 180 / M_PI; // Skip 300 readings (self-calibration process) if (j 3.5 tons prohibited', 18:'No entry', 19:'General caution', 20:'Dangerous curve left', 21:'Dangerous curve right', 22:'Double curve', 23:'Bumpy road', 24:'Slippery road', 25:'Road narrows on the right', 26:'Road work', 27:'Traffic signals', 28:'Pedestrians', 29:'Children crossing', 122 30:'Bicycles crossing', 31:'Beware of ice/snow', 32:'Wild animals crossing', 33:'End speed + passing limits', 34:'Turn right ahead', 35:'Turn left ahead', 36:'Ahead only', 37:'Go straight or right', 38:'Go straight or left', 39:'Keep right', 40:'Keep left', 41:'Roundabout mandatory', 42:'End of no passing', 43:'End no passing veh > 3.5 tons' } #initialise GUI top=tk.Tk() top.geometry('800x600') top.title('Traffic sign classification') top.configure(background='#CDCDCD') label=Label(top,background='#CDCDCD', font=('arial',15,'bold')) sign_image = Label(top) def classify(file_path): global label_packed image = Image.open(file_path) image = image.resize((30,30)) image = numpy.expand_dims(image, axis=0) image = numpy.array(image) pred = model.predict_classes(image)[0] sign = classes[pred+1] print(sign) label.configure(foreground='#011638', text=sign) def show_classify_button(file_path): classify_b=Button(top,text="Classify Image",command=lambda: classify(file_path),padx=10,pady=5) classify_b.configure(background='#364156', foreground='white',font=('arial',10,'bold')) classify_b.place(relx=0.79,rely=0.46) def upload_image(): 123 try: file_path=filedialog.askopenfilename() uploaded=Image.open(file_path) uploaded.thumbnail(((top.winfo_width()/2.25),(top.winfo_height()/2.25))) im=ImageTk.PhotoImage(uploaded) sign_image.configure(image=im) sign_image.image=im label.configure(text='') show_classify_button(file_path) except: pass upload=Button(top,text="Upload an image",command=upload_image,padx=10,pady=5) upload.configure(background='#364156', foreground='white',font=('arial',10,'bold')) upload.pack(side=BOTTOM,pady=50) sign_image.pack(side=BOTTOM,expand=True) label.pack(side=BOTTOM,expand=True) heading = Label(top, text="Know Your Traffic Sign",pady=20, font=('arial',20,'bold')) heading.configure(background='#CDCDCD',foreground='#364156') heading.pack() top.mainloop() 124 ... ô tô tự hành Việt Nam không định nghĩa xa vời,mà thay vào thực tế hiển nhiên Bởi lý nhận thấy trên,nên nhóm em định nghiên cứu đề tài: ? ?Tối ưu hóa liệu đầu vào cải tiến ổn định cho xe tự hành? ??... suốt trình học tập, nghiên cứu hồn thành đề tài tốt nghiệp TĨM TẮT Đề tài: ? ?Tối ưu hóa liệu đầu vào cải tiến ổn định cho xe tự hành. ” Đề tài xây dựng tảng ? ?Xe tự hành chạy theo lane nhận diện biển... phạm vi tự hành (khuôn viên khoa khí động lực) - Giảm số lượng ảnh training đầu vào cho xe - Lập trình Pid cho hai động để xe ổn định - Thiết kế thuật toán phù hợp cho hệ thống lái Để hoàn thành