Vì thời gian nghiên cứu còn hạn chế nên nhóm chỉ có thể hoàn thành hướng nghiên đến đây. Nếu còn thời gian và cơ hội để nghiên cứu và học tập, nhóm muốn thử nhiều phương pháp điều khiển hiện đại khác như điều khiển thích nghi, điều khiển bền vững, điều khiển trượt,…Để có thể so sánh, đánh giá tính ổn định mà các phương pháp đem lại khi
điều khiển mô hình. Từ đó có thể rút ra được nhiều kinh nghiệm cũng như kiến thức vững chắc về lý thuyết điều khiển hiện đại.
TÀI LIỆU THAM KHẢO
[1] NGUYỄN THỊ PHƯƠNG HÀ, HUỲNH THÁI HOÀNG. LÝ THUYẾT ĐIỀU KHIỂN TỰ ĐỘNG, NXB ĐHQG TP HCM, 2011.
[2] PGS.TS HUỲNH THÁI HOÀNG. BÀI GIẢNG LÝ THUYẾT ĐIỀU KHIỂN NÂNG CAO. ĐẠI HỌC BÁCH KHOA TP HCM.
[3] TS. DƯƠNG MIÊN KA. BÀI GIẢNG KỸ THUẬT ROBOT. ĐẠI HỌC CÔNG NGHIỆP TP HCM.
[4] ĐATADA – ĐHNL 30/10/2009 .
http://www2.hcmuaf.edu.vn/data/dtdanh/MapleV6.pdf
[5] HÁI NAM, CHƯƠNG 3. PHẦN MỀM LABVIEW.
https://www.academia.edu/7985901/CH%C6%AF%C6%A0NG_3_PH%E1%BA %A6N_M%E1%BB%80M_LABVIEW
[6] ĐỖ TRUNG HIẾU, CYBERLABJSC.
http://www.dientuvietnam.net/forums/forum/l%E1%BA%ADp- tr%C3%ACnh-v%C3%A0-m%C3%B4-ph%E1%BB%8Fng/matlab-labview- 20sim/189969-labview-t%E1%BB%B1-h%E1%BB%8Dc-labview [7] http://www.ni.com/en-vn.html [8] http://hnue.edu.vn/Portals/0/TeachingSubject/tungpk/d98ac0db-fdfa-4146- 861c-95a2b645fb12MHH---C2---Mo-hinh-hoa.pdf
[9] Rotary Double Inverted Pendulum - Laboratory Guide.pdf [10] Rotary Double Inverted Pendulum – Quick-Start-Guide.pdf [11] Rotaru Double Inverted Pendulum – User Manual.pdf
[12] PGS.TS. TRẦN ANH DŨNG, THS. NGUYỄN TIẾN DŨNG. NGHIÊN CỨU XÂY DỰNG HỆ THỐNG MÔ HÌNH CON LẮC NGƯỢC.
http://www.khcn.vimaru.edu.vn/sites/khcn.vimaru.edu.vn/files/nghien_cuu_xay_d ung_he_thong_dieu_khien_mo_hinh_con_lac_nguoc.pdf
[14] https://vi.wikipedia.org/wiki/Maple
[15] https://tailieu.vn/doc/ky-thuat-robot-chuong-3-cac-phep-bien-doi-thuan-nhat- 695346.html
PHỤ LỤC
A CHƯƠNG TRÌNH THÀNH LẬP BẢNG TÍNH MAPLE
a) Thiết lập dữ liệu
Để cài đặt các gói Quanser_Tools, sao chép hai tập tin quanser.ind và quanser.lib vào một thư mục của sự lựa chọn của bạn, ví dụ như: "C: \ Program Files \ Quanser \ Maple Repository"
Để sử dụng các gói Quanser_Tools trong một bảng tính Maple, thêm đường dẫn đến vị trí đĩa của nó đến Maple bởi lệnh libname . Ví dụ: điều này có thể đạt được bằng lệnh Maple sau:
libname: = "C: / Chương trình tập tin / Quanser / Kho lưu trữ Maple", libname:
b) Khởi tạo bảng tính
restart: interface( imaginaryunit = j ): with( LinearAlgebra ):
libname := "C:/Program Files/Quanser/Maple Repository", ".", libname: with( Quanser_Tools );
Order := 2: Np := 2:
q := [ theta(t), alpha(t), phi(t) ]; Nq := nops( q ): qd := map( diff, q, t ); Tính các ma trận chuyển đổi : T_0_1 := matrix(4,4,[ cos(q[1]),-sin(q[1]),0,L[r]*cos(q[1]), sin(q[1]),cos(q[1]),0,L[r]*sin(q[1]), 0,0,1,0, 0,0,0,1]); T_1_2 := matrix(4,4,[
1,0,0,0, 0,cos(q[2]),-sin(q[2]),-l[p1]*sin(q[2]), 0,sin(q[2]),cos(q[2]),l[p1]*cos(q[2]), 0,0,0,1]); T_1_h := matrix(4,4,[ 1,0,0,0, 0,cos(q[2]),-sin(q[2]),-L[p1]*sin(q[2]), 0,sin(q[2]),cos(q[2]),L[p1]*cos(q[2]), 0,0,0,1]); T_h_3 := matrix(4,4,[ 1,0,0,0, 0,cos(q[3]),-sin(q[3]),-l[p2]*sin(q[3]), 0,sin(q[3]),cos(q[3]),l[p2]*cos(q[3]), 0,0,0,1]); T_0_2 := evalm( T_0_1 &* T_1_2 ); T_0_h := evalm( T_0_1 &* T_1_h ); T_0_3 := evalm( T_0_h &* T_h_3 ); Vị trí cartesian: x[1] := T_0_1[1,4]; y[1] := T_0_1[2,4]; z[1] := T_0_1[3,4]; x[2] := T_0_2[1,4]; y[2] := T_0_2[2,4]; z[2] := T_0_2[3,4]; x[h] := T_0_h[1,4]; y[h] := T_0_h[2,4]; z[h] := T_0_h[3,4]; x[3] := T_0_3[1,4];
y[3] := T_0_3[2,4]; z[3] := T_0_3[3,4];
Đạo hàm vị trí ( vận tốc của cartesian ):
xd[1] := diff( x[1], t ); yd[1] := diff( y[1], t ); zd[1] := diff( z[1], t ); xd[2] := diff( x[2], t ); yd[2] := diff( y[2], t ); zd[2] := diff( z[2], t ); xd[h] := diff( x[h], t ); yd[h] := diff( y[h], t ); zd[h] := diff( z[h], t ); xd[3] := diff( x[3], t ); yd[3] := diff( y[3], t ); zd[3] := diff( z[3], t );
Biến không gian trạng thái:
subs_Xq := { seq( q[i] = X[i], i=1..Nq ) };
subs_Xqd := { seq( qd[i] = X[i+Nq], i=1..Nq ) }; #subs_U := { V[m] = U[1] }:
subs_U := { tau[m] = U[1] }: Nu := nops( subs_U ):
subs_Xqdd := { seq( diff( q[i], t$2 ) = Xd[i+Nq], i=1..Nq ) }; Xqdd := [ seq( Xd[i+Nq], i=1..Nq ) ];
subs_XUzero := { seq( X[i] = 0, i=1..2*Nq ), seq( U[i] = 0, i=1..Nu ) }: Nx := 2 * Nq:
Ny := Nq:
Tính động năng và thế năng của hệ thống :
V[e] := 0: V[g1] := potential_energy( 'gravity', m[p1], g, z[2] ); V[gh] := potential_energy( 'gravity', m[h], g, z[h] ); V[g2] := potential_energy( 'gravity', m[p2], g, z[3] ); V[g] := V[g1] + V[gh] + V[g2]: V[T] := V[g] + V[e]; Động năng: Tr[1] := kinetic_energy( 'rotation', J[r], qd[1] ); #Tr[2] := kinetic_energy( 'rotation', J[p1], qd[2] ); Tr[2] := 0; v[2] := n_norm( [ xd[2], yd[2], zd[2] ], 2 ): Tt[2] := kinetic_energy( 'translation', m[p1], v[2] ); v[h] := n_norm( [ xd[h], yd[h], zd[h] ], 2 ): Tt[h] := kinetic_energy( 'translation', m[h], v[h]); #Tr[3] := kinetic_energy( 'rotation', J[p2], qd[3] ); Tr[3] := 0; v[3] := n_norm( [ xd[3], yd[3], zd[3] ], 2 ): Tt[3] := kinetic_energy( 'translation', m[p2], v[3]); T[T] := Tr[1] + Tr[2] + Tr[3] + Tt[1] + Tt[2] + Tt[h] + Tt[3]; T[T] := collect( T[T], diff ): Các lực tổng quát: #B[r] := 0: #B[p1] := 0: #B[p2] := 0: Q[1] := tau[m] - B[r] * qd[1]; Q[2] := -B[p1] * qd[2]; Q[3] := -B[p2] * qd[3];
Q := [ seq( Q[i], i=1..Nq ) ];
Phương trình Euler-Lagrange:
EOM_orig := lagrange_equations( T[T], V[T], q, Q ):
EOM_orig := collect( EOM_orig, { seq( diff( q[i], t$2 ), i=1..Nq ), seq( diff( q[i], t ), i=1..Nq ), seq( q[i], i=1..Nq ) } ):
#EOM_states := subs( subs_Xqd, subs( subs_Xqdd, EOM_orig ) ): EOM_states_acc := subs( subs_Xqdd, EOM_orig ):
EOM_states_vel_acc := subs( subs_Xqd, EOM_states_acc ): EOM_states := subs( subs_Xq, subs_U, EOM_states_vel_acc ); EOM_ser := EOM_states:
for i from 1 to Nq do for k from 1 to Np do
EOM_ser[i] := subsop( 1 = convert( series( op( 1, EOM_ser[i] ), X[ k+1 ] ), polynom ), EOM_ser[i] );
end do:
EOM_ser[i] := simplify( EOM_ser[i] ); end do:
EOM_ser:
Fi := Matrix( Nq, Nq ): for i from 1 to Nq do for k from 1 to Nq do
Fi[ i, k ] := simplify( diff( op( 1, EOM_states[i] ), Xd[k+Nq] ) ); Fi[ i, k ] := collect( combine( Fi[ i, k ], trig ), cos );
end do; end do: 'F[i]' = Fi:
Fi_lin := Matrix( Nq, Nq ): for i from 1 to Nq do
for k from 1 to Nq do Fi_lin[ i, k ] := Fi[ i, k ];
Fi_lin[ i, k ] := convert( series( Fi_lin[ i, k ], X[ 2 ] ), polynom ); Fi_lin[ i, k ] := subs( subs_XUzero, Fi_lin[ i, k ] );
end do; end do:
'F_lin' = Fi_lin;
Giải phương trình Euler-Lagrange:
subs_Xq_rev := { seq( X[i] = q[i], i=1..Nq ) }:
subs_Xqd_rev := { seq( X[i+Nq] = qd[i], i=1..Nq ) }: #subs_U_rev := { U[1] = V[m] }:
subs_U_rev := { U[1] = tau[m] }:
eom_collect_list := { seq( diff( q[i], t ), i=1..Nq ), seq( q[i], i=1..Nq ), J[r], J[p1], J[p2] };
Giải pháp cho phương trình chuyển động phi tuyến tính:
#Xqdd_solset_nl := solve( convert( EOM_states, set ), convert( Xqdd, set ) ): #assign( Xqdd_solset_nl );
#for i from 1 to Nq do
# Xd_nl[i+Nq] := simplify( Xd[i+Nq] ): # unassign( 'Xd[i+Nq]' ):
#end do:
#for i from 1 to Nq do
# Xd_nl[i+Nq] := simplify( subs( subs_U_rev, subs_Xq_rev, subs_Xqd_rev, Xd_nl[i+Nq] ) #):
#end do:
#for i from 1 to Nq do
# diff( qd[i], t ) = collect( Xd_nl[i+Nq], eom_collect_list ); #end do:
Giải pháp cho EOM tuyến tính:
Xqdd_solset_ser := solve( convert( EOM_ser, set ), convert( Xqdd, set ) ): assign( Xqdd_solset_ser );
subs_avsq_list := { X[Nq+2]^2 = 0, X[Nq+3]^2 = 0 }: for i from 1 to Nq do
Xd[i+Nq] := subs( subs_avsq_list, Xd[i+Nq] ); end:
for i from 1 to Nq do
diff( qd[i], t ) = collect( subs( subs_U_rev, subs_Xq_rev, subs_Xqd_rev, Xd[i+Nq] ), eom_collect_list );
end do:
A_ss := Matrix( Nx, Nx ):
A_ss := deriveA( Xqdd, A_ss, Nq, subs_XUzero ): 'A' = A_ss; B_ss := Matrix( Nx, Nu ): B_ss := deriveB( Xqdd, B_ss, Nq, subs_XUzero ): 'B' = B_ss; C_ss := IdentityMatrix( Nx, Nx ): 'C' = C_ss; D_ss := Matrix( Nx, Nu, 0 ): 'D' = D_ss;
B MÔ PHỎNG BẰNG MATLAB a) Mô phỏng LQR với nhiễu
Tạo file.m với các trận không gian trạng thái A, B, C1, D1.
Mô phỏng LQR có nhiễu bằng Simulink.
Hình B-1 Tạo file.m cho LQR
Kết quả mô phỏng:
Nhận xét: Khi có nhiễu ta thấy nhiễu ảnh hưởng đến điện áp điều khiển, do đó tín hiệu điều khiển điện áp không còn tốt nữa. Vị trí góc theta cũng bị dao động theo, ảnh hưởng đến quá trình điều khiển cân bằng.
b) Mô phỏng LQG bằng matlab
Tạo file.m để nhập các dữ liệu a, b C2, D2, G1, Qn1, Rnn.
Với a, b, C2, D2 là các ma trận không gian trạng thái, G1 là ma trận đơn vị, Qn1 và Rnn là nhiễu hệ thống và nhiễu các góc đo.
Đặt thời gian mô phỏng là 100s, với chu kì T = 50s, với biên độ góc theta là sóng vuông có giá trị là 30.
Kết quả mô phỏng LQG
Hình B-5 Sơ đồ khối Simulink cho LQG
HÌNH ẢNH VỀ THÍ NGHIỆM LABVIEW
c) Các hình ảnh mô phỏng LQR có nhiễu
Chương trình mô phỏng LQG:
Hình B-10 Chương trình mô phỏng LQG bằng labview
Kết quả mô phỏng LQG:
Chương trình điều khiển thực LQG
LỜI CẢM ƠN
Khóa luận được hoàn thành tại Trường Đại Học Công Nghiệp TPHCM . Trong quá trình làm khóa luận tốt nghiệp chúng em đã nhận được rất nhiều sự giúp đỡ để hoàn tất khóa luận.
Trước tiên nhóm xin gửi lời cảm ơn chân thành cô Bùi Thị Cẩm Quỳnh đã tận tình hướng dẫn, truyền đạt kiến thức, kinh nghiệm cho nhóm nghiên cứu trong suốt quá trình thực hiện khóa luận tốt nghiệp này.
Xin gửi lời cảm ơn đến quý thầy cô Khoa Công Nghệ Điện, Trường Đại Học Công Nghiệp TPHCM, những người đã truyền đạt kiến thức quý báu cho chúng em suốt trong thời gian học tập vừa qua.
Sau cùng xin gửi lời cảm ơn đến gia đình, bạn bè và các bạn sinh viên lớp DHDKTD11A đã luôn động viên, giúp đỡ chúng em trong quá trình làm khóa luận.
Một lần nữa, xin chân thành cảm ơn!
Gò Vấp, ngày …. tháng ….năm .…