网络控制系统是引入网络的控制系统,即网络可能存在于控制系统的反馈通道和控制通道。在网络控制系统中,被控对象的数学模型当然是连续的(这个世界上还有离散的物理系统么?)但是,由于网络控制系统不可能使用连续的信号来控制被控对象,所以我们需要把被控对象的模型离散化。
- 对于线性系统,可以参考现代控制理论的书籍的离散化方法,matlab的离散化方法是
c2d
. - 对于非线性系统,目前没有具有完整理论的离散化方法,但是不是说不可以离散,虽然我们没有理论基础,我们照样可以把非线性系统离散化。
例如:
- 欧拉法:
给定小车的模型为:
x ˙ = v c o s ( θ ) y ˙ = v s i n ( θ ) θ ˙ = ω (1) \dot{x}=vcos(\theta)\\ \dot{y} = vsin(\theta)\\ \dot{\theta} = \omega \tag{1} x˙=vcos(θ)y˙=vsin(θ)θ˙=ω(1)
那么离散化为:
x ( k + 1 ) = x ( k ) + h v ( k ) c o s ( θ ( k ) ) y ( k + 1 ) = y ( k ) + h v ( k ) s i n ( θ ( k ) ) θ ( k + 1 ) = θ ( k ) + h ω (2) x(k+1) = x(k)+hv(k)cos(\theta(k)) \\ y(k+1) = y(k)+hv(k)sin(\theta(k)) \\ \theta(k+1) = \theta(k)+h\omega \tag{2} x(k+1)=x(k)+hv(k)cos(θ(k))y(k+1)=y(k)+hv(k)sin(θ(k))θ(k+1)=θ(k)+hω(2)
接下来编程验证一下使用欧拉法离散化好不好用:
matlab脚本:test_simpleDynamicCar
% test_simpleDynamicCar
v = ones(1,3000);
phi = ones(1,3000);
x = 0;
y = 0;
theta = 0;
axis equal
for i = 1:3000
[x,y,theta] = simpleDynamicCar(x,y,theta,v(i),phi(i));
plot(x,y,'.');
hold on;
pause(0.01)
end
matlab代码:simpleDynamicCar函数
function [x,y,theta] = simpleDynamicCar(x,y,theta,v,phi_f)
h = 0.01;
lw = 0.25;
x = x + (v*( cos(theta) - tan(phi_f)*sin(theta)*0.5))*h;
y = y + (v*( sin(theta) + tan(phi_f)*cos(theta)*0.5))*h;
theta = theta + v*tan(phi_f)/lw*h;
end
使用simulink模块同样可以搭建一个小车的模型(作为基准),来和欧拉离散做一个对比。结果为下图,红色的为使用simulink的小车轨迹,蓝色为使用代码实现的小车轨迹。仿真时间为30秒。
可以看出,还是有偏差的,,,但是应该也够用吧。