THIẾT KẾ VÀ CHẾ TẠO MÔ HÌNH HỆ THỐNG MÁY KÉO DI CHUYỂN TỰ ĐỘNG

102 118 0
THIẾT KẾ VÀ CHẾ TẠO MÔ HÌNH HỆ THỐNG MÁY KÉO DI CHUYỂN TỰ ĐỘNG

Đ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 thành công và đạt được kết quả khả quan như xây được mô hình robot bám đối tượng dựa vào thuật toán CamShift trong thư viện OpenCV. Để theo dõi đối tượng trong OpenCV cần phải có quá trình dò tìm, phân tích và nhận dạng đối tượng. Thực hiện truyền nhận dữ liệu nối tiếp chuẩn RS232, truyền nhận dữ liệu không dây qua sóng RF. Trên cơ sở tìm hiểu thư viện OpenCV đồ án xây dựng thuật toán theo dõi đối tượng dựa vào thuật toán rất phổ biến trong OpenCV là thuật toán CamShift. Đồ án gồm có:Mô hình máy kéo di chuyển tự động là một con robot chạy sau bám theo một con robot chạy trước. Robot chạy sau có 1 webcam thu nhận hình ảnh đóng vai trò như là con mắt của robot và một robot chạy trước đóng vai trò như là đối tượng di chuyển để robot sau bám theo. Mô hình robot được chế tạo nhằm kiểm nghiệm thuật toán đã xây dựng, kết quả của đồ án là căn cứ để phát triển và xây dựng các thuật toán điều khiển robot sử dụng OpenCV.

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Ế VÀ CHẾ TẠO MÔ HÌNH HỆ THỐNG MÁY KÉO DI CHUYỂN TỰ ĐỘNG Họ và tên sinh viên: PHẠM QUANG LỘC NGUYỄN CÔNG HẬU Ngành: CƠ ĐIỆN TỬ Niên khóa: 2009- 2013 Tháng 06 năm 2013 MÔ HÌNH HỆ THỐNG MÁY KÉO CHẠY TỰ ĐỘNG TÁC GIẢ PHẠM QUANG LỘC – NGUYỄN CÔNG HẬU Khóa luận tốt nghiệp được đệ trình đáp ứng yêu cầu Cấp bằng kỹ sư nghành cơ điện tử Giáo viên hướng dẫn: TH.S TRẦN THỊ KIM NGÀ PGS.TS NGUYỄN VĂN HÙNG Tháng 06 năm 2013 1 LỜI CẢM ƠN Chúng em xin chân thành cảm ơn các thầy, cô trong bộ môn Cơ Điện Tử và thầy, cô khoa cơ khí_công nghệ đã giúp đỡ chúng em trong quá trình được học tại trường Đại Học Nông Lâm Chúng em xin bày tỏ lòng cảm ơn chân thành đối với thầy Nguyễn Văn Hùng và cô Trần Thị Kim Ngà đã tận tình hướng dẫn chúng em trong suốt quá trình làm luận văn tốt nghiệp Đặc biệt, chúng em xin cảm ơn quý thầy cô trong hội đồng đã dành thời gian nhận xét và góp ý để luận văn của chúng em được hoàn thiện hơn Cuối cùng chúng em xin cảm ơn đến gia đình và tất cả bạn bè đã động viên, giúp đỡ ủng hộ cho chúng em trong suốt quá trình học tập Xin cảm ơn tất cả mọi người cầu chúc tất cả mọi người luôn mạnh khỏe, vui vẻ và thành công trong cuộc sống Xin chân thành cảm ơn! TPHCM, ngày tháng 6 năm 2012 Sinh viên thực hiện PHẠM QUANG LỘC NGUYỄN CÔNG HẬU 2 TÓM TẮT Đề tài nghiên cứu “ Thiết kế chế tạo mô hình máy kéo chạy tự động” được thực hiện tại trường Đại Học Nông Lâm Thành Phố Hồ Chí Minh, trong thời gian từ tháng 3 đến tháng 5 năm 2013 Đề tài được thực hiện thành công và đạt được kết quả khả quan như xây được mô hình robot bám đối tượng dựa vào thuật toán CamShift trong thư viện OpenCV Để theo dõi đối tượng trong OpenCV cần phải có quá trình dò tìm, phân tích và nhận dạng đối tượng Thực hiện truyền nhận dữ liệu nối tiếp chuẩn RS232, truyền nhận dữ liệu không dây qua sóng RF Trên cơ sở tìm hiểu thư viện OpenCV đồ án xây dựng thuật toán theo dõi đối tượng dựa vào thuật toán rất phổ biến trong OpenCV là thuật toán CamShift Đồ án gồm có:Mô hình máy kéo di chuyển tự động là một con robot chạy sau bám theo một con robot chạy trước Robot chạy sau có 1 webcam thu nhận hình ảnh đóng vai trò như là con mắt của robot và một robot chạy trước đóng vai trò như là đối tượng di chuyển để robot sau bám theo Mô hình robot được chế tạo nhằm kiểm nghiệm thuật toán đã xây dựng, kết quả của đồ án là căn cứ để phát triển và xây dựng các thuật toán điều khiển robot sử dụng OpenCV 3 MỤC LỤC LỜI CẢM ƠN ii TÓM TẮT iii MỤC LỤC i DANH SÁCH CÁC CHỮ VIẾT TẮT .iv DANH SÁCH CÁC HÌNH VẼ .iv DANH SÁCH CÁC BẢNG vi Chương 1 1 MỞ ĐẦU 1 1.1 Đặt vấn đề .1 1.2 Mục đích 2 Chương 2 4 TỔNG QUAN 4 2.1 Một số khái niệm cơ bản trong xử lý ảnh 4 2.1.1 Phần tử ảnh .4 2.1.2 Mức xám của ảnh 5 2.1.3 Ảnh 5 2.1.3.1 Ảnh nhị phân 5 2.1.3.2 Ảnh xám .6 2.1.3.3 Ảnh màu .6 2.1.4 Độ phân giải 7 2.2 Tổng quan về hệ thống xử lý ảnh 7 2.2.1 Các thiết bị thu nhận ảnh 7 2.2.1.1 Khái niệm camera .8 2.2.1.2Phân loại Camera 8 2.2.2 Thu nhận ảnh và số ảnh 10 2.2.3 Lưu trữ ảnh .10 2.2.4 Phân tích ảnh 11 2.2.5 Hệ quyết định 14 2.3 Tổng quan về vi điều khiển PIC 15 1 2.4 Truyền thông nối tiếp RS 232 17 2.4.1 Tổng quan về truyền thông nối tiếp RS 232 17 2.4.2 Truyền dữ liệu qua cổng RS 232 .19 2.4.2.1 Sơ đồ kết nối vi điều khiển với máy tính thông qua cổng RS 232 19 2.4.2.2 Cấu trúc truyền dữ liêu theo chuẩn RS 232 19 2.5 Tín hiệu không dây sử đụng cặp module thu phát RF 20 2.5.1 Tổng quan về sóng RF 20 2.5.1.1 Biên độ và bước sóng .20 2.5.1.2 Bức xạ điện từ 21 2.5.1.3 Pha 21 2.5.2 Các phương pháp điều chế sóng RF 21 2.5.2.1 Điều biên 21 2.5.2.2 Điều tần 22 2.5.2.3 Điều pha 22 2.5.3 Mã hóa dữ liệu 23 2.5.3.1 Các phương pháp mã hóa dữ liệu .23 2.5.3.2 Các dạng mã hóa phổ biến 23 2.5.4 Hoạt động của sóng vô tuyến 24 2.5.5 Module thu phát sóng RF 25 2.5.5.1 Tổng quan về cặp IC – PT2262 và IC – 2272 25 2.5.5.2 Module phát 26 2.5.5.3 Module thu .27 2 6 Tổng quan về OpenCV 28 2.6.1 Cấu trúc và nội dung OpenCV 29 2.6.2 Một số hàm đơn giản thường xuyên sử dụng trong thư viện HighGUI như sau: 30 2.6.2.1 Đọc và viết một bức ảnh 30 2.6.2.2Các hàm thực hiện xử lý ảnh .31 2.6.3 Cơ sở toán học của thuật toán CamShift 33 Chương 3 35 PHƯƠNG TIỆN VÀ PHƯƠNG PHÁP NGHIÊN CỨU 35 2 3.1 Thời gian bố trí và thực hiện đề tài 35 3.2 Đối tượng và các thiết bị nghiên cứu .35 3.3 Phương pháp nguyên cứu 35 3.3.1 Phương pháp nguyên cứu 35 Chương 4 36 KẾT QUẢ VÀ THẢO LUẬN 36 4.1 Sơ đồ xử lý và điều khiển 36 4.1.1 Camera sử dụng 36 4.1.2 Thiết kế mach vi điều khiển và kết nối module phát sóng RF 38 4.1.3 Sơ đồ khối khâu công tác 40 4.1.4 Thiết kế mach vi điều khiển và kết nối module thu sóng RF 41 4.1.5 Thiết kế mạch công suất điều khiển động cơ 43 4.1.6 Mô hình hệ thống sau khi hoàn thành .44 4.2 Xử lý ảnh, xác định và điều khiển bám theo đối tượng 46 4.2.1 Thị giác máy tính điều khiển robot di động bám đối tượng 46 4.2.2 Thuật toán tính hướng và kích thước cỡ của đối tượng cần theo dõi .46 4.2.2.1 Thuật toán chung 46 4.2.2.2 Nhận dạng và bám theo đối tượng di động .47 4.2.3 Thuật toán CamShift .50 4.2.3.1 Thu nhận ảnh 52 4.2.3.2 Histogram 53 4.2.4 Thiết kế và hoàn chỉnh phần mềm điều khiển 54 4.2.5 Phương pháp điều khiển 56 4.2.5.1 khảo sát và chạy thử nghiệm 2 robot 56 4.2.5.2 Khảo nghiệm mô hình máy kéo di chuyển tự động 56 Chương 5 59 KẾT LUẬN VÀ ĐỀ NGHỊ 59 5.1 Kết quả đạt được 59 5.1.1 Kết quả đạt được .59 5.1.2 Hạn chế cân khắc phục 59 5.2 Hướng phát triển của đồ án 60 3 TÀI LIỆU THAM KHẢO 1 PHỤ LỤC 2 Code xử lý ảnh 2 Code vi điều khiển 23 2.1 Code mạch phát 23 2.2 Code mach thu xe 1 26 2.3 Code mạch thu xe 2 29 DANH SÁCH CÁC CHỮ VIẾT TẮT GUI: .Graphical User Interface CMOS: .Complementary Metal-Oxide-Semiconductor COM: component object model IP: Internet Protocol PIC: .Programmable interrupt controller RS 232: Recommended Standard 232 RF: .Radio Frequency CCD: Charge Couple Device CCIR: Consultative Committee On International Radio AC: Alternating Current ASK: Amplitude Shift Keying PSK: Phase Shift Keying OpenCV Open Source Computer Vision Library CamShift .Continouusly Adaptive Mean Shift DANH SÁCH CÁC HÌNH Hình 2.1 Điểm ảnh .5 Hình 2.2 Ma trận biểu diễn ảnh nhị phân .5 Hình 2.3 Ma trận biểu diễn ảnh xám 6 4 Hình 2.4 Ma trận biểu diễn mức xám của thành phần RED 6 Hình 2.5 Ma trận biểu diễn mức xám của thành phần GREEN 6 Hình 2.6 Ma trận biểu diễn mức xám của thành phần BLUE 7 Hình 2.7 Sơ đồ hệ thống xử lý ảnh 7 Hình 2.8 Camera có dây 9 Hình 2.9 Camera không dây 9 Hình 2.10 Camera IP Sony SNC DH 240 10 Hình 2.11 Mô hình không gian màu RGB 12 Hình 2.12 Mô hình màu HLS 12 Hình 2.13 Mô hình màu L*a*b 13 Hình 2.14 biến đổi Fourier 13 Hình 2.15 Vi điều khiển 16f877A 15 Hình 2.16 Sơ đồ chân Pic16F877A 16 Hình 2.17 Sơ đồ khối Pic 16F877A 17 Hình 2.18 Cổng nối tiếp RS232 9 Chân .18 Hình 2.19 Sơ đồ kết nối vi điều khiển với máy tính qua cổng rs232 19 Hình 2.20 Khung truyền dữ liệu qua cổng RS232 .20 Hình 2.21 Điều biên 22 Hình 2.22 Điều tần .22 Hình 2.23 Điều pha 23 Hình 2.24 các dạng mã hóa phổ biến 24 Hình 2.25 Hoạt động của sóng vô tuyến 24 Hình 2.26 Module phát sử dụng IC PT 2262 .26 Hình 2.27 Module thu sử dụng IC PT 2272 .27 Hình 2.28 Quá trình phát triển của OpenCV 29 Hình 2.29 Cấu trúc cơ sở của OpenCV 30 Hình 4.1 Sơ đồ khối xử lý ảnh và điều khiển .36 Hình 4.2 Camera có dây Nansin 37 Hình 4.3 Camera không dây Vantech 37 Hình 4.4 Sơ đồ nguyên lý vi điều khiển kết nối với module phát sóng RF 38 Hình 4.5 Mạch vi điều khiển kết nối với module phát sóng RF 39 5 Hình 4.6 Mạch nguyên lý module phát sóng RF sử dụng PT 2262 40 Hình 4.7 Sơ đồ khối khâu công tác 40 Hình 4.8 Mạch nguyên lý Module thu sóng RF 41 Hình 4.9 Mạch nguyên lý module thu sóng RF kết nối với PIC 16F877A 42 Hình 4.10 Mạch module thu sóng RF kết nối với PIC 16F877A .43 Hình 4.11 Mạch nguyên lí mạch động lực 44 Hình 4.12 Mạch động lực 44 Hình 4.13 Mô hình xe chạy trước 45 Hình 4.14 Mô hình xe bám đối tượng 45 Hình 4.15 Sơ đồ thuật toán chung 47 Hình 4.16 Mặt phẳng ảnh 48 Hình 4.17 Biểu diễn đối tượng di chuyển trên mặt phẳng ảnh 49 Hình 4.18 Histogram 50 Hình 4.19 Kết quả trước và sau khi lọc nhiễu 50 Hình 4.20 Sơ đồ thuật toán CamShift 51 Hình 4.21 Thu ảnh bám đối tượng .52 Hình 4.22 Ảnh nhận từ Camera 53 Hình 4.23 Histogram 53 Hình 4.24 Kết quả tính tọa độ tâm băng thuật toán CamShift 54 Hình 4.25 Kết quả bước đầu theo dõi đối tượng bằng thuạt toán CamShift .54 Hình 4.26 Giao diện của chương trình điều khiển .55 Y DANH SÁCH CÁC BẢNG Bảng 2.1 thông số kỹ thuật của module phát .26 Bảng 2.2 Thông số kỹ thuật của module thu 27 Bảng 4.1: Khảo nghiệm khoảng cách truyền của sóng RF 56 Bảng 4.2 khảo sát robot bám theo tốc độ 1 57 Bảng 4.3 khảo sát robot bám theo tốc độ 2 58 6 fprintf(demFile," %4d\n",dem); fclose (xFile); fclose (yFile); fclose (demFile); } void CTUBODlg::OnBnClickedButtonRight() { data_send_RS232= "r"; UpdateData(TRUE); Setting(); m_mscomm1.put_Output(COleVariant(data_send_RS232));//strOutput)); UpdateData(false); } void CTUBODlg::OnBnClickedButtonStop() { data_send_RS232= "s"; UpdateData(TRUE); Setting(); m_mscomm1.put_Output(COleVariant(data_send_RS232));//strOutput)); UpdateData(false); } void CTUBODlg::OnBnClickedButtonBackward() { 19 data_send_RS232= "b"; UpdateData(TRUE); Setting(); m_mscomm1.put_Output(COleVariant(data_send_RS232));//strOutput)); UpdateData(false); } void CTUBODlg::OnBnClickedButtonLeft() { data_send_RS232= "l"; UpdateData(TRUE); Setting(); m_mscomm1.put_Output(COleVariant(data_send_RS232));//strOutput)); UpdateData(false); } void CTUBODlg::OnBnClickedButtonForward() { data_send_RS232= "f"; UpdateData(TRUE); Setting(); m_mscomm1.put_Output(COleVariant(data_send_RS232));//strOutput)); UpdateData(false); } void CTUBODlg::OnBnClickedButton1() { data_send_RS232= "s"; 20 UpdateData(TRUE); Setting(); m_mscomm1.put_Output(COleVariant(data_send_RS232));//strOutput)); UpdateData(false); } void CTUBODlg::OnBnClickedButtonLeft2() { data_send_RS232= "3"; UpdateData(TRUE); Setting(); m_mscomm1.put_Output(COleVariant(data_send_RS232));//strOutput)); UpdateData(false); } void CTUBODlg::OnClickedButtonStop2() { data_send_RS232= "s"; UpdateData(TRUE); Setting(); m_mscomm1.put_Output(COleVariant(data_send_RS232));//strOutput)); UpdateData(false); } void CTUBODlg::OnClickedButtonRight2() { data_send_RS232= "2"; UpdateData(TRUE); Setting(); 21 m_mscomm1.put_Output(COleVariant(data_send_RS232));//strOutput)); UpdateData(false); } void CTUBODlg::OnClickedButtonForward2() { data_send_RS232= "1"; UpdateData(TRUE); Setting(); m_mscomm1.put_Output(COleVariant(data_send_RS232));//strOutput)); UpdateData(false); } void CTUBODlg::OnClickedButtonBackward2() { data_send_RS232= "f"; UpdateData(TRUE); Setting(); m_mscomm1.put_Output(COleVariant(data_send_RS232));//strOutput)); UpdateData(false); } void CTUBODlg::OnBnClickedButtonExit() { // Neu cong con mo thi dong lai if(m_mscomm1.get_PortOpen()) m_mscomm1.put_PortOpen(false); OnOK(); } 22 void CTUBODlg::OnBnClickedButtonSend() { // TODO: Add your control notification handler code here UpdateData(TRUE); Setting(); m_mscomm1.put_Output(COleVariant(m_strTransfer));//strOutput)); UpdateData(false); } void CTUBODlg::OnBnClickedButtonClear() { // TODO: Add your control notification handler code here UpdateData(); m_strReceive=""; UpdateData(false); } Code vi điều khiển 2.1 Code mạch phát #include #include #include #use delay(clock=4000000) #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) char value; 23 #INT_RDA Receive_isr() //ngat truyen thong RS232 //ham ngat { value=getc(); //lay du lieu tu bo dem nhan delay_ms(10); putc(value); // gui du lieu //*************************************** if (value=='f') // đi tới chậm { porta=0b00000010; } if (value=='b') // đi lui { porta=0b00000100; } if (value=='r') // rẽ phải nhanh { porta=0b00001000; } if (value=='l') // rẽ trái nhanh { porta=0b00000001; } if (value=='1') // đi thẳng nhanh { porta=0b00001001; } 24 if (value=='2') // rẽ phải { porta=0b00001010; } if (value=='3') // rẽ trái { porta=0b00000101; } if (value=='s') // stop { porta=0b00000110; } } void main() { enable_interrupts(int_rda); enable_interrupts(GLOBAL); trisa=0x00; porta=0x00; while(1) { delay_ms(1000); porta=0b00000000; } } 25 2.2 Code mach thu xe 1 #include #include #fuses NOWDT,PUT,HS,NOPROTECT #use delay(clock=4000000) void dieuxung(int8 pwm1,pwm2) { pwm1=pwm1*2.5; pwm2=pwm2*2.5; setup_ccp1(CCP_PWM); setup_ccp2(CCP_PWM); set_pwm1_duty(pwm1); set_pwm2_duty(pwm2); setup_timer_2(T2_DIV_BY_4,249,1); } void test_command() { if((RB0==1)& (RB1==1) & (RB2==0) & (RB3==0)) // Chạy tới chậm { porta=0b00000101; dieuxung(18,18); } //================================== if((RB0==0)& (RB1==1) & (RB2==0) & (RB3==0)) // chạy lui { porta=0b00001010; dieuxung(15,15); } 26 //=================================== if((RB0==1)& (RB1==0) & (RB2==1) & (RB3==0)) // Rẽ trái nhanh { porta=0b00000101; dieuxung(19,12); } //================================== if((RB0==1)& (RB1==1) & (RB2==1) & (RB3==0)) // Rẽ phải nhanh { porta=0b00000101; dieuxung(12,19); } //===================================== if((RB0==0)& (RB1==0) & (RB2==0) & (RB3==1)) // Rẽ phải { porta=0b00000101; dieuxung(30,40); } //====================================== if((RB0==0)& (RB1==1) & (RB2==1) & (RB3==0)) // Rẽ trái { porta=0b00000101; dieuxung(40,30); 27 } //========================================= if((RB0==0)& (RB1==0) & (RB2==1) & (RB3==0)) // Chạy thẳng nhanh { porta=0b00000101; dieuxung(25,25); } if((RB0==1)& (RB1==0) & (RB2==0) & (RB3==0)) // stop { porta=0b00000000; dieuxung(0,0); } //========================================= } void main() { trisb=0xff; trisa=0x00; porta=0x00; portb=0b11110000; enable_interrupts(global); enable_interrupts(int_RB); ext_int_edge(L_to_H); 28 while(1) { test_command(); } } 2.3 Code mạch thu xe 2 #include #include #fuses NOWDT,PUT,HS,NOPROTECT #use delay(clock=4000000) void dieuxung(int8 pwm1,pwm2) { pwm1=pwm1*2.5; pwm2=pwm2*2.5; setup_ccp1(CCP_PWM); setup_ccp2(CCP_PWM); set_pwm1_duty(pwm1); set_pwm2_duty(pwm2); setup_timer_2(T2_DIV_BY_4,249,1); } void test_command() { if((RB0==1)& (RB1==0) & (RB2==0) & (RB3==0)) // chạy tới chậm { porta=0b00000101; dieuxung(35,35); } //================================== 29 if((RB0==0)& (RB1==1) & (RB2==0) & (RB3==0)) // chạy lui { porta=0b00001010; dieuxung(35,35); } //=================================== if((RB0==0)& (RB1==0) & (RB2==1) & (RB3==0)) // Rẽ trái nhanh { porta=0b00000101; dieuxung(18,40); } //================================== if((RB0==0)& (RB1==0) & (RB2==0) & (RB3==1)) // Rẽ phải nhanh { porta=0b00000101; dieuxung(40,18); } //===================================== if((RB0==1)& (RB1==0) & (RB2==1) & (RB3==0)) // Rẽ phải { porta=0b00000101; dieuxung(50,70); } //====================================== 30 if((RB0==0)& (RB1==1) & (RB2==0) & (RB3==1)) // Rẽ trái { porta=0b00000101; dieuxung(70,50); } //========================================= if((RB0==0)& (RB1==0) & (RB2==1) & (RB3==1)) // Chạy thẳng nhanh { porta=0b00000101; dieuxung(70,70); } if((RB0==1)& (RB1==1) & (RB2==0) & (RB3==0)) // stop { porta=0b00000000; dieuxung(0,0); } //========================================= } void main() { trisb=0xff; trisa=0x00; 31 porta=0x00; portb=0b11110000; enable_interrupts(global); enable_interrupts(int_RB); ext_int_edge(L_to_H); while(1) { test_command(); } } 32 ... 4.2.5.2 Khảo nghiệm mơ hình máy kéo di chuyển tự động 56 Chương 59 KẾT LUẬN VÀ ĐỀ NGHỊ 59 5.1 Kết đạt 59 5.1.1 Kết đạt .59 5.1.2 Hạn chế cân khắc phục... hình tưới tiêu tự động nhà lưới, robot hái cà chua… Vì toán xử lý ảnh áp dụng giải nhiều việc tự động hóa khâu nông nghiệp nước nhà, máy kéo di chuyển tự động bám theo đối tượng dùng công nghệ... cứu “ Thiết kế chế tạo mơ hình máy kéo chạy tự động? ?? 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 2013 Đề tài thực thành công đạt kết khả quan xây mơ hình

Ngày đăng: 19/09/2019, 15:09

Từ khóa liên quan

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

  • Đang cập nhật ...

Tài liệu liên quan