Để có thể tạo ra được bộ lọc Kalman, ta cần sử dụng vector X có 7 thành phần.
X = [ α α ]
Tìm ma trận L bằng phương pháp thử sai.
Nếu giá trị của ma trận L là khơng chính xác sẽ dẫn đến mất ổn định và không thể điều khiển được.
Vì chỉ có thể dị ma trận Q và R , G là ma trận đơn vị. Nên khi dị ta chỉ có thể thay đổi Q và R như sau:
Khi Q > R , ta nhận được ma trận L có thể điều khiển được nhưng độ dao động của điện áp lớn, đường chéo chính của ma trận L là lớn (Điều này được ghi lại khi thí nghiệm với Q =3.4E – 5 và R =1E – 10). Đường chéo của ma trận được ghi lại là [580 530 570 630 680 680 580].
Khi Q < R , ta thấy độ dao động của điện áp đã được loại bỏ, nhưng hệ thống không thể điều khiển được. Vì giá trị đường chéo chính thay đổi, nhỏ đi rất nhiều.
Để có thể điều khiển được mà có thể loại bỏ được dao động biên độ điện áp.
Ta chọn L với các giá trị của đường chéo chính lớn [200 150 190 250 300 300 200], giá trị này được lấy theo quy luật tìm được ở thí nghiệm trên và sau nhiều lần thử sai. Các giá trị cịn lại (khác đường chéo chính) của ma trận L tương ứng với trường hợp độ nhiễu
Q = 1E-16 và R = 1E-5 (khi L ở giá trị này thì độ nhiễu lọc tốt).
Tiến hành điều khiển thực với ma trận L được chọn. Chương trình điều khiển:
Kết quả:
4.4.1 Nhận xét và đánh giá:
Khi có bộ lọc Kalman ta thấy điện áp điều khiển đã được lọc nhiễu đi khá tốt, điện áp điều khiển cũng ổn định hơn. Góc vị trí theta cũng ổn định hơn khi chỉ điều khiển với LQR. Độ dao động và biên độ dao động của điện áp và góc theta tốt hơn khá nhiều.
4.4.2 Hướng phát triển:
Vì thời gian nghiên cứu cịn hạn chế nên nhóm chỉ có thể hồ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 : Thế nă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 q 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 vng 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 hồn thành tại Trường Đại Học Cơng Nghiệp TPHCM . Trong q 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 đỡ để hồ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 q 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 đã ln động viên, giúp đỡ chúng em trong q 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 .…