文章是对现代控制理论控制器设计以及状态观测器设计部分的总结,面向对象是有一定基础现代控制基础的读者,偏重现在控制理论在配合matlab的应用,其中涉及到一些推导过程是为了给自己做笔记用的。
对于开环系统有: x ˙ = A x \dot{x}= Ax x˙=Ax
对于闭环系统有: x ˙ = A x + B u \dot{x} = Ax+Bu x˙=Ax+Bu ; 其中 u = − K x u = - Kx u=−Kx
因为系统的输入,状态变化都跟系统的状态有关了,因此,系统的闭环的。
然后有 x ˙ = ( A − B K ) x = A c x \dot{x} = (A-BK)x= A_cx x˙=(A−BK)x=Acx.根据 ∣ A − B K ∣ \begin{vmatrix}A−BK\end{vmatrix} ∣∣A−BK∣∣根据不同的 k k k向量可以得到不同的特征值 λ \lambda λ,即系统的特征根,选择合适的 K K K矩阵达到任意配置极点的目的(系统完全能控,输入u不受限)。选择不同的 λ \lambda λ,改变Ac的特征值,就相当于改变系统的变化路径。根据需求设置不同的 λ \lambda λ可以求得对应的反馈矩阵 K K K.
使用matlab函数 K = a c k e r ( A , B , J ) K = acker(A,B,J) K=acker(A,B,J) 可以非常方便地求得状态反馈矩阵,其中 J J J是系统极点地期望值向量。
较短的调节速度和较少的能耗是互相矛盾,LQR控制器是在控制指标已知,控制系统的反馈参数可以使用LQR方法求得,下面举例说明:
设有状态方程:
[ x 1 ˙ x 2 ˙ ] = [ 0 1 g l 0 ] [ x 1 x 2 ] + [ 0 − 1 ] u \begin{bmatrix} \dot{x_1} \\ \dot{x_2} \end{bmatrix} = \begin{bmatrix} 0&1 \\ \frac{g}{l}&0 \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} + \begin{bmatrix} 0 \\ -1 \end{bmatrix}u [x1˙x2˙]=[0lg10][x1x2]+[0−1]u
令
[ x 1 ˙ x 2 ˙ ] = [ 0 0 ] \begin{bmatrix} \dot{x_1} \\ \dot{x_2} \end{bmatrix} = \begin{bmatrix} 0 \\ 0 \end{bmatrix} [x1˙x2˙]=[00]
得到
[ x 1 x 2 ] = [ 0 0 ] \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} = \begin{bmatrix} 0 \\ 0 \end{bmatrix} [x1x2]=[00]
也就是最后系统最后会平衡在(0,0)点。
引入目标函数
J ( z ) = ∫ 0 t ( x T Q x + u T R u ) d t . J(z) = \int_0^t (x^{T}Qx + u^TRu)dt\,. J(z)=∫0t(xTQx+uTRu)dt.
积分的前一项说明了对控制变量的变化的要求,后一项说明的是在满足要求的同时,又能使控制的输出最小。
其中Q为如下,且a,b,c均为正值。
[ a b ] \begin{bmatrix} a& \\ & b \end{bmatrix} [ab]
其中a,b,R的值都是根据需求设定的,如果我们希望在较少的时间内达到控制目的,可以令Q = [100,0;0,1],R = 0.1,可以使用matlab算出K =[-43.1662 -9.8149];如果我们希望消耗较少的能量达到控制目的,则可以设Q = [1,0;0,1],R = 10,算出K=[-20.0050 -6.3332],将参数带入仿真模型中可以得到下面的结果。
不难理解的是,较短的调节速度和较少的能耗是两个互相矛盾的要素,他们之间只能作一个调和仿真中也真反映了这种观点。值得注意的是,只有完全能控的系统才能作上面的操作,并不是所有系统都可以这么做,系统完全能控的判别条件即 R a n k ( Q c ) = n Rank(Q_c) = n Rank(Qc)=n,其中 Q c = [ b A B . . . A n − 1 B ] Q_c = \begin{bmatrix}b & AB & ... & A^{n-1}B \end{bmatrix} Qc=[bAB...An−1B]
如果希望把稳态点定在 x 1 e x p = 0.1 x_{1exp} = 0.1 x1exp=0.1的地方,可以令
e = x 1 e x p − x 1 e = x_{1exp} - x_1 e=x1exp−x1
有
e ˙ = − x 1 ˙ = − x 2 \dot{e} = -\dot{x_1} =-x_2 e˙=−x1˙=−x2
从而我们得到新的状态方程(系统只能用状态方程表示,而状态反馈控制作为唯一地手段只能使得方程中的状态的变化为零,设计控制器使得 x 1 → x 1 e x p x_1→x_{1exp} x1→x1exp首先要满足 e e e的终止为0)
[ e ˙ x 2 ˙ ] = [ 0 − 1 − g l 0 ] [ e x 2 ] + [ 0 − 1 ] u + [ 0 g l x 1 e x p ] \begin{bmatrix} \dot{e} \\ \dot{x_2} \end{bmatrix} = \begin{bmatrix} 0 & -1\\ -\frac{g}{l} & 0 \end{bmatrix} \begin{bmatrix} e\\ x_2 \end{bmatrix}+ \begin{bmatrix} 0\\ -1 \end{bmatrix}u +\begin{bmatrix} 0\\ \frac{g}{l} x_{1exp} \end{bmatrix} [e˙x2˙]=[0−lg−10][ex2]+[0−1]u+[0lgx1exp]
但是我们发现这个状态方程的稳定值是
[ e f x 2 f ] = [ g l x 1 e x p 0 ] \begin{bmatrix} e_f \\ x_{2f} \end{bmatrix} = \begin{bmatrix} \frac{g}{l}x_{1exp} \\ 0 \end{bmatrix} [efx2f]=[lgx1exp0]
与预期的目标值不一致,于是,我们可以把控制器分为两个部分:
1、稳定系统的部分;
2、调节平衡点的部分。
令 u = u 1 + u 2 u = u_1 + u_2 u=u1+u2
其中
{ u 1 = [ k 1 k 2 ] [ e x 2 ] u 2 = − g l x 1 e x p \begin{cases} u_1 = \begin{bmatrix} k_1 &k_2 \end{bmatrix} \begin{bmatrix} e\\ x_2 \end{bmatrix} \\ u_2 = -\frac{g}{l}x_{1exp} \end{cases} ⎩⎨⎧u1=[k1k2][ex2]u2=−lgx1exp
代入方程得到
[ e ˙ x 2 ˙ ] = [ 0 − 1 − g l + k 1 k 2 ] [ e x 2 ] \begin{bmatrix} \dot{e}\\ \dot{x_2} \end{bmatrix} = \begin{bmatrix} 0 & -1\\ -\frac{g}{l} + k_1 & k_2 \end{bmatrix} \begin{bmatrix} e\\ x_2 \end{bmatrix} [e˙x2˙]=[0−lg+k1−1k2][ex2]
然后我们设 λ 1 = λ 2 = − 1 λ_1 = λ_2 = -1 λ1=λ2=−1得到 k 1 = 1 + g / l , k 2 = − 2 k_1 = 1 + g/l,k_2 = -2 k1=1+g/l,k2=−2.
实际上,得到上面的式子以后,我们也可以按照LQR的控制器的设计方法,设计一个合适的状态反馈 u 1 u_1 u1,最后求得 u u u作为最终的反馈式。
我们曾经假设u = - λx,此时便默认x是可测的,当x未知的时候,我们就不可能对系统作状态反馈,此时可以设计一个状态观测器,根据系统输出来估计状态。所谓状态观测器,其实就是根据系统的输入和输出来估计系统的状态。
设 x ^ \hat {x} x^ 为 x x x (状态)的估计值, y ^ \hat{y} y^ 为 y y y (输出)的估计值
系统的状态方程和输出方程为
{ x ^ ˙ = A x ^ + B u + G ( y − y ^ ) y ^ = C x ^ + D u \begin{cases} \dot{\hat{x}} = A\hat{x} + Bu + G(y - \hat{y}) \\ \hat{y} = C\hat{x} + Du\end{cases} {x^˙=Ax^+Bu+G(y−y^)y^=Cx^+Du
综合系统的状态方程和输出方程,有状态观测器( x ^ ˙ \dot{\hat{x}} x^˙关于 x ^ \hat{x} x^的表达式):
x ^ ˙ = ( A − G C ) x ^ + ( B − G D ) u + G y \dot{\hat{x}} = (A-GC)\hat{x} + (B-GD)u + Gy x^˙=(A−GC)x^+(B−GD)u+Gy
观测值必须满足收敛于实际值,综合状态观测器和状态方程可以得出:
e ˙ x = x ˙ − x ^ ˙ = ( A − G C ) ( x − x ^ ) = ( A − G C ) e x \dot{e}_x = \dot{x} - \dot{\hat{x}} = (A-GC)(x - \hat{x}) = (A-GC)e_x e˙x=x˙−x^˙=(A−GC)(x−x^)=(A−GC)ex
也就是估计误差 e x ˙ → 0 \dot{e_x}→ 0 ex˙→0,只需 ( A − G C ) (A-GC) (A−GC)的特征值的实部等于0,只需找到一个G使得 ( A − G C ) (A-GC) (A−GC)的特征值的实部等于0,这里特征值需要人为设定(系统能观就一定能找到)。
如果系统可观,则 R a n k ( Q o ) = n Rank(Q_o ) = n Rank(Qo)=n,其中 Q o Q_o Qo为:
Q o = [ C C A . . . C A n − 1 ] Q_o = \begin{bmatrix}C\\ CA \\ ... \\ CA^{n-1} \end{bmatrix} Qo=⎣⎢⎢⎡CCA...CAn−1⎦⎥⎥⎤
比如:有状态方程和输出方程:
x ˙ = [ 0 1 2 − 1 ] x + [ 0 1 ] u \dot{x} = \begin{bmatrix} 0 & 1\\ 2 & -1 \end{bmatrix} x + \begin{bmatrix} 0 \\ 1 \end{bmatrix}u x˙=[021−1]x+[01]u
y = [ − 1 1 ] x y = \begin{bmatrix} -1 & 1 \end{bmatrix}x y=[−11]x
其中 Q o = [ − 1 1 2 − 2 ] Q_o = \begin{bmatrix} -1 & 1\\ 2 & -2 \end{bmatrix} Qo=[−121−2]
即 R a n k ( Q o ) = 1 ≠ 2 Rank(Q_o ) = 1 ≠2 Rank(Qo)=1=2,则系统不完全可观。
例如,在经典的弹簧阻尼系统中设 x 1 = x , x 2 = v x_1=x,\space x_2 =v x1=x, x2=v, 弹簧的劲度系数为 k k k,阻尼系数为 b b b,物块质量为 m m m,则可建立状态方程
x ˙ = [ 0 1 − k m − b m ] x + [ 0 1 m ] u \dot{x} = \begin{bmatrix} 0 & 1\\ -\frac{k}{m} & -\frac{b}{m} \end{bmatrix} x + \begin{bmatrix} 0 \\ \frac{1}{m} \end{bmatrix}u x˙=[0−mk1−mb]x+[0m1]u
y = [ 1 0 ] x y = \begin{bmatrix} 1 & 0 \end{bmatrix}x y=[10]x
令m = 1, b = 0.5, k = 1,得到:
x ˙ = [ 0 1 − 1 − 0.5 ] x + [ 0 1 ] u \dot{x} = \begin{bmatrix} 0 & 1\\ -1 & -0.5 \end{bmatrix} x + \begin{bmatrix} 0 \\ 1 \end{bmatrix}u x˙=[0−11−0.5]x+[01]u
y = [ 1 0 ] x y = \begin{bmatrix} 1 & 0 \end{bmatrix}x y=[10]x
求得 R a n k ( Q o ) = 2 Rank(Q_o) = 2 Rank(Qo)=2
设观测器的极点 λ 0 = λ 1 \lambda_0=\lambda_1 λ0=λ1,有
{ g 1 + 0.5 = − 2 λ 0 0.5 g 1 − g 2 − 1 = λ 0 2 \begin{cases} g_1 + 0.5= -2\lambda_0\\ 0.5g_1-g_2 - 1= \lambda_0^2 \end{cases} {g1+0.5=−2λ00.5g1−g2−1=λ02
令 λ 0 = λ 1 = − 1 \lambda_0=\lambda_1 =-1 λ0=λ1=−1
解得 g = [ 1.5 − 0.75 ] T g=\begin{bmatrix} 1.5 & -0.75\end{bmatrix}^T g=[1.5−0.75]T 通过改变
也可以使用matlab函数 G = a c k e r ( A ′ , C ′ , V ) ′ G= acker(A',C',V)' G=acker(A′,C′,V)′直接算得反馈矩阵G,其中V为特征根组成的向量。
根据: x ^ ˙ = ( A − G C ) x ^ + ( B − G D ) u + G y \dot{\hat{x}} = (A-GC)\hat{x} + (B-GD)u + Gy x^˙=(A−GC)x^+(B−GD)u+Gy λ 0 , λ 1 \lambda_0,\lambda_1 λ0,λ1的值,可以改变状态观测器的收敛速率。
综合以上结果,可以得到 x ^ ˙ = [ − 1.5 1 − 0.25 − 0.5 ] x + [ 0 1 ] u + [ 1.5 − 0.75 ] y \dot{\hat{x}} = \begin{bmatrix} -1.5 & 1 \\ -0.25 & -0.5 \end{bmatrix} x + \begin{bmatrix} 0 \\ 1 \end{bmatrix}u + \begin{bmatrix} 1.5 \\ -0.75 \end{bmatrix}y x^˙=[−1.5−0.251−0.5]x+[01]u+[1.5−0.75]y
建立仿真模型,仿真10s。
建立matlab仿真,并给状态观测器一个初始的估计误差,可以看到,状态观测器最终会收敛于真实值。
设系统是完全能控完全能观的,系统的状态是不能测量的。
首先,我们要实际观测器:
{ x ^ ˙ = A x ^ + B u + G ( y − y ^ ) e ˙ = ( A − G C ) e x \begin{cases} \dot{\hat{x}} = A\hat{x} + Bu + G(y - \hat{y}) \\ \dot{e} = (A-GC)e_x\end{cases} {x^˙=Ax^+Bu+G(y−y^)e˙=(A−GC)ex
其中1式是状态观测器的表达式,其中含有u,y是为了利用输入输出估计状态;2式是状态观测器必须满足的条件,其中出现 e ˙ \dot{e} e˙是为了利用特征矩阵收敛使得误差趋于0。亦即1式是实际要用的,2式是充分条件,根据他可以求得G矩阵。
然后设计控制器:
{ u = − K x ^ x ˙ = A x − B K u \begin{cases} u = -K\hat{x} \\ \dot{x} = Ax-BKu \end{cases} {u=−Kx^x˙=Ax−BKu
其中1式是反馈控制器的表达式,所谓控制器,亦即根据状态反馈确定输入,对系统实现控制,是我们要求的;2式是状态观测器必须满足的条件,是系统收敛的充分条件,根据它可以求得k矩阵。
为了求得G,K作以下证明:
根据定义: x ^ = x − e x \hat{x}=x-e_x x^=x−ex所以有 x ˙ = ( A − B K ) x + B K e \dot{x} = (A-BK)x+BKe x˙=(A−BK)x+BKe
联立:
{ e ˙ = ( A − G C ) e x x ˙ = ( A − B K ) x + B K e \begin{cases} \dot{e} = (A-GC)e_x \\ \dot{x} = (A-BK)x+BKe \end{cases} {e˙=(A−GC)exx˙=(A−BK)x+BKe
得:
[ e ˙ x ˙ ] = [ ( A − G C ) 0 B K ( A − B K ) ] [ e x ] \begin{bmatrix} \dot{e}\\ \dot{x} \end{bmatrix} = \begin{bmatrix} (A-GC) & 0\\ BK & (A-BK) \end{bmatrix} \begin{bmatrix} e\\ x \end{bmatrix} [e˙x˙]=[(A−GC)BK0(A−BK)][ex]
即,只需 [ ( A − G C ) 0 B K ( A − B K ) ] \begin{bmatrix} (A-GC) & 0\\ BK & (A-BK) \end{bmatrix} [(A−GC)BK0(A−BK)]特征值实部都为负即可。求其特征值:
∣ λ I − [ ( A − G C ) 0 B K ( A − B K ) ] ∣ = ∣ [ λ I − ( A − G C ) 0 B K λ I − ( A − B K ) ] ∣ = ∣ ( λ I − ( A − G C ) ) ( λ I − ( A − B K ) ) ∣ \left| \lambda I - \begin{bmatrix} (A-GC) & 0\\ BK & (A-BK) \end{bmatrix} \right| = \left| \begin{bmatrix} \lambda I-(A-GC) & 0\\ BK & \lambda I-(A-BK) \end{bmatrix} \right|= \left| (\lambda I-(A-GC))(\lambda I-(A-BK))\right| ∣∣∣∣λI−[(A−GC)BK0(A−BK)]∣∣∣∣=∣∣∣∣[λI−(A−GC)BK0λI−(A−BK)]∣∣∣∣=∣(λI−(A−GC))(λI−(A−BK))∣
到此便实现了观测器与控制器分离计算。这里需要注意的是状态观测器的收敛速度必须高于控制器的收敛速度。因为我们需要一个准确的估计值才能完成好的控制。
还是上面的弹簧阻尼系统,设计状态反馈和状态观测器。设控制器的极点为(-2,-2),观测器的极点为(-6,-6),使用matlab函数算得 K = [ 3.0000 3.5000 ] K = \begin{bmatrix}3.0000 & 3.5000\end{bmatrix} K=[3.00003.5000], G = [ 11.5 29.25 ] G = \begin{bmatrix}11.5 & 29.25\end{bmatrix} G=[11.529.25],建立仿真模型,仿真4s:
其中,黄线是实际值,蓝线是估计值,可以看到,系统得稳定速度大大加快。
值得注意的是,如果想在系统稳定前获得较稳准确的观测值,观器的收敛速度并不宜过快,虽然观测的收敛速度满足比控制器的收敛速度快后并不影响控制器对状态的控制,但是,状态的器过快的收敛速度会使得观测值有一个很大的超调,下面对比控制器相同时,不同观测器对系统的影响。