1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| M = 0.5; m = 0.2; b = 0.1; I = 0.006; g = 9.8; l = 0.3; den = I*(M+m)+M*m*l^2; A = [0, 1, 0, 0; 0, -(I+m*l^2)*b/den, -(m^2*g*l^2)/den, 0; 0, 0, 0, 1; 0, (m*l*b)/den, m*g*l*(M+m)/den, 0]; B = [ 0; (I+m*l^2)/den; 0; -m*l/den]; C = [1, 0, 0, 0; 0, 0, 1, 0]; D = [0; 0]; sys_open = ss(A, B, C, D);
co = ctrb(sys_open); controllability = rank(co); ob = obsv(sys_open); observability = rank(ob);
poles = [-5; -10; -5+10j; -5-10j]; K = place(A, B, poles); poles = [-7; -8; -9; -10]; L = place(A', C', poles)';
Aco = [A-B*K, B*K; zeros(size(A)), A-L*C]; Bco = [B; zeros(size(B))]; Cco = [C, zeros(size(C))]; Dco = 0; sys_co = ss(Aco, Bco, Cco, Dco); t = 0:0.01:2;
x0 = [-0.2; 0; 0.1; 0]; e0 = -x0; xe0 = [x0; e0];
rss = 0.1/(-0.0071); r = rss*ones(size(t));
[y, t, xe] = lsim(sys_co, r, t, xe0);
figure(1); plot(t, y(:, 1:2), 'LineWidth', 1.5); grid on legend('Cart position (m)', 'Pendulum angle (rad)'); title('Step Response with Observer Feedback Control') figure(2); plot(t, xe(:, 5:8), 'LineWidth', 1.5); grid on title('State Estimate Error')
|