Lý thuyết Robotics
lượt xem 17
download
Robot là máy, thiết bị tự động linh hoạt phục vụ con người : Có hình dạng giống người hoặc cánh tay người. Có khả năng thao tác tự động. Có khả năng bắt chước thao tác giống người.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Lý thuyết Robotics
- Robotics Ứng dụng Maple trong tính toán rô bốt 1. Xử lý file và thể hiện số liệu -Tạo 1 thư mục (folder) để làm việc -Lưu 1 file maple (ví dụ: xulyfile.mw) vào thư mục trên -Chương trình chạy sẽ tự động tạo file trong thư mục này -Dữ liệu thường lưu trữ dạng file text (.txt) dễ đọc và xử lý, số liệu lưu đơn giản dạng ma trận số, lấy dữ liệu ra dạng ma trận số và xử lý ma trận số này. 1. Xử lý file -Mở file dữ liệu, viết dữ liệu, lưu dữ liệu. -Mở file dữ liệu, đọc dữ liệu (lấy dữ liệu từ file lưu trữ) 1.1.Xử lý file văn bản Nguyên tắc: Tạo file mới (mở file)->Ghi dữ liệu lên file->Đóng file Lệnh mở file: fopen Cụ thể: HEPL fopen(name, mode) fopen(name, mode, type) Viết lên file: fprintf Cụ thể: HEPL Đóng file: close Ví dụ: >fh := fopen("xuly.txt", WRITE) >fprintf(fh, "x=%d,y=%d", 1, 2) >fclose(fh) 1.2.Xử lý file dạng số Nguyên tắc: Tạo file mới (mở file)->Ghi dữ liệu lên file->Đóng file Lệnh mở file: fopen Viết dữ liệu dạng số lên file: writedata Lệnh đọc dữ liệu: readdata Lệnh đóng file: fclose Ví dụ viết dữ liệu: >A := matrix([[1, 2, 3, 90], [6, 8, 80, 56], [1, 5, 8, 3]]) >fh := fopen("matrandulieu.txt", WRITE) >writedata(fh, A, float) >fclose(fh) Muốn mở và lưu file vào thư mục khác: fh := fopen("D:/study/fileMOI.txt", WRITE) fclose(fh) Ví dụ đọc dữ liệu: > fh := fopen("matrandulieu.txt", READ); 0
- > datalayra := readdata(fh, float, 4); [[1., 2., 3., 90.], [6., 8., 80., 56.], [1., 5., 8., 3.]] > datalayra; [[1., 2., 3., 90.], [6., 8., 80., 56.], [1., 5., 8., 3.]] > datalayra[1, 1]; 1. > fclose(fh); 2. Hiển thị số liệu dạng số 2.1 Tạo file dữ liệu Ví dụ: > matran := matrix(100, 2); > for i from 1to 100 by 1 do matran[i, 1] := i: matran[i, 2] := i^2: end do; > fh := fopen("thehiensolieu.txt", WRITE); 0 > writedata(fh, matran, integer); > fclose(fh); 2.2 Thể hiện dữ liệu - đọc file: readdata fh := fopen("thehiensolieu.txt", READ) -Lưu thành ma trận matransolieu := readdata(fh, integer, 2) -Vẽ đồ thị các điểm riêng rẽ > points := {seq([matransolieu[i, 1], matransolieu[i, 2]], i = 1 .. 100)}; > pointplot(points, color = red, thickness = 3);
- II. HƯỚNG DẪN GIẢI PHƯƠNG TRÌNH ĐỘNG HỌC BẰNG MAPLE 1. Khai báo thư viện sử dụng with(linalg); with(VectorCalculus); with(LinearAlgebra); with(plots); with(plottools): 2. Thiết lập phương trình động học -Bằng cách gán ma trận trạng thái khâu thao tác A theo tọa độ thao tác p=[xE,yE,zE,rotx,roty,rotz]T và ma trận trạng thái khâu thao tác A theo cấu trúc động học q=[q1,q2,zE,…,qn]T. Ta được phương trình động học. -Sau đây là 1 ví dụ phương trình động học: f1:=0.28-(.61*(cos(q2)*cos(q3)-sin(q2)*sin(q3)))*cos(q4)*sin(q5)+(.61*(-cos(q2)*sin(q3)- sin(q2)*cos(q3)))*cos(q5)-.86*cos(q2)*sin(q3)-.86*sin(q2)*cos(q3)+.7*cos(q2)-xE: f2:=-0.61*(cos(q2)*sin(q3)+sin(q2)*cos(q3)))*cos(q4)*sin(q5)+(.61*(cos(q2)*cos(q3)- sin(q2)*sin(q3)))*cos(q5)-.86*sin(q2)*sin(q3)+.86*cos(q2)*cos(q3)+.7*sin(q2)-yE: f3:=-0.61*sin(q4)*sin(q5)+q1-zE: f4:=-((cos(q2)*cos(q3)-sin(q2)*sin(q3))*cos(q4)*cos(q5)+(-cos(q2)*sin(q3)- sin(q2)*cos(q3))*sin(q5))*sin(q6)-(cos(q2)*cos(q3)- sin(q2)*sin(q3))*sin(q4)*cos(q6)+cos(roty)*sin(rotz): f5:=(cos(q2)*sin(q3)+sin(q2)*cos(q3))*cos(q4)*sin(q5)-(cos(q2)*cos(q3)-
- sin(q2)*sin(q3))*cos(q5)+sin(rotx)*cos(roty): f6:=sin(q4)*cos(q5)*cos(q6)+cos(q4)*sin(q6)+cos(rotx)*sin(roty)*cos(rotz)-sin(rotx)*sin(rotz): f := [f1, f2, f3, f4, f5, f6]: 3. Giải bài toán thuận 3.1. Đầu vào bài toán thuận - Cho trước q=[q1,q2,q3,…,qn]T (chú ý sv cho phải phù hợp với cấu hình) Ví dụ: q1:=1+0.8*sin(Pi/4*t): q2:=-0.5+0.2*sin(Pi/5*t): q3:=0.3-0.5*sin(Pi/6*t): q4:=0.2+0.3*sin(Pi/3*t): q5:=-0.4-0.3*sin(Pi/4*t): q6:=0.1+0.4*sin(Pi/5*t): q := [q1, q2, q3, q4, q5, q6]; -Biến (đầu ra bài toán thuận) unknow := [xE, yE, zE, rotx, roty, rotz]; 3.2. Cách giải - Tìm nghiệm đầu unknowinit qinit := evalf(subs(t = 0, q)); f0 := evalf(subs(t = 0, f)); unknow0 := solve(f0, unknow); assign(unknow0[10]); unknowinit := [xE, yE, zE, rotx, roty, rotz]; unassign('xE', 'yE', 'zE', 'rotx', 'roty', 'rotz'); -Dùng thuật giải NewtonRaphson để giải read "NewtonRS.txt"; L := 100: nghiemthuan := matrix(L, 6): nghiemthuan[1, 1] := unknowinit[1]: nghiemthuan[1, 2] := unknowinit[2]: nghiemthuan[1, 3] := unknowinit[3]: nghiemthuan[1, 4] := unknowinit[4]: nghiemthuan[1, 5] := unknowinit[5]: nghiemthuan[1, 6] := unknowinit[6]: for i from 1 to L-1 by 1 do Eqts := subs(t = VectorCalculus[`*`](.1, i), f): jaco := jacobian(f, unknow): y := Newton_Raphson(Eqts, jaco, unknow, unknowinit): nghiemthuan[i+1, 1] := evalf(y[1]): nghiemthuan[i+1, 2] := evalf(y[2]):
- nghiemthuan[i+1, 3] := evalf(y[3]): nghiemthuan[i+1, 4] := evalf(y[4]): nghiemthuan[i+1, 5] := evalf(y[5]): nghiemthuan[i+1, 6] := evalf(y[6]): end do: -Lưu kết quả bài toán thuận (lưu thành cột” xE yE zE rotx roty rotz”)vào file nghiembaitoanthuan.txt fh := fopen("nghiembaitoanthuan.txt", WRITE); writedata(fh, nghiemthuan, float); fclose(fh); -Đọc dữ liệu fh := fopen("nghiembaitoanthuan.txt", READ); vethuan := readdata(fh, float, 6); fclose(fh); -Lập tọa độ điểm tác động cuối theo thời gian t pointxE := [seq(0.1*i, vethuan[i, 1]], i = 1 .. 100)]: pointyE := [seq(0.1*i, vethuan[i, 2]], i = 1 .. 100)]: pointzE := [seq(0.1*i, vethuan[i, 3]], i = 1 .. 100)]: -Vẽ tọa độ điểm tác động cuối (thành phần tọa độ và tọa độ 3D) point1 := pointplot(pointxE, color = red, legend = "xE"); point2 := pointplot(pointyE, color = green, legend = "yE"); point3 := pointplot(pointzE, color = blue, legend = "zE"); display({point1, point2, point3});
- point3D := [seq([vethuan[i, 1], vethuan[i, 2], vethuan[i, 3]], i = 1 .. 100)]: pointplot3d(point3D, axes = normal):
- III. HƯỚNG DẪN TÍNH TOÁN TĨNH HỌC ROBOT BẰNG MAPLE 1.Khai báo thư viện sử dụng > restart; > with(linalg); > with(LinearAlgebra); 2.Khai báo ma trận DH Tổng quát > A := Matrix([[cos(theta), -sin(theta)*cos(alpha), sin(theta)*sin(alpha), a*cos(theta)], [sin(theta), cos(theta)*cos(alpha), -cos(theta)*sin(alpha), a*sin(theta)], [0, sin(alpha), cos(alpha), d], [0, 0, 0, 1]]); 3.Tính ma trận DH các khâu > A01 := subs({a = 0, d = d1, alpha = (1/2)*Pi, theta = q1}, A); > A12 := subs({a = a2, d = 0, alpha = 0, theta = q2}, A); > A23 := subs({a = a3, d = 0, alpha = 0, theta = q3}, A); > A02 := MatrixMatrixMultiply(A01, A12); > A03 := MatrixMatrixMultiply(A02, A23); 4.Tính ma trận R0i R01 := Matrix(3, 3); for i to 3 do for j to 3 do R01[i, j] := A01[i, j] end do end do; R02 := Matrix(3, 3); for i to 3 do for j to 3 do R02[i, j] := A02[i, j] end do end do; R03 := Matrix(3, 3); for i to 3 do for j to 3 do R03[i, j] := A03[i, j] end do end do; 5.Tính ma trận rii và rici rj := Vector([xj, yj, zj]); rsong := Matrix([[0, -zj, yj], [zj, 0, -xj], [-yj, xj, 0]]); r11 := subs({xj = 0, yj = -d1, zj = 0}, rj); r22 := subs({xj = -a2, yj = 0, zj = 0}, rj); r33 := subs({xj = -a3, yj = 0, zj = 0}, rj); rc11 := subs({xj = 0, yj = -(1/2)*d1, zj = 0}, rj); rc22 := subs({xj = -(1/2)*a2, yj = 0, zj = 0}, rj); rc33 := subs({xj = -(1/2)*a3, yj = 0, zj = 0}, rj); r1 := MatrixVectorMultiply(R01, r11); r2 := MatrixVectorMultiply(R02, r22); r3 := MatrixVectorMultiply(R03, r33); rc1 := MatrixVectorMultiply(R01, rc11); rc2 := MatrixVectorMultiply(R02, rc22); rc3 := MatrixVectorMultiply(R03, rc33); 6.Tính ma trận rii song và rici sóng r1song := subs({xj = r1(1, 1), yj = r1(2, 1), zj = r1(3, 1)}, rsong); r2song := subs({xj = r2(1, 1), yj = r2(2, 1), zj = r2(3, 1)}, rsong);
- r3song := subs({xj = r3(1, 1), yj = r3(2, 1), zj = r3(3, 1)}, rsong); rc1song := subs({xj = rc1(1, 1), yj = rc1(2, 1), zj = rc1(3, 1)}, rsong); rc2song := subs({xj = rc2(1, 1), yj = rc2(2, 1), zj = rc2(3, 1)}, rsong); rc3song := subs({xj = rc3(1, 1), yj = rc3(2, 1), zj = rc3(3, 1)}, rsong); 7.Các giá trị đầu vào F := Vector([Fx, Fy, Fz]); P1 := subs({Fx = 0, Fy = 0, Fz = -m1*g}, F); P2 := subs({Fx = 0, Fy = 0, Fz = -m2*g}, F); P3 := subs({Fx = 0, Fy = 0, Fz = -m3*g}, F); F43 := subs({Fx = fx, Fy = fy, Fz = fz}, F); M43 := subs({Fx = mx, Fy = my, Fz = mz}, F); 8.Tính lực tác dụng tại các khớp rô bốt F32 := F43-P3; M32 := M43-MatrixVectorMultiply(r3song, F32)-MatrixVectorMultiply(rc3song, P3); F21 := F32-P2; M21 := M32-MatrixVectorMultiply(r2song, F21)-MatrixVectorMultiply(rc2song, P2); F10 := F21-P1; M10 := M21-MatrixVectorMultiply(r1song, F10)-MatrixVectorMultiply(rc1song, P1); 9.Một trường hợp khảo sát cụ thể M10ve := subs({a2 = .7, a3 = .5, d1 = 1, fx = 50, fy = 70, fz = 90, g = 9.81, m1 = 5.5, m2 = 3.5, m3 = 1.5, mx = 50, my = 70, mz = 130, q1 = (1/2)*Pi*sin(Pi*t-(1/6)*Pi), q2 = (1/3)*Pi*cos(Pi*t+(1/3)*Pi), q3 = Pi+(1/4)*Pi*sin(Pi*t+(1/4)*Pi)}, M10); M21ve := subs({a2 = .7, a3 = .5, d1 = 1, fx = 50, fy = 70, fz = 90, g = 9.81, m1 = 5.5, m2 = 3.5, m3 = 1.5, mx = 50, my = 70, mz = 130, q1 = (1/2)*Pi*sin(Pi*t-(1/6)*Pi), q2 = (1/3)*Pi*cos(Pi*t+(1/3)*Pi), q3 = Pi+(1/4)*Pi*sin(Pi*t+(1/4)*Pi)}, M21); M32ve := subs({a2 = .7, a3 = .5, d1 = 1, fx = 50, fy = 70, fz = 90, g = 9.81, m1 = 5.5, m2 = 3.5, m3 = 1.5, mx = 50, my = 70, mz = 130, q1 = (1/2)*Pi*sin(Pi*t-(1/6)*Pi), q2 = (1/3)*Pi*cos(Pi*t+(1/3)*Pi), q3 = Pi+(1/4)*Pi*sin(Pi*t+(1/4)*Pi)}, M32); F10ve := subs({a2 = .7, a3 = .5, d1 = 1, fx = 50, fy = 70, fz = 90, g = 9.81, m1 = 5.5, m2 = 3.5, m3 = 1.5, mx = 50, my = 70, mz = 130, q1 = (1/2)*Pi*sin(Pi*t-(1/6)*Pi), q2 = (1/3)*Pi*cos(Pi*t+(1/3)*Pi), q3 = Pi+(1/4)*Pi*sin(Pi*t+(1/4)*Pi)}, F10); F21ve := subs({a2 = .7, a3 = .5, d1 = 1, fx = 50, fy = 70, fz = 90, g = 9.81, m1 = 5.5, m2 = 3.5, m3 = 1.5, mx = 50, my = 70, mz = 130, q1 = (1/2)*Pi*sin(Pi*t-(1/6)*Pi), q2 = (1/3)*Pi*cos(Pi*t+(1/3)*Pi), q3 = Pi+(1/4)*Pi*sin(Pi*t+(1/4)*Pi)}, F21); F32ve := subs({a2 = .7, a3 = .5, d1 = 1, fx = 50, fy = 70, fz = 90, g = 9.81, m1 = 5.5, m2 = 3.5, m3 = 1.5, mx = 50, my = 70, mz = 130, q1 = (1/2)*Pi*sin(Pi*t-(1/6)*Pi), q2 = (1/3)*Pi*cos(Pi*t+(1/3)*Pi), q3 = Pi+(1/4)*Pi*sin(Pi*t+(1/4)*Pi)}, F32); plot(M10ve, t = .1 .. 1); plot(M21ve, t = .1 .. 1); plot(M32ve, t = .1 .. 1); plot(F10ve, t = .1 .. 1);
- IV. VÍ DỤ VỀ TÍNH ĐỘNG LỰC HỌC ROBOT BẰNG MAPLE (3DOF) Sinh viên tham khảo luận văn về robot: https://www.dropbox.com/s/7pt18kmc7vo7jfb/Luan%20van%20master%20ve%20robot.rar R01 := Matrix(3, 3); for i to 3 do for j to 3 do R01[i, j] := A01[i, j] end do end do; R02 := Matrix(3, 3); for i to 3 do for j to 3 do R02[i, j] := A02[i, j] end do end do; R03 := Matrix(3, 3); for i to 3 do for j to 3 do R03[i, j] := A03[i, j] end do end do; R12 := Matrix(3, 3); for i to 3 do for j to 3 do R12[i, j] := A12[i, j] end do end do; R23 := Matrix(3, 3); for i to 3 do for j to 3 do R23[i, j] := A23[i, j] end do end do; rj := Vector([xj, yj, zj]); rsong := Matrix([[0, -zj, yj], [zj, 0, -xj], [-yj, xj, 0]]); p1c1 := subs({xj = -(1/2)*a1, yj = 0, zj = 0}, rj); p2c2 := subs({xj = -(1/2)*a2, yj = 0, zj = 0}, rj); p3c3 := subs({xj = 0, yj = 0, zj = -(1/2)*l}, rj); I11 := (1/12)*m1*a1^2*Matrix([[0, 0, 0], [0, 1, 0], [0, 0, 1]]); I22 := (1/12)*m2*a2^2*Matrix([[0, 0, 0], [0, 1, 0], [0, 0, 1]]); I33 := (1/12)*m3*l^2*Matrix([[1, 0, 0], [0, 1, 0], [0, 0, 0]]);
- I01 := multiply(R01, I11, transpose(R01)); I02 := multiply(R02, I22, transpose(R02)); I03 := multiply(R03, I33, transpose(R03)); p1c1TN := Matrix([[p1c1(1, 1)], [p1c1(2, 1)], [p1c1(3, 1)], [1]]); p2c2TN := Matrix([[p2c2(1, 1)], [p2c2(2, 1)], [p2c2(3, 1)], [1]]); p3c3TN := Matrix([[p3c3(1, 1)], [p3c3(2, 1)], [p3c3(3, 1)], [1]]); p01 := Matrix([[A01[1, 4]], [A01[2, 4]], [A01[3, 4]], [0]]); p02 := combine(Matrix([[A02[1, 4]], [A02[2, 4]], [A02[3, 4]], [0]])); p0c1saos := multiply(A01, p1c1TN); p0c2saos := combine(multiply(A02, p2c2TN)); p0c3saos := combine(multiply(A03, p3c3TN)); p1c2saos := evalm(p0c2saos-p01); p2c3saos := combine(evalm(p0c3saos-p02)); p1c3saos := evalm(p0c3saos-p01); assign(q1(t), q1); assign(q2(t), q2); assign(d3(t), d3); p0c1sao := Vector([p0c1saos[1, 1], p0c1saos[2, 1], p0c1saos[3, 1]]); p0c2sao := Vector([p0c2saos[1, 1], p0c2saos[2, 1], p0c2saos[3, 1]]); p0c3sao := Vector([p0c3saos[1, 1], p0c3saos[2, 1], p0c3saos[3, 1]]); jv1 := jacobian(p0c1sao, [q1, q2, d3]); jv2 := jacobian(p0c2sao, [q1, q2, d3]); jv3 := jacobian(p0c3sao, [q1, q2, d3]); unassign(q1(t)); unassign(q2(t)); unassign(d3(t)); omegasong01 := combine(multiply(map(diff, R01, t), transpose(R01))); omegasong02 := combine(multiply(map(diff, R02, t), transpose(R02))); omegasong03 := combine(multiply(map(diff, R03, t), transpose(R03))); omega1 := Vector([omegasong01[3, 2], omegasong01[1, 3], omegasong01[2, 1]]); omega2 := Vector([omegasong02[3, 2], omegasong02[1, 3], omegasong02[2, 1]]); omega3 := Vector([omegasong03[3, 2], omegasong03[1, 3], omegasong03[2, 1]]); omega1 := Vector([0, 0, q1c]); omega2 := Vector([0, 0, q1c+q2c]); omega3 := Vector([0, 0, q1c+q2c]);
- jomega1 := jacobian(omega1, [q1c, q2c, q3c]); jomega2 := jacobian(omega2, [q1c, q2c, q3c]); jomega3 := jacobian(omega3, [q1c, q2c, q3c]); M := evalm(combine(multiply(transpose(jv1)*m1, jv1)+multiply(transpose(jomega1), I01, jomega1)+multiply(transpose(jv2)*m2, jv2)+multiply(transpose(jomega2), I02, jomega2)+multiply(transpose(jv3)*m3, jv3)+multiply(transpose(jomega3), I03, jomega3))); V1 := 0; V2 := 0; V3 := 0; qch := Vector([qc1, qc2, 0]); for j to 3 do V1 := simplify(V1+ (diff(M[1, j], q1)-(1/2)*(diff(M[j, 1], q1)))*qch(1, 1)*qch(j, 1)+(diff(M[1, j], q2)- (1/2)*(diff(M[j, 2], q1)))*qch(j, 1)*qch(2, 1)+(diff(M[1, j], q3)-(1/2)*(diff(M[j, 3], q1)))*qch(j, 1)*qch(3, 1)); V2 := simplify(V2+(diff(M[2, j], q1)-(1/2)*(diff(M[j, 1], q2)))*qch(1, 1)*qch(j, 1)+(diff(M[2, j], q2)-(1/2)*(diff(M[j, 2], q2)))*qch(j, 1)*qch(2, 1)+(diff(M[2, j], q3)-(1/2)*(diff(M[j, 3], q2)))*qch(j, 1)*qch(3, 1)); V3 := simplify(V3+(diff(M[3, j], q1)-(1/2)*(diff(M[j, 1], q3)))*qch(1, 1)*qch(j, 1)+(diff(M[3, j], q2)-(1/2)*(diff(M[j, 2], q3)))*qch(j, 1)*qch(2, 1)+(diff(M[3, j], q3)-(1/2)*(diff(M[j, 3], q3)))*qch(j, 1)*qch(3, 1)) end do V. VÍ DỤ VỀ LẬP TRÌNH MÔ PHỎNG SỬ DỤNG KẾT QUẢ TÍNH TOÁN ĐỘNG HỌC MAPLE https://www.dropbox.com/s/u33n1fpw6b4m8g3/lap%20trinh%20mo%20phong.rar VI. VÍ DỤ VỀ TÍNH ĐỘNG HỌC RÔ BỐT 6 DOF BẰNG MAPLE https://www.dropbox.com/s/yhisd927800u9nw/Robot%206%20DOF.rar
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Ngân hàng câu hỏi môn học Robot công nghiệp
29 p | 1034 | 261
-
THIẾT KẾ ROBOT MINI TỰ HÀNH DÒ ĐƯỜNG TRONG MÊ CUNG
5 p | 830 | 188
-
Giáo trình kỹ thuật robot - Khoa công nghệ điện - Trường ĐH công nghiệp
148 p | 417 | 141
-
Thực hành chế tạo Robot điều khiển từ xa
135 p | 315 | 102
-
Lý thuyết robot song song P3
16 p | 220 | 75
-
Đề cương môn kỹ thuật Robot
7 p | 458 | 64
-
Lý thuyết robot song song P2
8 p | 208 | 58
-
Bài giảng Robot công nghiệp: Chương 4 - Nhữ Quý Thơ (ĐH Công nghiệp Hà Nội)
32 p | 204 | 55
-
Mô phỏng robot trên máy tính
11 p | 172 | 45
-
Ngân hàng câu hỏi môn Robot Công nghiệp
5 p | 168 | 32
-
Bài giảng Kỹ thuật Robot - Nguyễn Hoàng Long
120 p | 78 | 21
-
Sử dụng FPGA để xây dựng hệ điều khiển cho robot tự hành
4 p | 105 | 14
-
Hàm grundy và ứng dụng trong lý thuyết trò chơi.
6 p | 101 | 12
-
Nâng cao chất lượng điều khiển robot Scara 4 bậc tự do
6 p | 119 | 10
-
Điều khiển robot bầy đàn tránh vật cản và tìm kiếm mục tiêu
7 p | 63 | 8
-
Điều khiển bám quỹ đạo tay máy robot hai khâu T-R đàn hồi
3 p | 34 | 4
-
Khảo sát hệ luật của bộ điều khiển dựa trên đại số gia tử trong điều khiển robot di động
6 p | 9 | 2
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn