在PID_learning1中,对控制系统的进行了概要,并对经典算法PID进行介绍与公式理解。作为号称可以解决95%的工程问题的PID,浅尝辄止不是显然我们的目标。本文将结合经典控制理论的相关内容,从校正装置的角度对PID进行理解讨论,并使用MATLAB/Simulink工具进行建模实践。最后,在相同的系统中,通过与MPC结果的比对引出接下来要学习的MPC控制算法。
一、从校正装置的角度回看PID
在PID_learning1中,简单推导了PID的公式,为:
C
=
K
p
∗
e
i
+
K
i
∗
∑
n
=
0
∞
e
i
+
K
d
∗
(
Δ
e
i
−
Δ
e
i
−
1
)
C = K_p*e_i+K_i*\sum_{n=0}^{\infty} e_i \, +K_d*(\Delta e_i-\Delta e_{i-1})
C=Kp∗ei+Ki∗n=0∑∞ei+Kd∗(Δei−Δei−1)
其中:
P
=
K
p
∗
e
i
,
I
=
K
i
∗
∑
n
=
0
∞
e
i
,
D
=
K
d
∗
(
Δ
e
i
−
Δ
e
i
−
1
)
P = K_p*e_i,I = K_i*\sum_{n=0}^{\infty} e_i,D = K_d*(\Delta e_i-\Delta e_{i-1})
P=Kp∗ei,I=Ki∗n=0∑∞ei,D=Kd∗(Δei−Δei−1)
则在复频率平面中,PI控制器可写作:
G
c
=
K
p
(
1
+
1
T
1
s
)
G_c = K_p(1+\frac{1}{T1s})
Gc=Kp(1+T1s1),在工程上常常加上一个滤波,变为:
G
c
=
K
p
(
τ
I
s
+
1
T
I
s
+
1
)
,
T
I
>
τ
I
G_c = K_p(\frac{\tau_Is+1}{T_Is+1}),T_I>\tau_I
Gc=Kp(TIs+1τIs+1),TI>τI
添加的开环极点更靠近虚轴,为典型滞后校正装置。通过减小幅频量使截止频率
ω
c
\omega_c
ωc提前,而利用高频段时相位滞后幅度较小的特性,保证对截止频率
ω
c
\omega_c
ωc附近的相频曲线影响不大。简单来说,通过牺牲部分动态性能增大系统的静态性能。
同理,PD控制器可写为:
G
c
=
K
p
(
T
D
s
+
1
τ
D
s
+
1
)
,
T
D
>
τ
D
G_c = K_p(\frac{T_Ds+1}{\tau_Ds+1}),T_D>\tau_D
Gc=Kp(τDs+1TDs+1),TD>τD
添加的开环零点更靠近虚轴,为典型的超前校正装置,将补偿的幅频和相频曲线叠加到原系统相应的曲线,均直接向上搬移。使得动态性能更好,系统稳定性增加。
而PID控制即为二者串联,取:
G
c
=
K
(
τ
I
s
+
1
T
I
s
+
1
)
(
T
D
s
+
1
τ
D
s
+
1
)
,
T
I
>
τ
I
,
T
D
>
τ
D
G_c = K(\frac{\tau_Is+1}{T_Is+1})(\frac{T_Ds+1}{\tau_Ds+1}),T_I>\tau_I,T_D>\tau_D
Gc=K(TIs+1τIs+1)(τDs+1TDs+1),TI>τI,TD>τD
为滞后超前校正网络。
二、Simulink建模实践
以常见的电机位置控制为例,位置控制系统的开环函数实质是在电压-速度模块后串联一个积分器来获得位置信号,单位负反馈系统控制框图如下图:
不难得到,其闭环传递函数如下:
θ
m
(
s
)
θ
d
(
s
)
=
K
τ
s
2
+
1
τ
s
+
K
τ
\frac{\theta_m(s)}{\theta_d(s)} = \frac{\frac{K}{\tau}}{s^2+\frac{1}{\tau}s+\frac{K}{\tau}}
θd(s)θm(s)=s2+τ1s+τKτK
这里随便设置参数数值,令
1
τ
=
0.8
\frac{1}{\tau}=0.8
τ1=0.8,
K
τ
=
1
\frac{K}{\tau}=1
τK=1。
使用Simulink进行建模,当只设置比例环节时,如下图:
运行观察示波器误差波形,发现无穷远处误差波形不趋于0,大致趋于1:
证明仅靠比例环节无法完成控制,始终存在稳态误差。
接下来加上积分环节实现PI控制,即加上滞后校正装置,如下图:
消除了稳态误差。将两个控制放到一张图中观察:
虽然PI控制消除了稳态误差,但显然动态性能并不够好:超调量过大,稳定时间也太长。这是由于增加的开环极点更靠近虚轴导致系统不可避免地出现动态性能降低,稳定度下降。因此再加入微分项进行尝试,如下图:
可以看到效果显著,系统几乎没有发生振荡。动态性能被极大优化。
但观察控制输入,PID控制在初始时有一个巨大的输入,接近3000。显然不利于系统的稳定性。
且微分项容易被扰动,对高频噪音极其敏感。为模拟扰动,添加一个白噪声环节,接至系统中。
可以看到,控制输入极其不稳定。此时就需要我们从频域进行分析设置合理的参数。
三、MPC的控制
实际上,现实生活中的系统实例大多都不是一个传递函数可以描述的,可能需要考虑动力学、静力学等模型,PID是一个类似于黑箱的方法,不管具体的模型,只观察输入输出来对其进行参数的调整。从这个角度确实有点像神经网络那一套。
如果想要实现更加精确地控制,势必要对整个系统有更加实际清晰的建模,也就引出了更多的控制方法,如LQR、MPC等。
本文在这里不介绍太多,用MPC的方法对该系统进行控制。
以下为核心代码,注:本例系统建模的部分使用了系统辨识的方法,使用真实电机数据进行状态空间模型的建立。故与本文系统略有差异,主要想体现其控制趋势:
%%
%MPC关键参数
P = 10;%预测步长
M = 5;%控制步长
q = 1;%Q矩阵权重
r = 10;%R矩阵权重
h = 0.5;%H矩阵权重
alpha = 0.2;%期望轨迹的平滑度(范围为0~1),越小,响应越快
target = 1;%目标值
%矩阵初始化
A=zeros(P,M);%动态矩阵
Q=eye(P,P)*q;%Q矩阵
R=eye(M,M)*r;%R矩阵
H=ones(P,1)*h;%H矩阵
S=zeros(P,M);%移位矩阵
DU=zeros(M,1);
for i=1:P-1
S(i,i+1)=1;
end
S(P,P)=1;
W=zeros(P,1);%期望轨迹
Y0=zeros(P,1);%预测输出轨迹
Y_cor=zeros(P,1);%预测输出轨迹修正值
%% 1.模型
%1.1获取阶跃响应模型
[stepresponse,t]=step(sys1,ts:ts:(P)*ts);
%1.2创建动态矩阵A,矩阵大小为P*M
A(:,1)=stepresponse(1:P);
for i=1:P
for j=2:M
if i>=j
A(i,j)=A(i-1,j-1);
end
end
end
%% 2.预测
xs1=ad*xs0;
y(1)=cs*xs0;
u(1) = 0;
for k=2:3*steps
xs1=ad*xs0+bd*u(k-1);
y(k)=cs*xs0+ds*u(k-1);
xs0=xs1;
if k < steps
target = 1;
elseif (k-steps)<steps
target = -1;
else
target = 1;
end
ref(k) = target;
%参考轨迹
for i=1:P
W(i,1) = alpha^i * y(k) + (1 - alpha^i) * target;
end
%误差补偿,修正轨迹
Y_cor = Y0 + H * (y(k) - Y0(1,1));
%移位
Y0 = S * Y_cor;
%计算增量化控制
Y0 = Y0 + A * DU;
plot(Y0);
%求解最优值
DU = (A'*Q*A+R)^-1*A'*Q*(W-Y0);
u(k) = u(k-1) + DU(1,1);
%使用quadprog()的办法
%Z1 = A'*Q*A+R;
%Z2 = A'*Q*(-W);
%[x,fval,exitflag,output,lambda] = quadprog(Z1,Z2);
%u(k)=u(k-1)+x(1,1);
end
代码源:华南小虎队,感谢!
控制曲线如下:
可以看到,MPC控制中,响应速度弱于PID控制,但曲线平滑上升至目标值,无超调量,输出更加平稳,适用于更多场合。
MPC的学习,可以看我的其他文章,在此不多赘述。
MPC_ln_detail1——无约束线性MPC
MPC_ln_detail2——有约束线性MPC