THIẾT KẾ, CHẾ TẠO MÔ HÌNH ROBOT TỰ HÀNH ỨNG DỤNG XỬ LÝ ẢNH

95 425 15
THIẾT KẾ, CHẾ TẠO MÔ HÌNH ROBOT TỰ HÀNH  ỨNG DỤNG XỬ LÝ ẢNH

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Đề tài được thực hiện và đạt được kết quả nhất định về việc thiết kế, chế tạo được mô hình robot tự hành ứng dụng xử lý ảnh. Dựa trên thuật toán nhận dạng đối tượng đã thực hiện, chúng em phát triển mô hình theo hướng có khả năng nhận dạng và đi theo chỉ dẫn biển báo giao thông (Đây được xem là kết quả chính của đề tài). Hơn thế nữa, chúng em còn áp dụng thuật toán này để tìm kiếm và bám theo vật thể. Để làm tốt kết quả này, chúng em cũng đã thực hiện quá trình xử lý ảnh nhận dạng vật thể, xây dựng hệ thống cơ sở dữ liệu các biển báo giao thông đường bộ, toàn quá trình xử lý ảnh và xây dựng cơ sở dữ liệu được thực hiện trên Raspbian với ngôn ngữ lập trình Python. Thực hiện truyền nhận dữ liệu hình ảnh không dây thông qua đường truyền internet với Wifi, kết hợp với camera được gắn trên xe. Ngoài ra, chúng em còn điều khiển các thao tác của xe bằng giọng nói (Đây là một phần mở rộng về đề tài của chúng em). Với việc sử dụng ứng dụng nhận dạng giọng nói được phát triển dựa trên nền tảng nguồn mở của dự án “Jasper”.

BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC NÔNG LÂM THÀNH PHỐ HỒ CHÍ MINH KHĨA LUẬN TỐT NGHIỆP THIẾT KẾ, CHẾ TẠO MƠ HÌNH ROBOT TỰ HÀNH ỨNG DỤNG XỬ LÝ ẢNH Họ tên sinh viên: HỒ ANH ĐỒNG TRẦN ĐÌNH MINH Ngành: CƠNG NGHỆ KĨ THUẬT CƠ ĐIỆN TỬ Niên khóa: 2012-2016 Tháng năm 2016 THIẾT KẾ, CHẾ TẠO MƠ HÌNH ROBOT TỰ HÀNH ỨNG DỤNG XỬ LÝ ẢNH TÁC GIẢ HỒ ANH ĐỒNG – TRẦN ĐÌNH MINH Khóa luận tốt nghiệp đệ trình đáp ứng yêu cầu cấp Kỹ sư ngành Cơ Điện Tử Giáo viên hướng dẫn: Th.S TRẨN THỊ KIM NGÀ Tháng 06 năm 2016 LỜI CẢM ƠN Em xin trân trọng cảm ơn tất quý thầy cô trường Đại học Nơng Lâm TP.Hồ Chí Minh q Thầy Cơ khoa Cơ Khí - Cơng Nghệ trang bị cho em kiến thức quý báu giúp đỡ em suốt trình học tập trường Em xin chân thành cảm ơn thầy cô môn Cơ Điện Tử giúp đỡ chúng em nhiệt tình thời gian thực đề tài Em xin bày tỏ biết ơn chân thành cô Trần Thị Kim Ngà tận tình hướng dẫn em suốt trình làm Luận văn tốt nghiệp Đặc biệt, em xin cảm ơn quý thầy cô hội đồng dành thời gian nhận xét góp ý để luận văn em hoàn thiện Cuối cùng, em xin gửi lời cảm ơn đến người thân bạn bè động viên, ủng hộ tạo cho em điều kiện thuận lợi suốt q trình hồn thành luận văn TP.HCM, ngày tháng 06 năm 2016 Sinh viên thực HỒ ANH ĐỒNG – TRẦN ĐÌNH MINH TĨM TẮT Đề tài nghiên cứu “Thiết kế, chế tạo mô hình robot tự hành ứng dụng xử lý ảnh” thực trường Đại Học Nông Lâm Thành Phố Hồ Chí Minh, thời gian từ tháng đến tháng năm 2016 Đề tài thực đạt kết định việc thiết kế, chế tạo mơ hình robot tự hành ứng dụng xử lý ảnh Dựa thuật toán nhận dạng đối tượng thực hiện, chúng em phát triển mơ hình theo hướng có khả nhận dạng theo dẫn biển báo giao thông (Đây xem kết đề tài) Hơn nữa, chúng em áp dụng thuật tốn để tìm kiếm bám theo vật thể Để làm tốt kết này, chúng em thực trình xử lý ảnh nhận dạng vật thể, xây dựng hệ thống sở liệu biển báo giao thông đường bộ, tồn q trình xử lý ảnh xây dựng sở liệu thực Raspbian với ngôn ngữ lập trình Python Thực truyền nhận liệu hình ảnh khơng dây thơng qua đường truyền internet với Wifi, kết hợp với camera gắn xe Ngoài ra, chúng em điều khiển thao tác xe giọng nói (Đây phần mở rộng đề tài chúng em) Với việc sử dụng ứng dụng nhận dạng giọng nói phát triển dựa tảng nguồn mở dự án “Jasper” Do thời gian thực hạn chế, mức độ rộng lớn đề tài, nên dù cố gắng phương án giải toán chúng em chắn khơng thể tránh khỏi thiếu sót Chúng em mong nhận đóng góp ý kiến quý thầy cô bạn bè để đề tài chúng em hoàn thiện MỤC LỤC DANH SÁCH CÁC HÌNH Hình 2.1 Điểm ảnh Hình 2.2 Ma trận biểu diễn ảnh nhị phân Hình 2.3 Ma trận biểu diễn ảnh xám Hình 2.4 Ma trận biểu diễn mức xám thành phần RED .5 Hình 2.5 Ma trận biểu diễn mức xám thành phần GREEN Hình 2.6 Ma trận biểu diễn mức xám thành phần BLUE Hình 2.7 Sơ đồ hệ thống xử lý ảnh Hình 2.8 Camera có dây Hình 2.9 Camera khơng dây .8 Hình 2.10 IP Camera Hình 2.11 Mơ hình khơng gian màu RGB 10 Hình 2.12 Mơ hình màu HLS 11 Hình 2.13 Mơ hình màu L*a*b .11 Hình 2.14 Biến đổi Fourier .12 Hình 2.15 Boad Arduino Mega 2560 14 Hình 2.16 Sơ đồ linh kiện board Arduino Mega 2560 .15 Hình 2.17 Sơ đồ chân Board Arduino Mega 2560 16 Hình 2.18 Board Raspberry Pi 17 Hình 2.19 Sơ đồ linh kiện board Raspberry Pi 18 Hình 2.20 Các cổng kết nối Raspberry Pi .20 Hình 2.21 Các thiết bị kèm với Raspberry Pi .21 Hình 2.22 Bảng điều khiển phần mềm SDFormatter 23 Hình 2.23 Giao diện chương trình 23 Hình 2.24 Giao diện trình cài đặt .24 Hình 2.25 Một số hình ảnh giao diện chương trình Putty 26 Hình 2.26 Động DC 30 Hình 2.27 Nguyên lý hoạt động lõi có chổi than .31 Hình 2.28 Động RC Servo MG90S 32 Hình 2.29 Mạch cảm biến siêu âm HC_SR04 32 Hình 2.30 Nguyên lý cảm biến siêu âm 33 Hình 2.31 Bánh xe đa hướng Omni 34 Hình 2.32 Bánh sau xe .34 Hình 2.33 Nhơm ống vng 35 Hình 2.34 Webcam Logitech C270 35 Hình 2.35 Loa mini 36 Hình 2.36 Sạc dự phòng Xmobie Y30 36 Hình 2.37 Led siêu sáng 5W 37 Hình 2.38 Board Raspberry Pi (Module B) 37 Hình 2.39 Arduino Motor Shield VNH2SP30 30A 39 Hình 2.40 Mạch công suất MOSFET IRF520 40 Hình 2.41 Mạch tăng áp 40 Hình 2.42 USB Wifi H-Air .41 Hình 4.1 Sơ đồ nguyên lý hệ thống 45 Hình 4.2 Bộ khung sườn phác thảo 45 Hình 4.3 Bộ khung sườn sau gắn Mica 46 Hình 4.4 Bộ khung sườn sau hoàn thiện 46 Hình 4.5 Mơ hình robot tự hành ứng dụng xử lý ảnh .47 Hình 4.6 Sơ đồ giải thuật điều khiển giọng nói 48 Hình 4.7 Một số biển báo giao thơng thực tế 49 Hình 4.8 Một số hình ảnh sở liệu 50 Hình 4.9 Sơ đồ bước xử lý ảnh nhận dạng biển báo 51 Hình 4.10 Ảnh sau lọc Canny 51 Hình 4.11 Ảnh sau tìm khung hình chữ nhật 52 Hình 4.12 Ảnh sau tách 52 Hình 4.13 Ảnh sau so sánh với sở liệu 53 Hình 4.14 Giải thuật nhận diện biển báo 54 Hình 4.15 Giải thuật điều khiển Robot theo biển báo 55 Hình 4.16 Giải thuật xử lý ảnh nhận dạng trái banh .56 Hình 4.17 Ảnh thu sau tìm Contour 57 Hình 4.18 Ảnh thu sau xác định tâm đối tượng .58 Hình 4.19 Giải thuật điều khiển Robot tìm kiếm bám theo trái banh 59 DANH SÁCH CÁC BẢNG Bảng 1.1 Khảo nghiệm hệ thống nhận dạng giọng nói 60 Bảng 1.2 Khảo nghiệm khoảng cách nhận dạng giọng nói so với mic (Phòng kín) 61 Bảng 1.3 Khảo nghiêm khoảng cách nhận dạng giọng nói so với mic (Ngoài trời) 61 Bảng 2.1 Khảo nghiệm hệ thống nhận dạng biển báo giao thông 62 Bảng 2.2 Khảo nghiệm khoảng cách nhận dạng biển báo giao thông .63 Bảng 2.3 Khảo nghiệm thời gian xử lý Camera với biển báo 63 Bảng 3.1 Khảo nghiệm khoảng cách nhận diện trái banh .64 Bảng 3.2 Khảo nghiệm khả tìm thấy trái banh khoảng cách xác định 65 Bảng 3.3 Khảo nghiệm thời gian xử lý Camera với trái banh 66 Chương MỞ ĐẦU I Đặt vấn đề Trong thập kỷ gần đây, xử lý ảnh nghiên cứu mạnh mẽ có nhiều ứng dụng thực tế Như y học, xử lý ảnh số dùng để phát nhận dạng khối u, cải thiện ảnh X quang, nhận dạng đường biên mạch máu từ ảnh chụp mạch tia X Còn lĩnh vực khoa học kỹ thuật, xử lý ảnh có đóng góp quan trọng, đặc biệt lĩnh vực Robot Robot thông minh ngày khơng thể thiếu yếu tố xử lý ảnh Đó vấn đề nhận dạng đối tượng mơi trường Từ việc nhận dạng giải nhiều tốn tránh vật cản, dò đường, tìm vật… Từ sở đó, việc nghiên cứu toán xử lý ảnh thời đại ngày quan trọng thiếu hầu hết lĩnh vực Ngày nay, lĩnh vực khoa học kỹ thuật cơng nghệ phát triển cách nhanh chóng mạnh mẽ, đặc biệt lĩnh vực Robot thông minh Xử lý ảnh tốn khơng thể thiếu Robot, xem mắt Robot để giúp Robot quan sát, theo dõi đối tượng, dò đường, tìm vật,… Vì thế, tốn xử lý ảnh giúp cho ta điều khiển Robot cách xác dễ dàng Vấn đề đặt là, dùng cơng cụ để lập trình điều khiển cho Robot với tốn xử lý ảnh Nắm bắt điều này, chúng tơi sử dụng công cụ tương đối thị trường Raspberry Pi Với số tính ưu việt, cách sử dụng đơn giản, Raspberry Pi xem cơng cụ tối ưu để giải toán liên quan đến xử lý ảnh, nhằm phát triển cho đề tài nói Robot thơng minh II Mục đích Dựa yêu cầu thực tế ngày lĩnh vực Robot giám sát thông minh Chúng thực đề tài “Thiết kế, chế tạo mơ hình robot tự hành ứng dụng xử lý ảnh” với mục đích nhận dạng bám theo đối tượng, thu thập thông tin phục vụ lĩnh vực an ninh quốc phòng, ngành cơng nghiệp mang tính độc hại cao tiếp xúc với hóa chất độc hại, phục vụ y học, phục vụ giao thông đường với việc nhận dạng biển báo giao thông ứng dụng hệ thống xe thông minh khơng người lái… III Nội dung thực Vì thời gian giới hạn, mức độ rộng lớn đề tài nên thực nghiên cứu vấn đề sau:  Dùng Camera thu tín hiệu video trực tiếp truyền liệu qua cổng USB dùng IP camera thu tín hiệu video truyền liệu thông qua mạng internet Thiết bị thu video kết nối Raspberry để xử lý  Raspberry giao tiếp với Arduino Mega Serial thông qua cáp USB biến Arduino Mega làm chip tớ thực nhiệm vụ điều khiển xe  Tiến hành xử lý ảnh thông qua thư viện nguồn mở OpenCV, viết phần mềm Raspbian ngôn ngữ Python Với mục đích nhận dạng biển báo tìm kiếm trái banh  Sử dụng mic webcam (Logitech C270) làm đầu vào giọng nói thực nhiệm vụ nhận lệnh giọng nói điều khiển xe 10 PHỤ LỤC Code Nhận dạng biển báo trái banh: import cv2 import urllib import time import numpy as np from LoadSymbols import Symbol from websocket import create_connection width = 640 height = 480 # Difference Variables minDiff = 8000 minSquareArea = 2000 match = -1 MidX = width/2 MidY = height/2 font = cv2.FONT_HERSHEY_SIMPLEX maxW = width/2 maxH = height/2 dst = np.array([ [0, 0], [maxW - 1, 0], [maxW - 1, maxH - 1], [0, maxH - 1]], dtype = "float32") stream = urllib.urlopen('http://192.168.137.188:8080/?action=stream') webSocket = create_connection("ws://192.168.137.188:8000") Reference_Symbols = ["Symbols/ArrowL.jpg", "Symbols/ArrowR.jpg", "Symbols/ArrowT.jpg", "Symbols/Ball.jpg", "Symbols/Go.jpg", "Symbols/Stop.jpg"] Symbol_Titles = ["Turn Left 90", "Turn Right 90", "Turn Around", "Search for Ball", "Start ", "Stop!"] 81 Actions = ["Left", "Right", "Back", "Ball", "Go", "Stop"] symbol= [Symbol() for i in range(6)] def load_symbols(): for count in range(6): symbol[count].read(Reference_Symbols[count], Symbol_Titles[count], size=(width/2, height/2)) print "Loading: ", symbol[count].name print "All Reference Images Are Successfully Loaded!" def arduino_string(arduinoList=[], *args): return ''.join(['A1:', str(arduinoList[0]), '&2:', str(arduinoList[1])]) def servo_string(servoAngle): servoDC = 5./180.*(servoAngle)+5 return ''.join(['S', str(round(servoDC, 2))]) def generate_windows(): cv2.namedWindow("Main Frame", cv2.WINDOW_AUTOSIZE) def get_canny_edge(image, sigma=0.33): v = np.median(image) lower = int(max(0, (1.0 - sigma) * v)) upper = int(min(255, (1.0 + sigma) * v)) edged = cv2.Canny(image, lower, upper) return edged def correct_perspective(frame, pts): s = pts.sum(axis = 1) rect[0] = pts[np.argmin(s)] rect[2] = pts[np.argmax(s)] diff = np.diff(pts, axis = 1) rect[1] = pts[np.argmin(diff)] rect[3] = pts[np.argmax(diff)] M = cv2.getPerspectiveTransform(rect, dst) warped = cv2.warpPerspective(frame, M, (width/2,height/2)) warped = cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY) 82 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(warped) threshold = (min_val + max_val)/2 ret, warped = cv2.threshold(warped, threshold, 255, cv2.THRESH_BINARY) return warped def main(): load_symbols() generate_windows() bytes = '' match = -1 w_save = motor_speed = 150 displayText = [] turn = False sign_found = False while True: bytes += stream.read(2048) a = bytes.find('\xff\xd8') b = bytes.find('\xff\xd9') if a!=-1 and b!=-1: jpg = bytes[a:b+2] bytes = bytes[b+2:] camera_frame = cv2.imdecode(np.fromstring(jpg,dtype=np.ui nt8),cv2.IMREAD_COLOR) gray = cv2.cvtColor(camera_frame, cv2.COLOR_BGR2GRAY) blurred = cv2.GaussianBlur(gray,(3,3),0) edges = get_canny_edge(blurred) cnt_frame, contours, hierarchy = cv2.findContours(edges,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) contours = sorted(contours, key=cv2.contourArea, reverse=True) if w < 420: if camera_range == or camera_range >= 60: speed_adjust = 1.0 *(((centroid_x 320) / 380.) *80) speed_adjust = round (speed_adjust) motor_l = motor_speed + speed_adjust motor_r = motor_speed - speed_adjust 83 webSocket.send(arduino_string([motor_l, motor_r])) turn = False else: if w*h >= 70000 and turn == False: if Actions[match] == "Back":webSocket.send(arduino_string([230,230])) match = -1 print "Turn Back" turn = True elif Actions[match] == "Left": webSocket.send(arduino_string([235,235])) match = -1 print "Left Turn" turn = True elif Actions[match] == "Right": webSocket.send(arduino_string([232,232])) match = -1 print "Right Turn" turn = True elif Actions[match] == "Stop": webSocket.send(arduino_string([237,237])) match = -1 print "Stop" turn = True exit(0) else: centroid_x = centroid_y = camera_range = motor_r = motor_l = webSocket.send(arduino_string([motor_l, motor_r])) central = 'Centre: X:%d : Y:%d ' % (centroid_x, centroid_y) distance = 'Range: %d cm' % (camera_range) cv2.putText(camera_frame, central,(20, 25), font, 0.65, (255,255,255), 1, cv2.LINE_AA) cv2.putText(camera_frame, distance,(20, 45), font, 0.65, (255,255,255), , cv2.LINE_AA) cv2.imshow('Main Frame', camera_frame) 84 if cv2.waitKey(1) == 27: break webSocket.close() stream.close() cv2.destroyAllWindows() if name == " main ": main() 85 Code điều khiển arduino: #include #include Servo myservo; #define SONAR_NUM // Number of sensors #define MAX_DISTANCE 200 // Maximum distance (in cm) to ping #define PING_INTERVAL 33 // Milliseconds between sensor pings (29ms is about the to avoid cross-sensor echo) unsigned long pingTimer[SONAR_NUM]; // Holds the times when the next ping should happen for each sensor unsigned int cm[SONAR_NUM]; // Where the ping distances are stored uint8_t currentSensor = 0; // Keeps track of which sensor is active unsigned long lastSysTic = millis(); unsigned int current_distance[SONAR_NUM]; NewPing sonar[SONAR_NUM] = { // Sensor object array NewPing(12, 11, MAX_DISTANCE), // Each sensor's trigger pin, echo pin, and max distance to ping NewPing(38,39 , MAX_DISTANCE), NewPing(40, 41, MAX_DISTANCE), }; #define BRAKEVCC #define CW #define CCW #define BRAKEGND #define CS_THRESHOLD 100 /* #define SONAR_NUM #define PING_INTERVAL 33 //#define TRIGGER_PIN 12 // Arduino pin tied to trigger pin on the ultrasonic sensor //#define ECHO_PIN 11 // Arduino pin tied to echo pin on the ultrasonic sensor #define MAX_DISTANCE 200 #define TRIGGER_PIN 12 #define ECHO_PIN 11 NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); #define trigPin2 38 #define echoPin2 39 86 #define trigPin3 40 define echoPin3 41 unsigned long time = millis(); */ int led = 43; unsigned long baurate = 115200; int pos = 90; int state= 0; long duration, distance, RightSensor,BackSensor,FrontSensor,LeftSensor; /* VNH2SP30 pin definitions xxx[0] controls '1' outputs xxx[1] controls '2' outputs */ int inApin[2] = { 7, 4}; // INA: Clockwise input int inBpin[2] = { 8, 9}; // INB: Counter-clockwise input int pwmpin[2] = { 5, 6}; // PWM input int cspin[2] = { 2, 3}; // CS: Current sense ANALOG input int enpin[2] = { 0, 1}; // EN: Status of switches output (Analog pin) int statpin = 13; const int statepin = 28; void setup() { Serial.begin(baurate); Serial.setTimeout(10); //myservo.attach(42); pingTimer[0] = millis() + 75; // First ping starts at 75ms, gives time for the Arduino to chill before starting for (uint8_t i = 1; i < SONAR_NUM; i++) // Set the starting time for each sensor pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL; pinMode(statpin, OUTPUT); pinMode(led, OUTPUT); //pinMode(echoPin1, INPUT); // pinMode(trigPin2, OUTPUT); // pinMode(echoPin2, INPUT); // pinMode(trigPin3, OUTPUT); // pinMode(echoPin3, INPUT); 87 // Initialize digital pins as outputs for (int i=0; i500) //{ // SonarSensor(trigPin2, echoPin2); // LeftSensor = distance; //} //Serial.print("sensor l = "); //Serial.println(LeftSensor); // delay(100); //if (millis()-time >500) //{ // SonarSensor(trigPin3, echoPin3); // RightSensor = distance; 88 //} //Serial.print("sensor r = "); //Serial.println(RightSensor); // delay(100); // ultrasonic for (uint8_t i = 0; i < SONAR_NUM; i++) { // Loop through all the sensors if (millis() >= pingTimer[i]) { // Is it this sensor's time to ping? pingTimer[i] += PING_INTERVAL * SONAR_NUM; // Set next time this sensor will be pinged if (i == && currentSensor == SONAR_NUM - 1) oneSensorCycle(); // Sensor ping cycle complete, something with the results sonar[currentSensor].timer_stop(); // Make sure previous timer is canceled before starting a new ping (insurance) currentSensor = i; // Sensor being accessed cm[currentSensor] = 0; // Make distance zero in case there's no ping echo for this sensor sonar[currentSensor].ping_timer(echoCheck); // Do the ping (processing continues, interrupt will call echoCheck to look for echo) } } if(millis() - lastSysTic > 100) { lastSysTic = millis(); for (uint8_t i = 0; i < SONAR_NUM; i++) { /*Serial.print(i); Serial.print("="); Serial.print(current_distance[i]); Serial.print("cm ");*/ } //Serial.println(); RightSensor = current_distance[2]; LeftSensor = current_distance[1]; FrontSensor = current_distance[0]; } //serial char input ; if (Serial.available()>0) { //int td = Serial.parseInt(); input = Serial.read(); delay(50); //Serial.print(input); Serial.println(input); 89 //delay(100); //int pwm1= input.toInt(); switch( input) { case 'f': foward(90); //state = 1; //Serial.end(); break; case 'q': foward(90); Serial.end(); delay(1000); dung(); Serial.begin(baurate); break; case 'w': foward(80); break; case 'l': if (LeftSensor > 40 || LeftSensor == 0) { retrai(); } break; case'r': if (RightSensor > 40 || RightSensor == 0) { rephai(); } break; case 'b': lui(75); break; case 't': if (LeftSensor > 40 || LeftSensor == 0) { quayvong(); } break; case 's': dung(); break; 90 case 'm': myservo.write(70); delay(200); break; case 'n': myservo.write(110); delay(200); break; case 'p': myservo.write(90); delay(200); break; //rolate with servo case 'v': turnright(200); delay(200); dung(); break; case 'u': turnleft(200); delay(200); dung(); break; case 'a': digitalWrite(led,HIGH); break; case 'i': digitalWrite(led,LOW) ; break; } } //Serial.println(state); if (FrontSensor

Ngày đăng: 21/09/2019, 10:16

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan