1. Trang chủ
  2. » Tất cả

(Đồ án hcmute) robot hút bụi tự động

91 3 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

BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH ĐỒ ÁN TỐT NGHIỆP NGÀNH CƠNG NGHỆ KỸ THUẬT MÁY TÍNH ROBOT HÚT BỤI TỰ ĐỘNG GVHD: TRƯƠNG NGỌC SƠN SVTH : NGUYỄN THÁI DŨNG TUẤN MSSV: 13119163 SKL 0 Tp Hồ Chí Minh, tháng 01/2019 an BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KĨ THUẬT TPHCM KHOA ĐÀO TẠO CHẤT LƯỢNG CAO ĐỒ ÁN TỐT NGHIỆP ĐỀ TÀI: ROBOT HÚT BỤI TỰ ĐỘNG Sinh viên thực hiện: NGUYỄN THÁI DŨNG TUẤN MSSV: 13119163 Khóa: 2013 Ngành : CƠNG NGHỆ KĨ THUẬT MÁY TÍNH GVHD: TS.TRƯƠNG NGỌC SƠN TP Hồ Chí Minh ngày 22 tháng năm 2019 an CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tự – Hạnh phúc *** -Tp Hồ Chí Minh, ngày 15 tháng năm 2019 NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP Họ tên sinh viên: Nguyễn Thái Dũng Tuấn MSSV:13119163 Ngành:Cơng Nghệ Kỹ Thuật Máy Tính Lớp: 13119CL2 Giảng viên hướng dẫn: TS.Trương Ngọc Sơn ĐT: …… Ngày nhận đề tài: 28/9/2018 Ngày nộp đề tài: 6/1/2019 Tên đề tài: ROBOT HÚT BỤI TỰ ĐỘNG Các số liệu, tài liệu ban đầu: Kiến thức lập trình python, lập trình giao diện, truyền tín hiệu khơng dây Nội dung thực đề tài: Nhiệm vụ Tuấn Thiết kế giao diện Android X Lập trình hệ thống X Thiết kế mẫu vật 3D X Thi công đề tài X Viết báo cáo X Sản phẩm: ROBOT HÚT BỤI TỰ ĐỘNG TRƯỞNG NGÀNH GIẢNG VIÊN HƯỚNG DẪN CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tự – Hạnh Phúc ******* an PHIẾU NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN Họ tên Sinh viên: NGUYỄN THÁI DŨNG TUẤN MSSV: 13119163 Ngành: Công nghệ kỹ thuật máy tính Tên đề tài: ROBOT HÚT BỤI TỰ ĐỘNG Họ tên Giáo viên hướng dẫn: TS TRƯƠNG NGỌC SƠN NHẬN XÉT Về nội dung đề tài & khối lượng thực hiện: Ưu điểm: Khuyết điểm: Đề nghị cho bảo vệ hay không? Đánh giá loại: Điểm:……………….(Bằng chữ: ) Tp Hồ Chí Minh, ngày tháng năm 20… Giáo viên hướng dẫn (Ký & ghi rõ họ tên) CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tự – Hạnh Phúc ******* an PHIẾU NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN Họ tên Sinh viên: NGUYỄN THÁI DŨNG TUẤN MSSV: 13119163 Ngành: Công nghệ kỹ thuật máy tính Tên đề tài: ROBOT HÚT BỤI TỰ ĐỘNG Họ tên Giáo viên phản biện: NHẬN XÉT Về nội dung đề tài & khối lượng thực hiện: Ưu điểm: Khuyết điểm: Đề nghị cho bảo vệ hay không? Đánh giá loại: Điểm:……………….(Bằng chữ: ) Tp Hồ Chí Minh, ngày tháng năm 20 Giáo viên phản biện (Ký & ghi rõ họ tên) an LỜI CẢM TẠ Trong sống người có sự tồn song song thành cơng thất bại Và thất bại, ta thường nhớ đến nguyên nhân dẫn đến việc Vậy ta thành cơng, ta khơng phép quên giúp đỡ, dìu dắt đến ngày hơm Chính mà lởi báo cáo này, người thực muốn dành lời cảm ơn chân thành đến với thầy Trương Ngọc Sơn, người trực tiếp hướng dẫn em thực tốt đề tài Kế đến lời cảm ơn đến gia đình bạn bè, người động viên, cho nguồn cảm hứng vơ hạn để hồn thành tốt nhiệm vụ giao Và sau cùng, người thực muốn cảm ơn đến Trường Đại học Sư Phạm Kỹ Thuật TP.HCM, người tạo điều kiện cho hệ sinh viên rèn luyện thực tế đợt thực Đồ Án môn học Trang i an TĨM TẮT Trong bối cảnh cơng nghiệp 4.0 phát triển nay, công nghệ Trí tuệ nhân tạo, Robot, IoT ln phần thiếu Và đỉnh cao sự phát triển đạt biết cách kết hợp nhiều loại công nghệ vào sản phẩm Nắm bắt điều này, sinh viên thực định chọn đề tài Robot hút bụi tự động, ứng dụng kỹ thuật Deep Learning (một nhánh Trí tuệ nhân tạo) làm Đồ Án Tốt Nghiệp Ngồi tính di chuyển theo yêu cầu, hút bụi tự động, đề tài bổ sung thêm tính phần cứng truyền hình ảnh trực tiếp từ camera, tìm kiếm đế sạc khơng dây thuật tốn xử lý ảnh phát vật thể; phần mềm, để tiện lợi cho người dùng, đề tài có khả tự động dò phát IP sản phẩm, thay người dùng phải sử dụng thêm cách khác để dị tìm IP Với tính cải tiến trên, dù tiện lợi nhiều cho người dùng, nhiên làm người khơng tránh khỏi sai sót, sinh viên thực ln mong muốn nhận ý kiến đóng góp từ Hội Đồng Phản Biện, tham khảo báo cáo Trang ii an ABSTRACT With the development of the 4th Industry, the technologies such as Artificial Intelligence(AI), Robotic Technology, IoT will always be indispensable parts And its full development can only be achieved by combining multi technologies into a single product Knowing this, the maker of this project has chosen Robotic Vacuum Cleaner, using Deep Learning techniques (a branch of AI), as the Final Year Project Besides basic functions such as moving, automatic vacuum cleanning, this project has been upgraded with camera streaming, finding wireless charger by image processing and object detecting algorithms in hardware; about software, for convinence of the users, this project is able to scan and detect IP of the robots, the users don’t have to use any other IP scanning application Although these upgraded functions made this project be more convenient for the users, but as human we are, we make mistakes For that, the maker of this always hope to get more and more building formulations from the Reviewing Council, as well as anyone who read this essay Trang iii an MỤC LỤC Tên Trang Chương 1: Tổng quan 1.1 Tình hình 1.2 Mục tiêu đề tài 1.3 Đối tượng phạm vi nghiên cứu 1.4 Bố cục đồ án Chương 2: Cơ sở lý thuyết 2.1 Raspberry Pi 2.1.1 Giới thiệu 2.1.2 Thông số kỹ thuật 2.1.3 Hệ điều hành tương thích 2.1.4 Đặc điểm 2.2 Cảm biến siêu âm SRF-05 2.2.1 Giới thiệu 2.2.2 Thông số kỹ thuật 2.2.3 Đặc điểm 2.3 Module điều khiển dộng L298 2.3.1 Giới thiệu 2.3.2 Thông số kỹ thuật 2.3.3 Nguyên lý điều khiển 2.4 Cảm biến la bàn QMC5883L 2.4.1 Giới thiệu 2.4.2 Thông số kỹ thuật 2.5 Cảm biến dò line đơn 2.5.1 Giới thiệu 2.5.2 Thông số kỹ thuật 2.6 Cảm biến đo điện áp 10 Trang iv an 2.6.1 Giới thiệu 10 2.6.2 Thông số kỹ thuật 10 2.7 Mạch Arduino Nano 11 2.7.1 Giới thiệu 11 2.7.2 Thông số kỹ thuật 11 2.8 Ngôn ngữ Python 13 2.8.1 Giới thiệu 13 2.8.2 Các phiên 13 2.9 Thư viện OpenCV 13 2.9.1 Giới thiệu 13 2.9.2 Ứng dụng OpenCV 14 2.9.3 Chức OpenCV 14 2.10 Thư viện Tensorflow 14 2.10.1 Giới thiệu 14 2.10.2 Ứng dụng Tensorflow 14 2.10.3 Graph Session 15 2.11 Android Studio 15 2.11.1 Giới thiệu 15 2.11.2 Các tính Android Studio 16 2.12 Thiết kế 3D với Tinkercad 16 2.12.1 Giới thiệu 16 2.12.2 Các tính 16 2.12.3 Đặc điểm 16 2.13 Chuẩn truyền liệu I2C 17 2.13.1 Giới thiệu 17 2.13.2 Nguyên lý hoạt động 17 Chương 3: Thiết kế thi công hệ thống 16 3.1 Sơ đồ khối hệ thống 18 3.1.1 Yêu cầu hệ thống 18 Trang v an angle_1 = get_angle() while(True): #Xoay trái đủ 90 độ if(GPIO.input(receiv) == 0): break print("Angle_1: " + str(angle_1)) DC_control.Turn_Left(IN1,IN2,IN3,IN4) angle_2 = get_angle() print("Angle_2: " + str(angle_2)) if((angle_1 >= 270) and (angle_1 =0) and (angle_2 = turn_angle): break else: if((angle_2 - angle_1) >= turn_angle): break #DC_control.Move_Up(IN1,IN2,IN3,IN4) #time.sleep(0.5) for i in range(5): speed = 50 angle_1 = get_angle() DC_control.Move_Up(IN1,IN2,IN3,IN4) time.sleep(0.1) angle_3 = get_angle() if(angle_3 > angle_1): #Nếu lệch bên trái PWM_B.ChangeDutyCycle(speed + 5) PWM_A.ChangeDutyCycle(speed - 5) Trang 62 an elif(angle_3 < angle_1): #Nếu lệch bên phải PWM_A.ChangeDutyCycle(speed + 5) PWM_B.ChangeDutyCycle(speed - 5) else: PWM_A.ChangeDutyCycle(speed) PWM_B.ChangeDutyCycle(speed) angle_1 = get_angle() while(True): #Xoay trái đủ 90 độ if(GPIO.input(receiv) == 0): break print("Angle_1: " + str(angle_1)) DC_control.Turn_Left(IN1,IN2,IN3,IN4) angle_2 = get_angle() print("Angle_2: " + str(angle_2)) if((angle_1 >= 270) and (angle_1 =0) and (angle_2 = turn_angle): break else: if((angle_2 - angle_1) >= turn_angle): break Left_state = break if(Right_state == 1): angle_2 = Trang 63 an while(True): if(GPIO.input(receiv) == 0): break print("Calibrating Right") angle_1 = get_angle() while(True): #Xoay trái đủ 90 độ if(GPIO.input(receiv) == 0): break print("Angle_1: " + str(angle_1)) DC_control.Turn_Right(IN1,IN2,IN3,IN4) angle_2 = get_angle() print("Angle_2: " + str(angle_2)) if((angle_1 >= 0) and (angle_1 = 270) and (angle_2 = turn_angle): break else: if((angle_1 - angle_2) >= turn_angle): break #DC_control.Move_Up(IN1,IN2,IN3,IN4) #time.sleep(0.5) for i in range(5): speed = 50 angle_1 = get_angle() DC_control.Move_Up(IN1,IN2,IN3,IN4) time.sleep(0.1) Trang 64 an angle_3 = get_angle() if(angle_3 > angle_1): #Nếu lệch bên trái PWM_B.ChangeDutyCycle(speed + 5) PWM_A.ChangeDutyCycle(speed - 5) elif(angle_3 < angle_1): #Neu lech ve ben phai PWM_A.ChangeDutyCycle(speed + 5) PWM_B.ChangeDutyCycle(speed - 5) else: PWM_A.ChangeDutyCycle(speed) PWM_B.ChangeDutyCycle(speed) angle_1 = get_angle() while(True): #Xoay trái đủ 90 độ if(GPIO.input(receiv) == 0): break print("Angle_1: " + str(angle_1)) DC_control.Turn_Right(IN1,IN2,IN3,IN4) angle_2 = get_angle() print("Angle_2: " + str(angle_2)) if((angle_1 >= 0) and (angle_1 = 270) and (angle_2 = turn_angle): break else: if((angle_1 - angle_2) >= turn_angle): break Right_state = Trang 65 an break if(Up_state == 1): speed = 50 angle_1 = get_angle() DC_control.Move_Up(IN1,IN2,IN3,IN4) time.sleep(0.1) angle_3 = get_angle() if(angle_3 > angle_1): #Nếu lệch bên trái PWM_B.ChangeDutyCycle(speed + 5) PWM_A.ChangeDutyCycle(speed - 5) elif(angle_3 < angle_1): #Nếu lệch bên phải PWM_A.ChangeDutyCycle(speed + 5) PWM_B.ChangeDutyCycle(speed - 5) else: PWM_A.ChangeDutyCycle(speed) PWM_B.ChangeDutyCycle(speed) Up_state = def get_angle(): #định nghĩa hàm tính tốn góc độ la bàn #Đọc liệu thô từ cảm biến với địa trục tương ứng x = GY271.read_raw_data(Device_Address, X_axis_H) z = GY271.read_raw_data(Device_Address, Z_axis_H) y = GY271.read_raw_data(Device_Address, Y_axis_H) #Tính tốn giá trị góc hướng đến heading = math.atan2(y, x) + declination Trang 66 an if(heading > 2*pi): #Nếu lớn 360 độ heading = heading - 2*pi #Trừ 360 độ để lấy số đo if(heading < 0): #Nếu nhỏ heading = heading + 2*pi #Cộng 360 độ để lấy số đo #Chuyển đổi thành số độ cụ thể angle = int(heading * 180/pi) return angle #Trả giá trị độ GY271.Magnetometer_Init(Device_Address, Register_A, Register_B, Register_mode) while(True): try: if(GPIO.input(receiv) == 1): #Nếu nhận tín hiệu từ chương trình nhận lệnh ZigZag() except KeyboardInterrupt: break GPIO.cleanup() IV Chương trình dị tìm đế sạc không dây # Khai báo thư viện cần thiết import os import cv2 import numpy as np from picamera.array import PiRGBArray from picamera import PiCamera import tensorflow as tf Trang 67 an import argparse import sys import RPi.GPIO as GPIO import time import Lib.DC_control as DC_control # Chỉnh lại kích thước khung hình IM_WIDTH = 640 IM_HEIGHT = 480 IN1 = 19 IN2 = 13 IN3 = IN4 = ENA = 26 ENB = 11 Broom_IN1 = 16 Broom_IN2 = 12 Tray_IN3 = Tray_IN4 = receiv_left = receiv_right = 10 from utils import label_map_util Trang 68 an from utils import visualization_utils as vis_util #Khai báo port tín hiệu động charging_mode_pin = 27 GPIO.setmode(GPIO.BCM) GPIO.setup(charging_mode_pin, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) GPIO.setup(receiv_left, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) GPIO.setup(receiv_right, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) DC_control.setup(IN1,IN2,IN3,IN4,Broom_IN1,Broom_IN2,Tray_IN3,Tray_IN4) # Khai báo tên đường dẫn thư mục chứa mơ hình huấn luyện MODEL_NAME = '/home/pi/Desktop/My_trained_model' # Lấy đường dẫn chương trình CWD_PATH = os.getcwd() #Ghép lại thành đường dẫn đến mơ hình dạng protobuf PATH_TO_CKPT = os.path.join(MODEL_NAME,'frozen_inference_graph.pb') # Đường dẫn đến file ánh xạ tên vật thể PATH_TO_LABELS = os.path.join(MODEL_NAME,'label_map.pbtxt') # Số lượng vật thể cần phát NUM_CLASSES = #Tạo hàm “khởi tạo Tensorflow” def set_up_tensorflow(): Trang 69 an #Tắt ứng dụng Motion để không gây lỗi “đã dùng camera” os.system("sudo service motion stop") #Tải file ánh xạ vào label_map = label_map_util.load_labelmap(PATH_TO_LABELS) categories = label_map_util.convert_label_map_to_categories(label_map, max_num_classes=NUM_CLASSES, use_display_name=True) category_index = label_map_util.create_category_index(categories) # Tải mơ hình Tensorflow vào RAM detection_graph = tf.Graph() with detection_graph.as_default(): od_graph_def = tf.GraphDef() #Đọc file mơ hình theo đường dẫn tạo with tf.gfile.GFile(PATH_TO_CKPT, 'rb') as fid: serialized_graph = fid.read() od_graph_def.ParseFromString(serialized_graph) tf.import_graph_def(od_graph_def, name='') #Tạo Session với đồ thị mơ hình huấn luyện sess = tf.Session(graph=detection_graph) # Tạo giá trị đại diện hình ảnh đầu vào image_tensor = detection_graph.get_tensor_by_name('image_tensor:0') # Tạo giá trị đại diện kết đầu # Với detection_boxes chứa vật thể cần tìm khung hình detection_boxes = detection_graph.get_tensor_by_name('detection_boxes:0') Trang 70 an #Giá trị score tỉ lệ mà vật thể phát giống với liệu gốc #Chỉ số score gắn kế bên tên vật thể phát detection_scores = detection_graph.get_tensor_by_name('detection_scores:0') detection_classes = detection_graph.get_tensor_by_name('detection_classes:0') # Số lượng vật thể phát num_detections = detection_graph.get_tensor_by_name('num_detections:0') #Khởi tạo luồn ảnh lấy từ Webcam, với kích thước định đầu chương trình camera = cv2.VideoCapture(0) ret = camera.set(3,IM_WIDTH) ret = camera.set(4,IM_HEIGHT) #Tạo biến tính tốn FPS frame_rate_calc = freq = cv2.getTickFrequency() font = cv2.FONT_HERSHEY_SIMPLEX #Khi kết thúc hàm, trả giá trị dùng cho phần xử lý return sess, image_tensor, detection_scores, detection_boxes, detection_classes, num_detections, category_index, camera, ret, frame_rate_calc, freq, font #Tạo hàm đóng Webcam tồn khung ảnh OpenCV def close_camera(): camera.release() cv2.destroyAllWindows() Trang 71 an #Tạo vịng lặp vơ hạn while(True): print("Running background") #Tạo biến trạng thái xử lý state_process = #Nếu có tín hiệu từ chương trình nhận lệnh if(GPIO.input(charging_mode_pin) == 1): #Phịng hờ dây tín hiệu khơng ổn định time.sleep(0.1) if(GPIO.input(charging_mode_pin) == 1): print("Setting up Tensorflow, please wait for 32 seconds") #Khởi tạo tensorflow lấy giá trị sess, image_tensor, detection_scores, detection_boxes, detection_classes, num_detections, category_index, camera, ret, frame_rate_calc, freq, font = set_up_tensorflow() #Vịng lặp vơ hạn while(True): #Nếu khơng có tín hiệu mức cao từ chương trình nhận lệnh vịng lặp if(GPIO.input(charging_mode_pin) == 0): time.sleep(0.1) if(GPIO.input(charging_mode_pin) == 0): #Phịng hờ dây tín hiệu khơng ổn định close_camera() break #print("Running Tensorflow") if(GPIO.input(receiv_left)): #Nếu có tín hiệu hồng ngoại bên trái for i in range(10): #Xoay trái DC_control.Turn_Left(IN1,IN2,IN3,IN4) state_process = #Gán trạng thái xử lý Trang 72 an elif(GPIO.input(receiv_right)): #Nếu có tín hiệu hồng ngoại bên phải for i in range(10): #Xoay phải DC_control.Turn_Right(IN1,IN2,IN3,IN4) state_process = #Gán trạng thái xử lý else: #Nếu khơng có tín hiệu từ bên chạy thẳng tiếp DC_control.Move_Up(IN1,IN2,IN3,IN4) if(state_process == 1): #Nếu trạng thái xử lý lên while(True): #Tạo vòng lặp xử lý ảnh #Nếu khơng có tín hiệu mức cao từ chương trình nhận lệnh vịng lặp if(GPIO.input(charging_mode_pin) == 0): time.sleep(0.1) #Phịng hờ dây tín hiệu khơng ổn định if(GPIO.input(charging_mode_pin) == 0): break t1 = cv2.getTickCount() main_coordinates = [0,0,0,0] #Đọc hình ảnh từ luồng ảnh Webcam ret, frame = camera.read() frame_expanded = np.expand_dims(frame, axis=0) # Thực thi q trình dự đốn Tensorflow nhận kết trả (boxes, scores, classes, num) = sess.run( [detection_boxes, detection_scores, detection_classes, num_detections], feed_dict={image_tensor: frame_expanded}) #Quy đổi thành mảng chứa tọa độ vật phát coordinates = vis_util.return_coordinates( frame, Trang 73 an np.squeeze(boxes), np.squeeze(classes).astype(np.int32), np.squeeze(scores), category_index, use_normalized_coordinates=True, line_thickness=8, min_score_thresh=0.80) print(coordinates) if(len(coordinates) == 1): #Nếu khung hình phát vật if(coordinates != []): #Nếu mảng tọa độ khác rỗng main_coordinates = coordinates[0] #tạo mảng chứa phần tử mảng trước ymin = main_coordinates[0] #Giá trị y nhỏ phần tử thứ ymax = main_coordinates[1] #Giá trị y lớn phần tử thứ xmin = main_coordinates[2] #Giá trị x nhỏ phần tử thứ xmax = main_coordinates[3] #Giá trị x lớn phần tử thứ score = main_coordinates[4] #Tỉ lệ dự đoán phần tử thứ if(score > 99): #Nếu dự đoán đến 99% giống với liệu average_x = (xmin + xmax)/2 #Tìm trung điểm theo trục x average_y = (ymin + ymax)/2 #Tìm trung điểm theo trục y if(average_x < (IM_WIDTH/2)): Nếu trung điểm x nằm bên trái print("On the left") #Xoay trái thẳng đoạn để hiệu chỉnh hướng tiếp cận DC_control.Turn_Left(IN1,IN2,IN3,IN4) DC_control.Short_Move_Up(IN1,IN2,IN3,IN4) elif(average_x > (IM_WIDTH/2)): #Nếu trung điểm x nằm bên phải print("On the right") Trang 74 an #Xoay phải thẳng đoạn để hiệu chỉnh hướng tiếp cận DC_control.Turn_Right(IN1,IN2,IN3,IN4) DC_control.Short_Move_Up(IN1,IN2,IN3,IN4) print(main_coordinates) else: print("Invalid object") # Khoanh vùng vật thể phát vis_util.visualize_boxes_and_labels_on_image_array( frame, np.squeeze(boxes), np.squeeze(classes).astype(np.int32), np.squeeze(scores), category_index, use_normalized_coordinates=True, line_thickness=8, min_score_thresh=0.85) cv2.putText(frame,"FPS: {0:.2f}".format(frame_rate_calc),(30,50),font,1,(255,255,0),2,cv2.LINE_AA) # Hiển thị toàn lên OpenCV cv2.imshow('Object detector', frame) #Tính tốn FPS sau xử lý xong t2 = cv2.getTickCount() time1 = (t2-t1)/freq frame_rate_calc = 1/time1 Trang 75 an an ... thực định chọn đề tài Robot hút bụi tự động, ứng dụng kỹ thuật Deep Learning (một nhánh Trí tuệ nhân tạo) làm Đồ Án Tốt Nghiệp Ngồi tính di chuyển theo yêu cầu, hút bụi tự động, đề tài bổ sung... dụng nhiều, cụ thể hay nghe nói đến gần robot chăm sóc người già, robot giúp việc, robot hút bụi Chính mà sinh viên thực định chọn đề tài robot hút bụi tự động, sản phẩm phổ biến rộng rãi thị... hiển thị hình ảnh truyền trực tiếp từ camera robot, vùng chứa nút di chuyển bản, nút bật chế độ hút bụi tự động 3.1.3.2 Hoạt động robot Khi khởi động, robot trạng thái chờ lệnh từ giao diện Và

Ngày đăng: 02/02/2023, 09:24

Xem thêm:

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN