Designing an Observer - Control System
37 ビュー (過去 30 日間)
古いコメントを表示
Hi,
I am trying to design an observer for my feedback control system. I am getting the below error message, although my system is controllable:
Error using place (line 171)
The "place" command could not place the poles at the
specified locations. Probable causes include:
* (A,B) is nearly uncontrollable
* The specified locations are too close to each other.
Error in n9989480_Assignment_2 (line 95)
L = place(Aa', Ca', Obs_pa)';
Warning: Achieved pole locations differ by more than 10
percent from specified locations.
For reference, here is my code:
%% Define State Space Matrices
% Linearised model about equilibrium A
Aa = [-0.00643 0.0263 0 -32.2 0;
-0.0941 -0.624 830 0 0;
-0.000222 -0.00153 -0.668 0 0;
0 0 1 0 0;
0 -1 0 830 0];
Ba = [0;
-32.7;
-2.08;
0;
0];
Ca = [0 0 0 0 1]; % Position of the aircraft
Da = 0;
sys = ss(Aa,Ba,Ca,Da); % State Space Model
equilibrium_A = [0 0 0 0 0]'; % Equilibrium Point A
init_cont = [0.2 20*pi/180 0 0 0]'; %Initial condition
%% Check controllability of the linearised system
Control = ctrb(Aa,Ba);
rank_control = rank(Control)
uncont = length(Aa) - rank(Control);
if rank_control ~= length(Ba)
error('System is not controllable.')
else
fprintf('System is controllable\n')
end
%% Check observability of the linearised system
Observable = obsv(Aa,Ca);
rank_observe = rank(Observable)
unobs = length(Aa)-rank(Observable);
if rank_observe ~= length(Ca)
error('System is not observable.')
else
fprintf('System is observable\n')
end
%% Controller Design from Linear Quadratic Regulation
% Assume the reference is zero
pa = 50; %weighting factor
Qa = pa*Ca'*Ca; %state-cost matrix
Ra = 1; %control weighted matrix
[Ka] = lqr(Aa,Ba,Qa,Ra)
closed_loop = ss(Aa-Ba*Ka, Ba, Ca, Da);
step(0.2*closed_loop)
ylabel('pitch angle (rad)');
title('Closed-Loop Step Response');
%% Oberserver Design
% Desired Closed-Loop Poles
Obs_pa = [-100 -120 -140 -160 -180];
L = place(Aa', Ca', Obs_pa)';
Can someone please explain to me where I am going wrong in my code?
Thank you
0 件のコメント
回答 (2 件)
Sam Chak
2022 年 5 月 27 日
It's a 5th-order system and by choosing relatively large poles (almost 10,000 times), the computation becomes numerically sensitive and resulting in very very very large observer gains.
No issue with these poles:
Obs_pa = [-1 -1.2 -1.4 -1.6 -1.8];
L = place(Aa', Ca', Obs_pa)'
eig(Aa - L*Ca)
0 件のコメント
Paul
2022 年 5 月 27 日
I don't think you're going wrong anywhere (though you might want use size(Aa,1) instead of length(Ca) in a few places). I think the issue is just that the desired observer pole locations are so far out in the LHP they are very difficult for place() to achieve. If those observer pole lociations are absolutely required, they might be very difficult to achieve in double precision.
0 件のコメント
参考
カテゴリ
Help Center および File Exchange で Classical Control Design についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!