1. Trang chủ
  2. » Luận Văn - Báo Cáo

DATN: ngành Tự Động Điều Khiển: Điều Khiển Xe Robot qua Xử Lý Ảnh

42 75 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 42
Dung lượng 1,57 MB

Nội dung

Đồ án tốt nghiệp chuyên ngành Tự Động Điều Khiển, Đồ án về xử lý ảnh để nhận dạng và điều khiển Robot đến vị trí có đặt trước. toàn bộ qua trình nhận diện và xử lý ảnh được thực hiện trên App điện thoại Android.Link tham khảo: https:www.youtube.comwatch?v=H0mTaDsbWM0

TÓM TẮT Đề tài nghiên cứu thiết kế loại xe Robot tự di chuyển đến vị trí đặt với điều khiển app điện thoại thông qua nhận diện robot từ camera điểm đến Robot lập trình tự động xác định hướng di chuyển đến đích qua việc chạm điểm đến hình App điện thoại xử lý truyền tín hiệu điều khiển liên tục đến Robot tìm đến vị trí đặt Lập trình App Android để xử lý ảnh thu điều khiển Robot đến vị trí mong muốn v MỤC LỤC DANH MỤC CÁC HÌNH VẼ VII DANH MỤC CÁC KÝ HIỆU, TỪ VIẾT TẮT VIII CHƢƠNG 1: GIỚI THIỆU VỀ ĐỀ TÀI 1.1 GIỚI THIỆU 1.2 MỤC TIÊU CỦA ĐỀ TÀI 1.3 PHẠM VI CỦA ĐỀ TÀI CHƢƠNG 2: TỔNG QUAN LẬP TRÌNH ỨNG DỤNG VÀ XE ROBOT 2.1 VÀI NÉT VỀ LẬP TRÌNH XỬ LÝ ẢNH 2.2 MƠ HÌNH XE ROBOT ĐANG NGHIÊN CỨU CHƢƠNG 3: THIẾT KẾ ỨNG DỤNG ĐIỀU KHIỂN VÀ MƠ HÌNH XE ROBOT 3.1 THIẾT KẾ ỨNG DỤNG 3.1.1 Thiết kế giao diện người dùng 3.1.2 Sơ đồ khối trình tự xử lý ảnh 3.1.2 Lập trình ứng dụng 3.2 THIẾT KẾ MƠ HÌNH 10 3.2.1 Thiết kế phần cứng 10 3.2.2 Lập trình điều khiển ESP8266 NodeMCU 12 CHƢƠNG 4: KẾT LUẬN 13 4.1 KẾT QUẢ THỰC NGHIỆM 13 4.2 ĐÁNH GIÁ 14 4.2 HƯỚNG PHÁT TRIỂN VÀ MỞ RỘNG 14 TÀI LIỆU THAM KHẢO 15 PHỤ LỤC 16 vi DANH MỤC CÁC HÌNH VẼ HÌNH 3-1: VỊNG ĐỜI ACTIVITY HÌNH 3-2: GIAO DIỆN HÌNH 3-3: GIAO DIỆN HÌNH 3-4: GIAO DIỆN HÌNH 3-5: SƠ ĐỒ TỔNG QUÁT HÌNH 3-6: TRÌNH TỰ XỬ LÝ ẢNH TRÊN APP HÌNH 3-7: LƢU ĐỒ XỬ LÝ ẢNH TRÊN APP HÌNH 3-8: PHÂN TÍCH HƢỚNG DI CHUYỂN ROBOT HÌNH 3-9: KHUNG XE MẶT TRÊN 10 HÌNH 3-10: KHUNG XE MẶT DƢỚI 11 HÌNH 3-11: HÌNH ẢNH XE ROBOT THỰC TẾ 11 HÌNH 3-12: SƠ ĐỒ NHẬN LỆNH TỪ APP 12 HÌNH 4-1: ROBOT DI CHUYỂN ĐẾN MỤC TIÊU 13 HÌNH 4-2: ROBOT DỪNG KHI ĐẾN MỤC TIÊU 13 HÌNH 4-3: KẾT NỐI APP ĐIỀU KHIỂN ROBOT QUÉT NHÀ 14 vii DANH MỤC CÁC KÝ HIỆU, TỪ VIẾT TẮT APP: Application PWM: Pulse Width Modulation RGB: Red Green Blue UI: User Interface PX: Pixel FPS: Frame Per Second HSV: Hue Saturation Value URL: Unifrom Resource Locator IP: Internet Protocol AP: Access Point viii ĐỒ ÁN TỐT NGHIỆP Trang 1/38 CHƢƠNG 1: GIỚI THIỆU VỀ ĐỀ TÀI 1.1 Giới thiệu Xe Robot thiết bị người chế tạo để thực công việc mặt phẳng Cấu trúc xe Robot gồm động gắn với bánh xe bánh đa hướng để xe di chuyển theo hướng muốn Xe Robot dạng Robot tự hành có khả tự hoạt động độc lập lập trình sẵn để thực mục đích theo yêu cầu hay công việc giao Robot tự hành phân thành loại với đặc trưng riêng cách di chuyển bánh xe chân Đề tài nghiên cứu Robot tự hành giao tiếp qua app điện thoại, thiết kế, thi cơng mơ hình lập trình app điều khiển giám sát xe Robot camera điện thoại Đề tài cải tiến việc điều khiển xe Robot qua xử lý ảnh đồ án có trước Những báo cáo trước dừng lại việc điều khiển xe Robot qua xử lý ảnh Matlab Đề tài cải tiến lại thiết kế thêm ứng dụng di động để điều khiển điện thoại thông qua kết nối wifi từ Robot 1.2 Mục tiêu đề tài Đề tài giải toán nhận diện điều khiển xe Robot đến vị trí đích Robot nhận lệnh điều khiển từ App App ghi lại khu vực hoạt động Robot qua camera nhận diện vị trí Robot hình Kết hợp xử lý hình ảnh thu nhận vị trí Robot vị trí đến người dùng chọn, Robot chạy đến 1.3 Phạm vi đề tài Đề tài giới hạn việc điều khiển di chuyển xe Robot đến vị trí đặt qua xử lý ảnh Điều khiển xe Robot qua xử lý ảnh SVTH: Nguyễn Thành Nghi ĐỒ ÁN TỐT NGHIỆP Trang 2/38 CHƢƠNG 2: TỔNG QUAN LẬP TRÌNH ỨNG DỤNG VÀ XE ROBOT 2.1 Vài nét lập trình xử lý ảnh Lập trình xử lý ảnh lĩnh vực thuộc xử lý tín hiệu mà đầu vào ảnh số Mỗi hình ảnh từ camera đưa vào đóng gói thành ma trận để lưu trữ xử lý Do đó, ảnh xem dạng liệu chiếm dung lượng nhớ Một ảnh đầu vào thông thường lưu lại dạng ma trận Trong ma trận đó, ma trận đại diện cho biểu thị màu tạo thành hệ màu RGB Số lượng pixel ảnh số lượng phần tử ma trận tương ứng 2.2 Mơ hình xe Robot nghiên cứu Trong thực tế nay, việc ứng dụng dạng Robot vào đời sống khơng cịn xa lạ với người Càng ngày, ta bắt gặp Robot khắp nơi từ nhà hàng (robot tiếp khách), đường (robot đường) đặt biệt có nhiều loại cơng nghiệp,… Ở lĩnh vực khác nhau, Robot đóng vai trị làm cơng việc mà người lập trình Việc xe Robot tự di chuyển đến mục tiêu đặt thông qua camera giám sát, điều khiển hành trình khơng gian hoạt động mở nhiều hướng nghiên cứu mới, tạo cho Robot ngày giống người dùng thị giác phân tích nhận diện đối tượng dựa camera thu nhận liệu xung quanh Điều khiển xe Robot qua xử lý ảnh SVTH: Nguyễn Thành Nghi ĐỒ ÁN TỐT NGHIỆP Trang 3/38 CHƢƠNG 3: THIẾT KẾ ỨNG DỤNG ĐIỀU KHIỂN VÀ MƠ HÌNH XE ROBOT 3.1 Thiết kế ứng dụng 3.1.1 Thiết kế giao diện ngƣời dùng Trong Android Studio, giao diện giao tiếp với người dùng xem activity Lớp Activity thành phần quan trọng ứng dụng Android, cách mà chúng hoạt động tạo nên thành tảng mô hình lập trình ứng dụng Android khởi chạy ứng dụng thơng thường kích hoạt Activity tương ứng với vịng đời cụ thể q trình hoạt động Hầu hết ứng dụng sử dụng nhiều hình khác nhau, có nghĩa phải có nhiều Activity khác Khi Activity định Activity chính, hình khởi chạy ứng dụng Một Activity lại gọi kích hoạt Activity khác Q trình khởi chạy Activity mô tả theo sơ đồ bên dưới: Hình 3-1: Vịng đời Activity Để tạo giao diện Android Studio, ta tạo file có “xml” (mặc định ban đầu activity_main.xml), Activity xem giao diện để người dùng giao tiếp với ứng dụng Thực chất activity_main.xml file định nghĩa thực Điều khiển xe Robot qua xử lý ảnh SVTH: Nguyễn Thành Nghi ĐỒ ÁN TỐT NGHIỆP Trang 4/38 thể tham gia vào giao diện ứng dụng, chúng xếp hình Activity đọc file vẽ lên giao diện ứng dụng Chúng ta lập trình giao diện cách kéo thả Nhưng thực tế, thiết kế giao diện XML giúp dễ dàng kiểm soát ứng dụng sửa chữa Sau trình thiết kế hoạt động Activity App Myblue (app điều khiển xe Robot), gồm hình giao diện (activity) độc lập với Giao diện đặt tên file activity_main2.xml Hình 3-2: Giao diện  Ở giao diện xuất khởi động ứng dụng để hiển thị thông tin app Thiết lập giao diện sau: Chọn Layout RelativeLayout bao gồm Widgets (1 ImageView TextView) Mỗi Widgets lập trình thông số như:  Android:id : gọi tên địa liên kết Widget này;  Android:layout_width: đặt chiều rộng widget đơn vị pixel, dp, …;  Android:layout_height: đặt chiều cao widget đơn vị pixel, dp, …;  Android:src: chọn icon cho widget lưu drawable;  Android:gravity: chọn vị trí cho widget “center, bottom, top, …” Điều khiển xe Robot qua xử lý ảnh SVTH: Nguyễn Thành Nghi ĐỒ ÁN TỐT NGHIỆP Trang 5/38  Android:textColor: chọn màu cho chữ theo mã màu lưu color Trên thể thiết lập Widget Tùy yêu cầu Widget khác nhau, ta thiết lập thêm nhiều thông số Để vào activity kế tiếp, ta chạm vào hình giữa, giao diện xuất  Ở giao diện (tên file activity_main3.xml), nơi điều khiển Robot chế độ manual Nhập địa IP Robot ô “IP Address” (IP Robot 192.168.4.1) Chọn tiếp tốc độ ô “Speed”, mức tốc độ 10 mức tăng dần từ đến Sau setup xong, ta chạm vào nút điều hướng hình để Robot tiếp hướng mong muốn Ở giao diện này, gồm Widgets button, buttonImage, textView, editText, … Hình 3-3: Giao diện Các thiết lập widget thể phần phụ lục  Ở giao diện (activity_main), giao diện hiển thị camera điều khiển Robot đến vị trí mong muốn Điều khiển xe Robot qua xử lý ảnh SVTH: Nguyễn Thành Nghi ĐỒ ÁN TỐT NGHIỆP Trang 6/38 Hình 3-4: Giao diện Giao diện để thể camera điện thoại bắt hình Robot 3.1.2 Sơ đồ khối trình tự xử lý ảnh Sơ đồ tổng quát: Hình 3-5: Sơ đồ tổng quát  Khối điều khiển: Khối điều khiển App điện thoại lập trình ngơn ngữ Java có chức lấy ảnh camera đầu vào, xử lý tín hiệu điều khiển có Robot Điều khiển xe Robot qua xử lý ảnh SVTH: Nguyễn Thành Nghi ĐỒ ÁN TỐT NGHIỆP Trang 24/38 return true; }}; private class TaskEsp extends AsyncTask { String server; TaskEsp(String server){ this.server = server; } @Override protected String doInBackground(Void params) { final String p = "http://"+server; runOnUiThread(new Runnable(){ @Override public void run() { textInfo1.setText(p); } }); String serverResponse = ""; try { HttpURLConnection httpURLConnection = (HttpURLConnection)(new URL(p).openConnection()); if(httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { InputStream inputStream = null; inputStream = httpURLConnection.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); serverResponse = bufferedReader.readLine(); inputStream.close(); } } catch (MalformedURLException e) { e.printStackTrace(); serverResponse = e.getMessage(); } catch (IOException e) { e.printStackTrace(); serverResponse = e.getMessage(); } return serverResponse; } @Override protected void onPostExecute(String s) { textInfo2.setText(s); btnForward.setEnabled(true); btnBack.setEnabled(true); btnLeft.setEnabled(true); btnRight.setEnabled(true); } } Điều khiển xe Robot qua xử lý ảnh SVTH: Nguyễn Thành Nghi ĐỒ ÁN TỐT NGHIỆP Trang 25/38 View.OnClickListener A = new View.OnClickListener() { @Override public void onClick(View v) { context = getApplicationContext(); Intent intent = new Intent(context, MainActivity.class); startActivity(intent); }}; } Main_Activity.java package myblue.nguyennghith.control; import android.os.AsyncTask; import android.provider.ContactsContract; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; import android.view.SurfaceView; import android.view.View; import android.view.WindowManager; import org.opencv.android.BaseLoaderCallback; import org.opencv.android.CameraBridgeViewBase; import org.opencv.android.JavaCameraView; import org.opencv.android.OpenCVLoader; import org.opencv.core.Core; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.core.MatOfPoint; import org.opencv.core.Point; import org.opencv.core.Scalar; import org.opencv.core.Size; import org.opencv.imgproc.Imgproc; import org.opencv.imgproc.Moments; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Vector; import myblue.nguyennghith.color.R; Điều khiển xe Robot qua xử lý ảnh SVTH: Nguyễn Thành Nghi ĐỒ ÁN TỐT NGHIỆP Trang 26/38 public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 { public final String Tag = "mytag"; JavaCameraView javaCameraView; int x_touch = 640, y_touch = 280; Mat frame; Mat ImgHSV; double rads, degs; int x, y, KC_AB = 0; int x0 = 0, y0 = 0; BaseLoaderCallback mBaseLoaderCallback = new BaseLoaderCallback(this) { @Override public void onManagerConnected(int status) { switch (status) { case BaseLoaderCallback.SUCCESS: { javaCameraView.enableView(); javaCameraView.setMaxFrameSize(1280,720); break; } default: { super.onManagerConnected(status); } } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); javaCameraView = (JavaCameraView) findViewById(R.id.java_Camera_View); javaCameraView.setVisibility(SurfaceView.VISIBLE); javaCameraView.setCvCameraViewListener(this); javaCameraView.setOnTouchListener(touch); } @Override protected void onPause() { super.onPause(); if (javaCameraView != null) { Log.i(Tag, "onPause" + javaCameraView); javaCameraView.disableView(); } } @Override protected void onDestroy() { Điều khiển xe Robot qua xử lý ảnh SVTH: Nguyễn Thành Nghi ĐỒ ÁN TỐT NGHIỆP Trang 27/38 super.onDestroy(); if (javaCameraView != null) { Log.i(Tag, "onDetroy" + javaCameraView); javaCameraView.disableView(); ImgHSV.release(); frame.release(); } } @Override protected void onResume() { super.onResume(); if (OpenCVLoader.initDebug()) { Log.i(Tag, "Opencv load xong"); mBaseLoaderCallback.onManagerConnected(BaseLoaderCallback.SUCCESS); } else { Log.i(Tag, "Opencv loi"); OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_2_0, this, mBaseLoaderCallback); } } @Override public void onCameraViewStarted(int width, int height) { frame = new Mat(height, width, CvType.CV_8UC4); ImgHSV = new Mat(height, width, CvType.CV_8UC1); } @Override public void onCameraViewStopped() { frame.release(); ImgHSV.release(); } View.OnTouchListener touch = new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { double cols = frame.cols(); double rows = frame.rows(); double xoffset = (javaCameraView.getWidth() - cols)/2; double yoffset = (javaCameraView.getHeight() - rows)/2; switch (motionEvent.getAction()){ case MotionEvent.ACTION_DOWN: { x_touch = (int) (motionEvent.getX() - xoffset); y_touch = (int) (motionEvent.getY() - yoffset); if (x_touch = 1100){ x_touch = 1100; } if (y_touch = 650){ y_touch = 650; } Log.i(Tag, "touch " + x_touch + " " + y_touch); } case MotionEvent.ACTION_UP:{ String serverIP = "192.168.4.1/?State=S"; TaskEsp1 taskEsp = new TaskEsp1(serverIP); taskEsp.execute(); } } return true; } }; @Override public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) { frame = inputFrame.rgba(); // Mat ImgHSV = new Mat(); //Mat morph = new Mat(); Imgproc.cvtColor(frame, ImgHSV, Imgproc.COLOR_RGB2HSV); //Imgproc.GaussianBlur(ImgHSV, blur, new Size(5, 5), 0); //Imgproc.blur(ImgHSV, ImgHSV, new Size(3, 3), 2, 2); //Imgproc.threshold(blur,mask,100,255,Imgproc.THRESH_BINARY); Core.inRange(ImgHSV, new Scalar(90, 183, 102), new Scalar(120, 255, 200), ImgHSV); Mat erode_element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3, 3)); Mat dilate_element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(8, 8)); Imgproc.erode(ImgHSV, ImgHSV, erode_element); Imgproc.erode(ImgHSV, ImgHSV, erode_element); Imgproc.dilate(ImgHSV, ImgHSV, dilate_element); Imgproc.dilate(ImgHSV, ImgHSV, dilate_element); Mat temp = new Mat(); ImgHSV.copyTo(temp); List contours = new ArrayList(); Imgproc.findContours(temp, contours, new Mat(), Imgproc.RETR_CCOMP, Imgproc.CHAIN_APPROX_SIMPLE); if (contours.size() > 0) { Moments moment = Imgproc.moments(ImgHSV, true); double area = moment.get_m00(); x = (int) (moment.get_m10() / area); y = (int) (moment.get_m01() / area); Imgproc.circle(frame, new Point(x_touch, y_touch), 40, new Scalar(0, 255, 0), 3); Điều khiển xe Robot qua xử lý ảnh SVTH: Nguyễn Thành Nghi ĐỒ ÁN TỐT NGHIỆP Trang 29/38 //Imgproc.line(frame, new Point(x, y), new Point(x_touch, y_touch), new Scalar(255, 0, 255), 2); x0 = x0 + x; x0 = x0 / 2; y0 = y0 + y; y0 = y0 / 2; KC_AB = (int) Math.sqrt(Math.pow(x_touch - x, 2) + Math.pow(y_touch - y, 2)); Imgproc.rectangle(frame, new Point(100,80), new Point(1100,650), new Scalar(125,125,125),2); // Vector BA_AC // Vector BA(cxAvg - x_touch; cyAvg - y_touch) _ AC(x cxAvg; y - cyAvg) float ts = (x - x0) * (x0 - x_touch) + (y - y0) * (y0 - y_touch); float dx = (float) Math.sqrt(Math.pow(x - x0, 2) + Math.pow(y - y0, 2)); float d = (float) Math.sqrt(Math.pow(x0 - x_touch, 2) + Math.pow(y0 - y_touch, 2)); float theta = (float) Math.acos(ts / (dx * d)); int thetado = (int) Math.toDegrees(theta); //Log.i(Tag, "gocBA_AC = " + thetado + " " + S3); //////////////////////////////// if (thetado >= 155 && KC_AB > 60) { //Forward String serverIP = "192.168.4.1/?State=TI"; TaskEsp1 taskEsp = new TaskEsp1(serverIP); taskEsp.execute(); } else if (thetado > 135 && KC_AB > 80) { //"Left" String serverIP = "192.168.4.1/?State=T"; TaskEsp1 taskEsp = new TaskEsp1(serverIP); taskEsp.execute(); } else if (thetado < 135 && KC_AB > 80) { //"Right" String serverIP = "192.168.4.1/?State=P"; TaskEsp1 taskEsp = new TaskEsp1(serverIP); taskEsp.execute(); } else if (KC_AB = x & y_t = x & y_t >= y) { rads = Math.atan2(dx, dy); degs = Math.toDegrees(rads); degs = (degs * -1); } // Quad III else if (x_t = y) { rads = Math.atan2(dx, -dy); degs = Math.toDegrees(rads); degs = degs + 180; } else if (x_t

Ngày đăng: 27/07/2020, 09:16

TỪ KHÓA LIÊN QUAN

w