1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Nghiên cứu và thiết kế mobile robot tự hành trong nhà xưởng sử dụng lidar

117 14 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 117
Dung lượng 9,04 MB

Nội dung

Khác với các robot được sử dụng trong công nghiệp ít khi di chuyển, robot tự hành lại có khả năng di chuyển trong những môi trường khơng được kiểm sốt và chúng được trang bị các cảm biến

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 CNKT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA NGHIÊN CỨU VÀ THIẾT KẾ MOBILE ROBOT TỰ HÀNH TRONG NHÀ XƯỞNG SỬ DỤNG LIDAR GVHD: TS NGUYỄN VĂN THÁI SVTH: BÙI LÊ ANH NGUYỄN QUỐC KIỆT SKL011119 Tp Hồ Chí Minh, tháng 07/2023 TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP HCM KHOA ĐÀO TẠO CHẤT LƯỢNG CAO  ĐỒ ÁN TỐT NGHIỆP NGHIÊN CỨU VÀ THIẾT KẾ MOBILE ROBOT TỰ HÀNH TRONG NHÀ XƯỞNG SỬ DỤNG LIDAR SVTH : Bùi Lê Anh MSSV : 19151099 SVTH : Nguyễn Quốc Kiệt MSSV : 19151146 Khóa : 2019 Ngành : CNKT Điều khiển Tự động hóa GVHD : TS Nguyễn Văn Thái Tp Hồ Chí Minh, tháng năm 2023 CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM ĐỘC LẬP – TỰ DO – HẠNH PHÚC o0o Tp Hồ Chí Minh, ngày 15 tháng năm 2023 NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP Họ tên sinh viên: Bùi Lê Anh MSSV: 19151099 Ngành: CNKT Điều Khiển Tự Động Hóa Lớp: 19151CL2A Họ tên sinh viên: Nguyễn Quốc Kiệt MSSV: 19151146 Ngành: CNKT Điều Khiển Tự Động Hóa Lớp: 19151CL3B Giảng viên hướng dẫn: TS Nguyễn Văn Thái ĐT: 0902807476 Ngày nhận đề tài: 23/2/2023 Ngày nộp đề tài: 30/6/2023 Tên đề tài: NGHIÊN CỨU VÀ THIẾT KẾ MOBILE ROBOT TỰ HÀNH TRONG NHÀ XƯỞNG SỬ DỤNG LIDAR Các thiết bị, thành phần hệ thống: Jetson Nano Developer Kit B01, Lidar RPLIDAR A1 2D 360°, Arduino Uno R3, động DCM50-775, encoder, cảm biến gốc MPU9250, mạch điều khiển động BTS7960, mạch giảm áp Buck DC-DC XL4005 Nội dung thực hiện: - Tìm hiểu hệ điều hành robot ROS - Tìm hiểu nghiên cứu giao tiếp Jetson Nano mạch vi xử lý Arduino - Thiết kế phần cứng cho mobile robot lập trình để điều khiển tốc độ động góc quay robot - Xây dựng đồ di chuyển cho robot - Chạy thử nghiệm hiệu chỉnh mô hình - Đánh giá kết thực viết luận văn Sản phẩm: - Mơ hình xe robot tự hành tránh vật cản sử dụng lidar 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Ự DO – HẠNH PHÚC o0o PHIẾU NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN Họ tên Sinh viên: Bùi Lê Anh MSSV: 19151099 Họ tên Sinh viên: Nguyễn Quốc Kiệt MSSV: 19151146 Ngành: CNKT Điều Khiển Tự Động Hóa Tên đề tài: NGHIÊN CỨU VÀ THIẾT KẾ MOBILE ROBOT TỰ HÀNH TRONG NHÀ XƯỞNG SỬ DỤNG LIDAR Họ tên Giáo viên hướng dẫn: TS Nguyễn Văn Thái 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 2023 Giáo viên hướng dẫn CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM ĐỘC LẬP – TỰ DO – HẠNH PHÚC ******* PHIẾU NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN Họ tên Sinh viên: Bùi Lê Anh MSSV: 19151099 Họ tên Sinh viên: Nguyễn Quốc Kiệt MSSV: 19151146 Ngành: CNKT Điều Khiển Tự Động Hóa Tên đề tài: NGHIÊN CỨU VÀ THIẾT KẾ MOBILE ROBOT TỰ HÀNH TRONG NHÀ XƯỞNG SỬ DỤNG LIDAR 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 2023 Giáo viên hướng dẫn LỜI CẢM ƠN Đồ án tốt nghiệp cơng trình nghiên cứu quan trọng sau nhiều năm học tập, yêu cầu bắt buộc sinh viên trước trường Việc nghiên cứu vấn đề mẻ luôn việc vơ khó khăn Chính nhờ có giúp đỡ hướng dẫn tận tình quý thầy mà sinh viên thực đề tài nghiên cứu hồn thành cách sn sẻ Lời đầu tiên, chúng em xin dành lời cảm ơn đến quý thầy cô Trường đại học Sư phạm Kỹ thuật Thành phố Hồ Chí Minh, thầy ngành CNKT Điều khiển Tự động hóa thầy khoa Đào tạo Chất lượng cao tận tình hướng dẫn, truyền đạt kiến thức quý báo cho chúng em suốt thời gian chúng em học tập trường Đặc biệt, chúng em xin gửi lời cảm ơn chân thành đến thầy TS Nguyễn Văn Thái Người tận tình giúp đỡ, tạo điều kiện dành thời gian theo sát chúng em trình thực đề tài CẢM ƠN CÔNG TY I&C, LÀ CÔNG TY ĐẶT HÀNG CHO ĐỀ TÀI NGHIÊN CỨU NÀY, SẼ TIẾP NHẬN CẢ KẾT QUẢ NGHIÊN CỨU VÀ CÁC SINH VIÊN THỰC HIỆN ĐỀ TÀI TỐT NGHIỆP NÀY VÀO LÀM Ở CÔNG TY Sau cùng, chúng gửi lời cảm ơn đến ba mẹ người thân gia đình người giúp đỡ, động viên chúng em suốt trình học tập Sinh viên thực đề tài i TÓM TẮT Robot tự hành quen thuộc khơng cịn điều q xa lạ với người sống Khi chúng có mặt khắp nơi sống ngày Chúng góp phần khơng nhỏ vào việc thay người để hồn thành cơng việc nặng, làm việc mơi trường khó khăn nơi mà người khó tiếp cận qua giúp tiết kiệm thời gian, cải sức lực người Từ thực tiễn nhu cầu sử dụng rộng lớn đó, nhóm tìm hiểu xây dựng đề tài “Nghiên cứu thiết kế mobile robot nhà xưởng có sử dụng LIDAR” có nhiệm vụ giúp cho robot có khả di chuyển, thực hoạt động cách độc lập hoàn toàn tự động Trong đề tài này, nhóm thiết kế phần cứng có kích thước phù hợp hỗ trợ khả di chuyển định vị vị trí nhà xưởng Xây dựng điều khiển PID đáp ứng yêu cầu đặt vận tốc giúp chúng di chuyển cách xác Tiếp theo lập trình hệ điều hành ROS robot có khả xây dựng đồ định vị vị trí robot đồ xây dựng Đồng thời xây dựng phần mềm di chuyển hỗ trợ lập đồ cho robot điều khiển qua web, nút nhấn điều khiển robot giúp cho người sử dụng dễ dàng bật tắt robot với thao tác Cuối cùng, nhóm xây dựng cho robot có khả di chuyển đến đích với đường ngắn tránh né vật cản lúc di chuyển ii ABSTRACT Autonomous robots have become familiar and no longer unfamiliar to people in daily life They are present everywhere, contributing significantly to replacing humans in performing heavy tasks and working in challenging environments that are difficult for humans to access, thereby saving time, resources, and human effort Based on this reality and the widespread demand for their use, our team has researched and designed the topic 'Research and Design of a LIDAR-based Mobile Robot in a Factory,' with the main task of enabling the robot to move and perform activities completely autonomously In this project, we design hardware of suitable size to support the robot's mobility and position tracking within the factory We build a PID controller that meets the specified velocity requirements to ensure precise movement Furthermore, we program the robot on the ROS operating system to enable map building and localization within the constructed map We also develop supportive software for controlling the robot's movement and mapping via a web interface, with control buttons facilitating easy on/off operation for the user Finally, we enable the robot to navigate to its destination using the shortest path and avoid obstacles during movement iii MỤC LỤC LỜI CẢM ƠN i TÓM TẮT ii ABSTRACT iii MỤC LỤC iv DANH MỤC HÌNH ẢNH viii DANH MỤC BẢNG xii DANH MỤC CÁC TỪ VIẾT TẮT xiii CHƯƠNG TỔNG QUAN 1.1 Giới thiệu chung 1.2 Mục tiêu đề tài 1.3 Giới hạn đề tài 1.4 Đặt vấn đề 1.5 Nội dung nghiên cứu 1.6 Phương pháp nghiên cứu 1.7 Bố cục báo cáo CHƯƠNG CƠ SỞ LÝ THUYẾT 2.1 Động lực học robot 2.1.1 Động học thuận robot: 2.1.2 Tính tốn động lực học robot .7 2.2 Giới thiệu hệ thống ROS .10 2.2.1 Giới thiệu ROS (Hệ điều hành Robot): 10 2.2.2 Cấu trúc ROS 12 2.3 Áp dụng mơ hình ROS .16 2.3.1 Key Teleop 17 iv 2.3.2 Twist to Motor 17 2.3.3 Odometry 18 2.3.4 SLAM/AMCL 19 2.3.5 RPLIDAR 20 2.3.6 Robot State Publisher 20 2.3.7 Map Server 20 2.3.8 Move Base .20 2.4 Rviz (ROS Visualization) 20 2.5 SLAM .20 2.5.1 Giới thiệu SLAM (Simultaneous localization and mapping) 20 2.5.2 LIDAR SLAM 21 2.5.3 2D Navigation Stack 21 2.5.4 Costmap 2D .22 2.5.5 Cách cấu hình costmap .22 2.6 Thuật toán cho global planner local planner .23 2.6.1 Thuật toán Dijkstra 23 2.6.2 Thuật toán Dynamic Window Approach 27 2.6.3 Khơng gian tìm kiếm 28 2.6.4 Tối ưu 29 2.7 UART .31 2.8 I2C 33 2.9 Điều khiển động sử dụng thuật toán PID 33 2.9.1 Giới thiệu điều khiển PID 33 2.9.2 Thiết kế tham số PID 35 CHƯƠNG THIẾT KẾ PHẦN CỨNG 36 3.1 Tổng quan phần cứng robot .36 v CHƯƠNG 5: KẾT QUẢ THỰC NGHIỆM Hình 5.21: Robot điểm đến thứ hai với hướng quay đặt sẵn Hình 5.22: Robot điểm đến thứ ba với hướng quay đặt sẵn Với khảo sát ta thấy robot di chuyển ổn định điểm đến cách ổn định mà định vị robot xác đồ 85 CHƯƠNG 5: KẾT QUẢ THỰC NGHIỆM 5.3.6 Khả chịu tải robot Hình 5.23: Các loại tải robot thực tải Mỗi loại tải xấp xỉ 5kg Hình 5.24: Vị trí ban đầu robot thử tải 5kg 86 CHƯƠNG 5: KẾT QUẢ THỰC NGHIỆM Hình 5.25: Vị trí kết thúc robot thử tải 5kg Hình 5.26: Vị trí ban đầu robot thử tải 10kg 87 CHƯƠNG 5: KẾT QUẢ THỰC NGHIỆM Hình 5.27: Vị trí kết thúc robot thử tải 10kg Hình 5.28: Vị trí ban đầu robot thử tải 15kg 88 CHƯƠNG 5: KẾT QUẢ THỰC NGHIỆM Hình 5.29: Vị trí kết thúc robot thử tải 15kg Với khảo sát ta thấy robot di chuyển ổn định đến điểm đích cách xác với nhiều loại tải khác mà khơng gặp khó khăn việc di chuyển 5.4 Nhận xét kết luận Với lần thực nghiệm ta kết luận điều khiền PID đáp ứng tốt với thời gian đáp ứng, độ vọt lố sai số xác lập mức tốt, tương thích tốt với chương trình điều khiển robot từ việc nhóm thiết lập tốt giao thức UART để truyền thơng máy tính nhúng vi điều khiển làm giảm độ trễ giúp PID đáp ứng tốt Qua q trình tiến hành thử nghiệm cho robot di chuyển đến nhiều điểm đặt trước với loại tải khác thuật tốn tìm đường Dijkstra Nhóm nhận thấy robot hoạt động tốt ổn định với nhiều trường hợp khác dù mơi trường có nhiều nhiễu hành lanh khu nhà robot xử lí tối ưu trường hợp Tuy nhiên sai số góc quay robot có sai lệch khơng đáng kể tích lũy sai số từ tín hiệu cảm biến IMU kết hợp với Encoder 89 CHƯƠNG 6: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN CHƯƠNG KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 6.1 Kết luận Sau thiết kế phần cứng, xây dựng tảng ROS xử lý liệu từ cảm biến LIDAR Nhóm xây dựng robot có khả xây dựng đồ môi trường xung quanh triển khai điều hướng đồ Bên cạnh nhóm có kết đánh sau: Xét phần thiết kế phần cứng, nhóm hồn thành việc thiết kế khung robot có hình chữ nhật phù hợp cho việc vận chuyển hàng hóa nhà xưởng Robot có kết cấu chắn kết hợp với động có momen lớn giúp cho robot có khả vận chuyển với khối lượng đáng kể mà có tốc độ nhanh, độ xác cao Tuy nhiên vị trí đặt LIDAR robot cao gặp vật cản thấp tầm quét cảm biến LIDAR robot khơng phát vật dễ va phải vào vật Xét khả xây dựng đồ, sau nhiều lần thực nghiệm nhóm nhận thấy robot xây dựng đồ với độ sai lệch không đáng kể Thuật tốn tự hành robot có độ xác cao, di chuyển nhanh, tránh né vật cản hành trình di chuyển robot Song với q trình lập đồ cịn hạn chế định Do nhóm xử lý việc kết nối chưa tốt nên tầm hoạt động robot hạn chế Về khả tránh vật cản robot, nhờ vào cảm biến LIDAR quét môi trường xung quanh tốc độ cao nên khả xác định vật cản robot xác Robot phản xạ nhanh gặp vật cản 6.2 Hướng phát triển Để cho việc thương mai hóa sản phẩm thị trường robot phải tối ưu hơn, ổn định hoạt động tốt nhiều điều kiện môi trường khác nên nhóm cần phải: - Cải thiện thiết kế phần cứng trở nên nhỏ gọn, chắn chắn, đẹp mắt cho phù hợp với mục đích sử dụng - Tăng phạm vi hoạt động, xây dựng đồ để tối ưu hóa đường - Cải thiện thêm tính an tồn cho robot người dùng ví dụ cảm biến khoảng cách đèn báo hiệu 90 CHƯƠNG 6: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN - Cải thiện tính ổn định chuyển động robot - Tích hợp thêm phần mềm điều khiển từ xa qua Internet để dễ dàng điều khiển robot thơng qua laptop, máy tính bảng điện thoại thông minh 91 TÀI LIỆU THAM KHẢO TÀI LIỆU THAM KHẢO [1] Nguyễn Thùy Linh, “Nghiên cứu thuật tốn tìm đường bao phủ nhóm robot di động” https://123docz.net/document/4327103-nghien-cuu-thuattoan-tim-duong-bao-phu-mot-nhom-robot-di-dong.htm (2016) [2] LE DUC HANH, NGUYEN DUY ANH, “"Hoạch định bám đường cho mobile robot ứng dụng điều khiển nối tiếp ảnh",” Tạp chí khoa học cơng nghệ giao thông vận tải, 2018, p 27 [3] Pham Minh Tri, “Thiết lập xe tự hành nhà dùng streo camera,” Bach Khoa TP.HCM, 2018 [4] Y Chin and C J Wei, Immplementation of Odometry with EKF in Hector SLAM, 2018 [5] A Huletski and D Kartashov, “A SLAM research framework for ROS,” in the 12 Central and Eastern European Software Engineering Conference in Russia, 2016 [6] Fahmizal, A Priyatmoko, E Apriaskar and A Mayub, “Heading Control on Differential Drive Wheeled Mobile Robot with Odometry for Tracking Problem,” International Conference on Advanced Mechatronics, Intelligent Manufacture and Industrial Automation, p 48, 2019 [7] M Haidari and A A Ali, “Adaptive Sliding Mode Tracking control of Mobile Robot in Dynamic Enviroment,” in Computer & Robotics, 2018 [8] W Burgard and D Fox, Monte Carlo Localization, The MIT Press, 2005 [9] L Joseph, “ROS Robotics Projects,” 2017 [10] M Wang, “Node.js* Client & Web Bridge Ready,” in ROScon2018, 2018 92 PHỤ LỤC PHỤ LỤC #include #include #define encoderA1 #define encoderB1 #define encoderA2 #define encoderB2 #define pwm1 10 #define pwm2 #define pwm3 #define pwm4 #define LOOPTIME 10 #define ROBOT_MOTOR_PPR 100 #define ROBOT_WHEEL_RADIUS 0.725f #define ROBOT_WHEEL_SEPARATION 0.26f #define sample_time_ms 10 #define pid_rate float(sample_time_ms) / 1000.0f #define ROBOT_MAX_LINEAR_M_S 0.2 #define ROBOT_MIN_LINEAR_M_S -0.2 #define ROBOT_MAX_ANGULAR_R_S 2.0 #define ROBOT_MIN_ANGULAR_R_S -2.0 double kp1=12.2, ki1=100, kd1=0.01; double kp2=11, ki2=100, kd2=0.01; double input1 = 0, output1 = 0, setpoint1 = 0; double input2 = 0, output2 = 0, setpoint2 = 0; unsigned long lastTime, now; unsigned long lastTime2, now2; volatile long encoderPos1 = 0, last_pos1 = 0, lastpos1 = 0; volatile long encoderPos2 = 0, last_pos2 = 0, lastpos2 = 0; double l_pos, r_pos; unsigned long l_ticks_prev, r_ticks_prev; double x_pos, y_pos, theta, v, w; double l_speed, r_speed; double linear, angular; int32_t dl_ticks, dr_ticks; String inByte; 93 PHỤ LỤC PID myPID(&input1, &output1, &setpoint1, kp1, ki1, kd1, DIRECT); PID myPID2(&input2, &output2, &setpoint2, kp2, ki2, kd2, DIRECT); void update_pid(int32_t l_encoder_ticks, int32_t r_encoder_ticks ) { int32_t l_ticks = l_encoder_ticks; int32_t r_ticks = r_encoder_ticks; l_pos = (2*PI)*l_ticks/ROBOT_MOTOR_PPR; r_pos = (2*PI)*r_ticks/ROBOT_MOTOR_PPR; dl_ticks = l_ticks - l_ticks_prev; dr_ticks = r_ticks - r_ticks_prev; updateOdometry(dl_ticks, dr_ticks); l_speed = (2.0 * PI) * dl_ticks / (ROBOT_MOTOR_PPR * pid_rate); r_speed = (2.0 * PI) * dr_ticks / (ROBOT_MOTOR_PPR * pid_rate); v = (ROBOT_WHEEL_RADIUS / 2.0f) * (l_speed + r_speed); w = (ROBOT_WHEEL_RADIUS / ROBOT_WHEEL_SEPARATION) * (r_speed - l_speed); input1 = l_speed; input2 = r_speed; myPID.Compute(); myPID2.Compute(); pwmOut1(output1); pwmOut2(output2); l_ticks_prev = l_ticks; r_ticks_prev = r_ticks; } void updateOdometry(int32_t dl_ticks, int32_t dr_ticks) { double delta_l = (2 * PI * ROBOT_WHEEL_RADIUS * dl_ticks) / ROBOT_MOTOR_PPR; double delta_r = (2 * PI * ROBOT_WHEEL_RADIUS * dr_ticks) / ROBOT_MOTOR_PPR; double delta_center = (delta_l + delta_r) / 2; 94 PHỤ LỤC x_pos += delta_center * cos(theta); y_pos += delta_center * sin(theta); theta += (delta_r - delta_r)/ROBOT_WHEEL_SEPARATION; } void setUnicycle(double v, double w) { //limit value if(v > ROBOT_MAX_LINEAR_M_S) v = ROBOT_MAX_LINEAR_M_S; if(v < ROBOT_MIN_LINEAR_M_S) v = ROBOT_MIN_LINEAR_M_S; if(w > ROBOT_MAX_ANGULAR_R_S) w = ROBOT_MAX_ANGULAR_R_S; if(w < ROBOT_MIN_ANGULAR_R_S) w = ROBOT_MIN_ANGULAR_R_S; double v_l = (2 * v - w * ROBOT_WHEEL_SEPARATION) / (2 * ROBOT_WHEEL_RADIUS); double v_r = (2 * v + w * ROBOT_WHEEL_SEPARATION) / (2 * ROBOT_WHEEL_RADIUS); linear = v; angular = w; setWheel(v_l, v_r); } void setWheel(double left_speed, double right_speed) { setpoint1 = left_speed; setpoint2 = right_speed; } void publishData() { Serial.print(x_pos); Serial.print("/"); Serial.print(y_pos); Serial.print("/"); Serial.print(theta); Serial.print("/"); Serial.print(l_speed); Serial.print("/"); Serial.print(r_speed); Serial.print("/"); Serial.print(output1); Serial.print("/"); Serial.print(output2); Serial.print("/"); } void getData() { int leng, j; String data, data2; while(Serial.available()) { inByte = Serial.readString(); 95 PHỤ LỤC leng = inByte.length(); for(int i=0; i 0) { analogWrite(pwm1, 0); analogWrite(pwm2, abs(out)); } if(out < 0) { analogWrite(pwm1, abs(out)); analogWrite(pwm2, 0); } } void pwmOut2(int out) { if(out > 0) { analogWrite(pwm3, 0); analogWrite(pwm4, abs(out)); } if(out < 0) { analogWrite(pwm3, abs(out)); analogWrite(pwm4, 0); } } void ISR_encoderA1() { bool PinB = digitalRead(encoderB1); bool PinA = digitalRead(encoderA1); if (PinB == LOW) { if (PinA == HIGH) { encoderPos1++; } else { 97 PHỤ LỤC encoderPos1 ; } } else { if (PinA == HIGH) { encoderPos1 ; } else { encoderPos1++; } } } void ISR_encoderA2() { bool PinB = digitalRead(encoderB2); bool PinA = digitalRead(encoderA2); if (PinB == LOW) { if (PinA == HIGH) { encoderPos2 ; } else { encoderPos2++; } } else { if (PinA == HIGH) { encoderPos2++; } else { encoderPos2 ; } } } 98 S K L 0

Ngày đăng: 28/12/2023, 18:50

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

TÀI LIỆU LIÊN QUAN

w