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
16 trang |
Chia sẻ: tranhoai21 | Lượt xem: 2329 | Lượt tải: 1
Bạn đang xem nội dung tài liệu Ứng dụng Maple trong tính toán rô bốt, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
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