自抗扰控制器中扩张状态观测器的设计

状态观测器是根据系统的输入输出来确定系统内部状态变量的装置,它的示意图如下:
状态观测器形式
在自抗扰控制器的设计过程中,我们通常把未知的干扰都用 f f f来表示,如果利用状态观测器可以将未知的干扰观测出来,就可以提前在控制器中采取补偿措施,使得控制器的设计更加简单,这也是自抗扰控制器的核心思想。
对一个线性控制系统
{ X ˙ = A X + B U Y = C X \left\{ \begin{array}{lr} \dot{X} = AX+BU & \\ Y = CX \end{array} \right. {X˙=AX+BUY=CX
来说,以对象的输出量 Y Y Y和输入量 U U U作为其输入,可以构造出如下的新系统
Z ˙ = A Z − L ( C Z − Y ) + B U = ( A − L C ) Z + L Y + B U \dot{Z} = AZ-L(CZ-Y)+BU = (A-LC)Z+LY+BU Z˙=AZL(CZY)+BU=(ALC)Z+LY+BU L L L为要适当选取的矩阵,这是用对象的输出量 Y Y Y和输入量 U U U来设计出的新系统,令这两个系统状态变量的误差记为 e = Z − X e= Z-X e=ZX,则上面两个方程组相减,得误差变量 e e e所满足的方程组为 e ˙ = ( A − L C ) e \dot{e} = (A-LC)e e˙=(ALC)e,这里只要取矩阵 L L L使得 A − L C A-LC ALC稳定,就会有 e ⇒ 0 e\Rightarrow0 e0,从而 Z ⇒ X Z \Rightarrow X ZX。新设计的系统的状态 Z Z Z就能近似的估计出原系统的所有状态变量 X X X,这个状态观测器也可以写成
{ e = C Z − Y Z ˙ = A Z − L e + B U \left\{ \begin{array}{lr} e=CZ-Y & \\ \dot{Z} = AZ-Le+BU \end{array} \right. {e=CZYZ˙=AZLe+BU
下面来看一个具体的例子
设对象为如下有扰动作用的非定常系统
{ x 1 ˙ = x 2 , x 1 ( 0 ) = 0 x 2 ˙ = f ( x 1 , x 2 , t ) + w ( t ) , x 2 ( 0 ) = 0 y = x 1 \left\{ \begin{array}{lr} \dot{x_1} = x_2, x_1(0) = 0& \\ \dot{x_2} = f(x_1,x_2,t) +w(t), x_2(0) = 0 & \\ y = x_1 \end{array} \right. x1˙=x2,x1(0)=0x2˙=f(x1,x2,t)+w(t),x2(0)=0y=x1
其中,
f ( x 1 , x 2 , t ) = − ( 1 + c o s ( t ) 2 ) x 1 − ( 1 + s i n ( t 3 ) ) x 2 f(x_1,x_2,t) = -(1+\frac{cos(t)}{2})x_1-(1+sin(\frac{t}{3}))x_2 f(x1,x2,t)=(1+2cos(t))x1(1+sin(3t))x2
w ( t ) = s i g n ( s i n ( 3 t 2 ) ) w(t) = sign(sin(\frac{3t}{2})) w(t)=sign(sin(23t))
取状态观测器为
{ e = z 1 − y z 1 ˙ = z 2 − 100 e z 2 ˙ = − 200 f a l ( e , 0.5 , 0.01 ) \left\{ \begin{array}{lr} e = z_1-y & \\ \dot{z_1} = z_2-100e & \\ \dot{z_2} = -200fal(e, 0.5, 0.01) \end{array} \right. e=z1yz1˙=z2100ez2˙=200fal(e,0.5,0.01)
其中
f a l ( e , 0.5 , 0.01 ) = { ∣ e ∣ 0.5 s i g n ( e ) , ∣ e ∣ > 0.01 e 0.0 1 0.5 , ∣ e ∣ ≤ 0.01 fal(e, 0.5, 0.01) = \left\{ \begin{array}{lr} |e|^{0.5}sign(e), |e|>0.01 & \\ \frac{e}{0.01^{0.5}}, |e| \leq 0.01 \end{array} \right. fal(e,0.5,0.01)={e0.5sign(e),e>0.010.010.5e,e0.01
用这个观测器对对象进行状态估计时,可以用简单的欧拉积分法来计算,即令状态观测器的初始值为 z 1 ( 0 ) = 0 z_1(0)=0 z1(0)=0 z 2 ( 0 ) = 0 z_2(0) = 0 z2(0)=0,然后把系统离散化成如下的递推公式来计算
{ e = z 1 − y , f e = f a l ( e , 0.5 , 0.01 ) z 1 = z 1 + h ( z 2 − 100 e ) z 2 = z 2 − h 200 f e \left\{ \begin{array}{lr} e = z_1-y, fe = fal(e, 0.5, 0.01) & \\ z_1= z_1+h(z_2-100e) & \\ z_2 = z_2 -h200fe \end{array} \right. e=z1y,fe=fal(e,0.5,0.01)z1=z1+h(z2100e)z2=z2h200fe
用这个递推公式,取采样周期 h = 0.01 h=0.01 h=0.01,来进行状态估计的结果如下图所示。
在这里插入图片描述
上面那张图实际上有两条曲线,是状态估计的比较好,所以两条曲线基本重合到一起了,下面有一张局部的细节图。
在这里插入图片描述
以下是实现的代码:

clear all;
h=0.01;
T=0.01;
time = 20;
N = time/T;
n=0:N-1;
% x = sin(n*T);

for k=1:1:N
    %%% original state
    x1(1) = 0;
    x2(1) = 0;
    x1(k+1) = x1(k) + h*x2(k);
    x2(k+1) = x2(k) + h*(-(1+0.5*cos(k*T))*x1(k)-(1+sin(k*T/3))*x2(k)+sign(sin(1.5*k*T)));
    y(k) = x1(k);
    %%%% state observer
    z1(1) = 0;
    z2(1) = 0;
    e(k) = z1(k) - y(k);
    fe = fal(e(k), 0.5, 0.01);
    z1(k+1) = z1(k) + h*(z2(k)-100*e(k));
    z2(k+1) = z2(k) -h*200*fe;
end
plot(n*T,x1(1,1:2000),'b',n*T,z1(1,1:2000),'r');

fal函数如下:

function fe = fal(e,tau1,tau2)
%UNTITLED2 此处显示有关此函数的摘要
%   此处显示详细说明
if abs(e)>tau2
    fe = power(abs(e),tau1)*sign(e);
else
    fe = e/(power(tau2,tau1));
end

end

上面设计过程最关键的一步是状态观测器的设计,韩京清先生的设计过程考虑的参数比较多,这方面可以看一下高志强的线性ADRC的设计过程。

评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值