控制教程 —— 介紹篇:6.狀態空間控制器設計

在本教程中,我們將展示如何使用狀態空間(或時域)的方法設計控制器和觀測器。
本教程中使用的主要MATLAB命令爲:eigsslsimplaceacker

形式

有幾種不同的方法來描述線性微分方程組,在"控制教程 —— 介紹篇:1.建模"部分中介紹了狀態空間描述。對於SISO LTI系統,狀態空間形式如下:
dxdt=Ax+Bu \frac{d\mathbf{x}}{dt} = A\mathbf{x} + Bu y=Cx+Du y = C\mathbf{x} + Du 其中 x\mathbf{x}表示系統狀態變量的 n x 1 向量,uu表示輸入的量,yy表示輸出的量。矩陣 AA (n x n),BB (n x 1) 和 CC (1 x n) 確定狀態變量與輸入和輸出之間的關係。一共有 n 個一階微分方程。狀態空間描述形式也可以用於具有多輸入和多輸出(MIMO)的系統,這裏主要關注單輸入單輸出(SISO)系統。
爲了介紹狀態空間控制設計方法,我們將以磁懸浮球爲例。流過線圈的電流回產生磁力,該磁力可以平衡重力,並使球(由磁性材料製成)懸浮在空中。該系統的建模已在許多控制教科書中描述(包括B.C.Kuo撰寫的《Automatic Control Systems》,第七版)。
在這裏插入圖片描述
補充參考建模方法:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
也可以參考:傳送門
其中 hh 是球的垂直位置,ii 是通過電磁鐵的電流,VV 是施加的電壓,mm 是球的質量,gg 是重力加速度,LL 是電感,RR 是電阻,KK 是施加在球上的磁力系統。爲簡單起見,我們將選擇 m=0.05kgm=0.05kgK=0.0001K=0.0001L=0.01HL=0.01HR=1ΩR=1\Omegag=9.8m/s2g=9.8m/s^2,當 h=Ki2/mgh=Ki^2/mg (此時 dh/dt=0dh/dt = 0)時,系統處於平衡狀態(球懸浮在空中),如h=0.01mh=0.01m 時,電流約爲 7A7A,這樣可以的到狀態方程
dxdt=Ax+Bu \frac{d\mathbf{x}}{dt} = A\mathbf{x} + Bu y=Cx+Du y = C\mathbf{x} + Du 其中
x=[ΔhΔh˙Δi] x = \left[{\begin{array}{c} \Delta h \\ \Delta \dot{h} \\ \Delta i \end{array}}\right] 是系統狀態變量的集合(3x1向量),uu 是輸入電壓,與平衡位置的偏差爲ΔV\Delta Vyy是輸出高度,與平衡位置的偏差爲Δh\Delta h,可以建立個係數:

A = [ 0   1   0
     980  0  -2.8
      0   0  -100 ];

B = [ 0
      0
      100 ];

C = [ 1 0 0 ];

穩定性

我們要做的第一件事就是分析開環系統(沒有任何控制的情況下)的穩定性。如控制教程 —— 介紹篇:2.系統分析介紹的,根據系統矩陣 AA 的特徵值(等於傳遞函數的極點)來確定穩定性。 AA 矩陣的特徵值是det(sIA)=0\det(sI-A)=0關於 ss 的解。

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)')

在這裏插入圖片描述
從圖中可以看出球與電磁鐵之間的距離回達到無窮大,但一般會掉落到桌子或者地板上。

可控性和可觀性

如果始終存在一個控制輸入 u(t)u(t),該輸入可以在有限時間內將系統的任何狀態轉換爲任何其他狀態,則該系統是可控的。可以證明,當且僅當LTI系統的可控矩陣 C\mathcal{C} 具有滿秩時(例如 rank(C=n\mathcal{C}=n),n 是狀態變量個數)。可以使用命令rank(ctrb(A,B))rank(ctrb(sys))
C=[B AB A2B  An1B] \mathcal{C} = [B\ AB\ A^2B\ \cdots \ A^{n-1}B] 當系統存在無法直接測量狀態時,必須使用可用的系統輸出來估計未知部分的狀態值。如果能基於系統輸入 u(t)u(t) 和系統輸出 y(t)y(t) 的信息確定初始狀態 x(t0)x(t_0),那麼在一定的時間間隔 t0<t<tft_0<t<t_f 系統可觀測。對於LTI系統,當且僅當可觀測矩陣 O\mathcal{O} 滿秩(例如 rank(O)=n\mathcal{O})=n,n 是狀態變量個數),則系統可觀測。LTI模型的可觀測性可以在MATLAB使用命令rank(obsv(A,C))或者rank(obsv(sys))確定。
O=[CCACA2CAn1] \mathcal{O} = \left[ \begin{array}{c} C \\ CA \\ CA^2 \\ \vdots \\ CA^{n-1} \end{array} \right] 可控性和可觀性是雙重概念,當且僅當系統 (A,B)(A',B') 是可觀測的,系統 (A,B)(A,B) 纔是可控的。例如下面我們將看到的

使用極點配置設計控制器

使用極點配置來構建一個控制器,全狀態反饋系統的示意圖如下所示,所謂全狀態,是指控制器始終知道多有狀態變量。對於上面的系統,我們需要一個傳感器來測量球的位置,另一個傳感器來測量球的速度,還需要一個傳感器來測量電磁鐵中的電流。
在這裏插入圖片描述
爲了簡單,假設參考給定爲0,rr = 0,則輸入爲
u=Kx u = -K\mathbf{x} 此時,閉環反饋系統的狀態空間方程爲:
x˙=Ax+B(Kx)=(ABK)x \dot{\mathbf{x}} = A\mathbf{x} + B(-K\mathbf{x}) = (A-BK)\mathbf{x} y=Cx y = C\mathbf{x} 閉環反饋系統的穩定性和時域特性主要取決於矩陣特徵值(ABKA-BK)的位置,該特徵值等於閉環極點。由於矩陣 AABB 均爲 3x3,因此係統將有3個極點。通過選擇適當的狀態反饋增益矩陣 KK,我們可以將這些閉環極點放置在我們想要的任何位置(因爲系統是可控的)。我們可以使用MATLAB的place命令來根據閉環極點找到狀態反饋增益 KK
在嘗試該方法之前,我們必須確定要在哪裏放置閉環極點。假設控制器的標準是穩定時間<0.5s,超調<5%,那麼我們可以嘗試將兩個主導極點放置在 -10±10i (在 ζ\zeta = 0.7 或 45 度下,有 σ\sigma = 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)')

在這裏插入圖片描述
這次過沖減小,比較兩中情況下所需的控制量 (uu),通常,將極點移動到越遠,所需的控制量越大。
注意,如果要在同一個位置放置兩個或多個極點,則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])

在這裏插入圖片描述
系統根本無法很好地跟蹤,並且球的位置是負值而不是正。
回顧之前的示意圖,我們沒有將輸入和參考輸入進行比較;相反,我們測量所有狀態,乘以增益矢量 KK,然後從參考給定中減去該結果。這樣不會使期望 KxK\mathbf{x}。爲了消除該問題,我們可以縮放參考輸入,使其在穩態下等於 KxK\mathbf{x}。下圖顯示了比例因子 N\overline{N}
在這裏插入圖片描述
我們可以在MATLAB中使用rscale來計算 N\overline{N}(將以下命令放在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])

在這裏插入圖片描述
現在階躍響應可以很好地跟蹤指令了。

觀測器設計

當我們無法測量所有狀態變量 x\mathbf{x} 時,我們可以構建一個觀測器來估計它們,並僅測量輸出 y=Cxy=C\mathbf{x},對於懸浮球示例,我們將向系統添加三個新的估計狀態變量 x^\hat{\mathbf{x}}
在這裏插入圖片描述
觀測器基本上是被控對象的複製,它具有相同的輸入和幾乎相同的微分方程,一個額外的項將實際測量的輸出 yy 與估計的輸出 y^=Cx^\hat{y} = C\hat{\mathbf{x}} 進行比較;這將有助於校正估計狀態 x^\hat{\mathbf{x}} ,並使它接近實際狀態 x\mathbf{x} 的值(如果測量結果的誤差很小)。
x^˙=Ax^+Bu+L(yy^) \dot{\hat{\mathbf{x}}} = A\hat{\mathbf{x}} + Bu + L(y - \hat{y}) y^=Cx^ \hat{y} = C\hat{\mathbf{x}} 觀測器的誤差表現由 ALCA-LC的極點決定。
e˙=x˙x^˙=(ALC)e \dot{\mathbf{e}} = \dot{\mathbf{x}} - \dot{\hat{\mathbf{x}}} = (A - LC)\mathbf{e} 首先,我們需要選擇觀測器增益 LL,由於我們希望觀測器的動力學比系統本身快得多,因此我們需要將極點放置在距離系統主極點左側至少5倍的位置。如果要使用place,則需要將三個觀測極點放在不同位置。

op1 = -100;
op2 = -101;
op3 = -102;

由於可控性和可觀性之間的對偶性,我們可以使用相同的技術來找到可控性矩陣,方法是將矩陣 BB 替換成矩陣 CC ,然後對每個矩陣進行轉置

L = place(A',C',[op1 op2 op3])';

給出上面框圖中的方程式,用於估算 x^\hat{\mathbf{x}},並引入e=xx^\mathbf{e}=\mathbf{x}-\hat{\mathbf{x}}。我們將估計狀態用於反饋 u=Kx^u=-K\hat{\mathbf{x}},因此並非所有狀態變量都需要測量。

At = [ A-B*K             B*K
       zeros(size(A))    A-L*C ];

Bt = [    B*Nbar
       zeros(size(B)) ];

Ct = [ C    zeros(size(C)) ];

首先,查看當參考輸入爲零的系統響應,e=x\mathbf{e}=\mathbf{x}

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)')

在這裏插入圖片描述
當通過 x\mathbf{x}e\mathbf{e} 來獲得 x^\hat{\mathbf{x}} 時,x^=xe\hat{\mathbf{x}} = \mathbf{x} - \mathbf{e}

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)')

在這裏插入圖片描述
從上面我們可以看到,觀測器的估計迅速收斂到實際狀態變量,並在穩態下很好地跟蹤狀態變量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章