在本教程中,我們將展示如何使用狀態空間(或時域)的方法設計控制器和觀測器。
本教程中使用的主要MATLAB命令爲:eig,ss,lsim,place,acker。
形式
有幾種不同的方法來描述線性微分方程組,在"控制教程 —— 介紹篇:1.建模"部分中介紹了狀態空間描述。對於SISO LTI系統,狀態空間形式如下:
其中 表示系統狀態變量的 n x 1 向量,表示輸入的量,表示輸出的量。矩陣 (n x n), (n x 1) 和 (1 x n) 確定狀態變量與輸入和輸出之間的關係。一共有 n 個一階微分方程。狀態空間描述形式也可以用於具有多輸入和多輸出(MIMO)的系統,這裏主要關注單輸入單輸出(SISO)系統。
爲了介紹狀態空間控制設計方法,我們將以磁懸浮球爲例。流過線圈的電流回產生磁力,該磁力可以平衡重力,並使球(由磁性材料製成)懸浮在空中。該系統的建模已在許多控制教科書中描述(包括B.C.Kuo撰寫的《Automatic Control Systems》,第七版)。
補充參考建模方法:
也可以參考:傳送門
其中 是球的垂直位置, 是通過電磁鐵的電流, 是施加的電壓, 是球的質量, 是重力加速度, 是電感, 是電阻, 是施加在球上的磁力系統。爲簡單起見,我們將選擇 ,,,,,當 (此時 )時,系統處於平衡狀態(球懸浮在空中),如 時,電流約爲 ,這樣可以的到狀態方程
其中
是系統狀態變量的集合(3x1向量), 是輸入電壓,與平衡位置的偏差爲,是輸出高度,與平衡位置的偏差爲,可以建立個係數:
A = [ 0 1 0
980 0 -2.8
0 0 -100 ];
B = [ 0
0
100 ];
C = [ 1 0 0 ];
穩定性
我們要做的第一件事就是分析開環系統(沒有任何控制的情況下)的穩定性。如控制教程 —— 介紹篇:2.系統分析介紹的,根據系統矩陣 的特徵值(等於傳遞函數的極點)來確定穩定性。 矩陣的特徵值是關於 的解。
poles = eig(A)
從結果可以看出,有一個極點在右半平面,這意味着開環系統不穩定。
要觀察初始狀態爲非零時,該不穩定系統的表現,可以運行一下命令:
t = 0:0.01:2;
u = zeros(size(t));
x0 = [0.01 0 0];
sys = ss(A,B,C,0);
[y,t,x] = lsim(sys,u,t,x0);
plot(t,y)
title('Open-Loop Response to Non-Zero Initial Condition')
xlabel('Time (sec)')
ylabel('Ball Position (m)')
從圖中可以看出球與電磁鐵之間的距離回達到無窮大,但一般會掉落到桌子或者地板上。
可控性和可觀性
如果始終存在一個控制輸入 ,該輸入可以在有限時間內將系統的任何狀態轉換爲任何其他狀態,則該系統是可控的。可以證明,當且僅當LTI系統的可控矩陣 具有滿秩時(例如 rank(),n 是狀態變量個數)。可以使用命令rank(ctrb(A,B))
或rank(ctrb(sys))
。
當系統存在無法直接測量狀態時,必須使用可用的系統輸出來估計未知部分的狀態值。如果能基於系統輸入 和系統輸出 的信息確定初始狀態 ,那麼在一定的時間間隔 系統可觀測。對於LTI系統,當且僅當可觀測矩陣 滿秩(例如 rank(,n 是狀態變量個數),則系統可觀測。LTI模型的可觀測性可以在MATLAB使用命令rank(obsv(A,C))
或者rank(obsv(sys))
確定。
可控性和可觀性是雙重概念,當且僅當系統 是可觀測的,系統 纔是可控的。例如下面我們將看到的
使用極點配置設計控制器
使用極點配置來構建一個控制器,全狀態反饋系統的示意圖如下所示,所謂全狀態,是指控制器始終知道多有狀態變量。對於上面的系統,我們需要一個傳感器來測量球的位置,另一個傳感器來測量球的速度,還需要一個傳感器來測量電磁鐵中的電流。
爲了簡單,假設參考給定爲0, = 0,則輸入爲
此時,閉環反饋系統的狀態空間方程爲:
閉環反饋系統的穩定性和時域特性主要取決於矩陣特徵值()的位置,該特徵值等於閉環極點。由於矩陣 和 均爲 3x3,因此係統將有3個極點。通過選擇適當的狀態反饋增益矩陣 ,我們可以將這些閉環極點放置在我們想要的任何位置(因爲系統是可控的)。我們可以使用MATLAB的place
命令來根據閉環極點找到狀態反饋增益 。
在嘗試該方法之前,我們必須確定要在哪裏放置閉環極點。假設控制器的標準是穩定時間<0.5s,超調<5%,那麼我們可以嘗試將兩個主導極點放置在 -10±10i (在 = 0.7 或 45 度下,有 = 10 > 4.6*2)。我們可以將第三個極點放在 -50處 (這樣它不會對響應產生太大的影響),我們可以稍後根據閉環行爲的結果來調整它。輸入如下命令
p1 = -10 + 10i;
p2 = -10 - 10i;
p3 = -50;
K = place(A,B,[p1 p2 p3]);
sys_cl = ss(A-B*K,B,C,0);
lsim(sys_cl,u,t,x0);
xlabel('Time (sec)')
ylabel('Ball Position (m)')
可以看到超調量太大(傳遞函數中存在零點,這將增加超調量,在狀態空間中看不出明確的零點)。這裏,嘗試將兩個極點移至更左側,以查看瞬態響應是否有改善。
p1 = -20 + 20i;
p2 = -20 - 20i;
p3 = -100;
K = place(A,B,[p1 p2 p3]);
sys_cl = ss(A-B*K,B,C,0);
lsim(sys_cl,u,t,x0);
xlabel('Time (sec)')
ylabel('Ball Position (m)')
這次過沖減小,比較兩中情況下所需的控制量 (),通常,將極點移動到越遠,所需的控制量越大。
注意,如果要在同一個位置放置兩個或多個極點,則place
將失效,您可以使用名爲acker
函數,該函數可以實現相同的目標。
K = acker(A,B,[p1 p2 p3])
介紹參考給定
現在,我們將採用定義的控制系統並應用一個輸入步長(我們爲步長選擇一個較小的值,因此可以在有效範圍內保持線性化)。
t = 0:0.01:2;
u = 0.001*ones(size(t));
sys_cl = ss(A-B*K,B,C,0);
lsim(sys_cl,u,t);
xlabel('Time (sec)')
ylabel('Ball Position (m)')
axis([0 2 -4E-6 0])
系統根本無法很好地跟蹤,並且球的位置是負值而不是正。
回顧之前的示意圖,我們沒有將輸入和參考輸入進行比較;相反,我們測量所有狀態,乘以增益矢量 ,然後從參考給定中減去該結果。這樣不會使期望 。爲了消除該問題,我們可以縮放參考輸入,使其在穩態下等於 。下圖顯示了比例因子 。
我們可以在MATLAB中使用rscale
來計算 (將以下命令放在K=…之後),該功能在新的版本MATLAB中已經沒有,可以從這裏下載。並保存在工作空間運行。
Nbar = rscale(sys,K)
lsim(sys_cl,Nbar*u,t)
title('Linear Simulation Results (with Nbar)')
xlabel('Time (sec)')
ylabel('Ball Position (m)')
axis([0 2 0 1.2*10^-3])
現在階躍響應可以很好地跟蹤指令了。
觀測器設計
當我們無法測量所有狀態變量 時,我們可以構建一個觀測器來估計它們,並僅測量輸出 ,對於懸浮球示例,我們將向系統添加三個新的估計狀態變量 。
觀測器基本上是被控對象的複製,它具有相同的輸入和幾乎相同的微分方程,一個額外的項將實際測量的輸出 與估計的輸出 進行比較;這將有助於校正估計狀態 ,並使它接近實際狀態 的值(如果測量結果的誤差很小)。
觀測器的誤差表現由 的極點決定。
首先,我們需要選擇觀測器增益 ,由於我們希望觀測器的動力學比系統本身快得多,因此我們需要將極點放置在距離系統主極點左側至少5倍的位置。如果要使用place
,則需要將三個觀測極點放在不同位置。
op1 = -100;
op2 = -101;
op3 = -102;
由於可控性和可觀性之間的對偶性,我們可以使用相同的技術來找到可控性矩陣,方法是將矩陣 替換成矩陣 ,然後對每個矩陣進行轉置
L = place(A',C',[op1 op2 op3])';
給出上面框圖中的方程式,用於估算 ,並引入。我們將估計狀態用於反饋 ,因此並非所有狀態變量都需要測量。
At = [ A-B*K B*K
zeros(size(A)) A-L*C ];
Bt = [ B*Nbar
zeros(size(B)) ];
Ct = [ C zeros(size(C)) ];
首先,查看當參考輸入爲零的系統響應,
sys = ss(At,Bt,Ct,0);
lsim(sys,zeros(size(t)),t,[x0 x0]);
title('Linear Simulation Results (with observer)')
xlabel('Time (sec)')
ylabel('Ball Position (m)')
當通過 和 來獲得 時,
t = 0:1E-6:0.1;
x0 = [0.01 0.5 -5];
[y,t,x] = lsim(sys,zeros(size(t)),t,[x0 x0]);
n = 3;
e = x(:,n+1:end);
x = x(:,1:n);
x_est = x - e;
% Save state variables explicitly to aid in plotting
h = x(:,1); h_dot = x(:,2); i = x(:,3);
h_est = x_est(:,1); h_dot_est = x_est(:,2); i_est = x_est(:,3);
plot(t,h,'-r',t,h_est,':r',t,h_dot,'-b',t,h_dot_est,':b',t,i,'-g',t,i_est,':g')
legend('h','h_{est}','hdot','hdot_{est}','i','i_{est}')
xlabel('Time (sec)')
從上面我們可以看到,觀測器的估計迅速收斂到實際狀態變量,並在穩態下很好地跟蹤狀態變量。