系统离散化
由于计算机控制在实际中占绝对主导地位,所以离散系统非常重要。当采用零阶保持器时,连续系统到离散系统的转换方法如下图所示:
从连续系统得到离散系统
可以采用MATLAB的符号计算功能得到离散模型的参数,也可以采用c2d函数完成转换。以倒立摆为例,从连续模型得到离散模型的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| M = 0.5; m = 0.2; b = 0.1; I = 0.006; g = 9.8; l = 0.3; den = I*(M+m)+M*m*l^2; A = [0, 1, 0, 0; 0, -(I+m*l^2)*b/den, -(m^2*g*l^2)/den, 0; 0, 0, 0, 1; 0, (m*l*b)/den, m*g*l*(M+m)/den, 0]; B = [ 0; (I+m*l^2)/den; 0; -m*l/den]; C = [1, 0, 0, 0; 0, 0, 1, 0]; D = [0; 0]; sys_continuous = ss(A, B, C, D);
ts = 0.01; sys_discrete = c2d(sys_continuous, ts, 'zoh');
A = sys_discrete.a; B = sys_discrete.b; C = sys_discrete.c; D = sys_discrete.d;
|
转换得到的离散系统由差分方程描述,标准形式如下:
接下来我们设计状态观测器,并基于状态估计值设计反馈控制器。倒立摆的状态观测器设计与仿真一文介绍了连续状态观测器的设计过程,本文设计离散状态观测器的过程和它类似,因此两篇文章可以对照着看。
能控性和能观性
在设计控制器和观测器之前,先判断系统的能控性和能观性。运行如下命令:
1 2 3 4
| co = ctrb(sys_discrete); controllability = rank(co); ob = obsv(sys_discrete); observability = rank(ob);
|
两个矩阵的秩都是4,所以系统是能控能观的。
离散观测器
本文采用如下形式的离散Luenberger状态观测器
状态估计误差,所以有
将代入,整理可得
如果矩阵的特征值都在单位圆之内,则会趋于零,通过配置的特征值可以决定的收敛速度。
反馈控制器
现在基于状态估计对倒立摆进行反馈控制,系统输入信号为,采用如下形式的反馈控制律
系统状态方程为
即
将和合并,得到如下矩阵方程
系统输出
稳态值分析
接下来仿照倒立摆的状态反馈控制中的方法,分析系统状态和系统输出的稳态值。当时,有
如果输入为定值,即,将代入到中可得:
所以
如果,则有
本例中,计算可得的值为
1 2 3 4
| >> C*inv(eye(4)-A+B*K)*B ans = -0.0111 0.0000
|
第一个分量不为零,所以,通过设置输入信号的值可以决定小车位移的稳态值,摆杆角度则必然趋于零。
模型求解
通过极点配置,得到和矩阵。建立所描述系统的模型并求解,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| poles = [0.95; 0.96; 0.90+0.10j; 0.90-0.10j]; K = place(A, B, poles); poles = [0.90; 0.91; 0.93; 0.94]; L = place(A', C', poles)';
Aco = [A-B*K, B*K; zeros(size(A)), A-L*C]; Bco = [B; zeros(size(B))]; Cco = [C, zeros(size(C))]; Dco = 0; sys_co = ss(Aco, Bco, Cco, Dco, ts);
final_time = 2.5; t = 0:ts:final_time;
rss = 0.1/(-0.0111); r = rss*ones(size(t));
x0 = [-0.2; 0; 0.1; 0]; e0 = -x0; xe0 = [x0; e0];
[y, t, xe] = lsim(sys_co, r, t, xe0);
figure(1); plot(t, y(:, 1:2), 'LineWidth', 1.5); grid on legend('Cart Position (m)', 'Pendulum Angle (rad)'); title('Step Response with Observer Feedback Control') figure(2); plot(t, xe(:, 5:8), 'LineWidth', 1.5); grid on title('State Estimate Error')
|
将上面所有代码按顺序贴到同一个文件中运行,可得到如下仿真结果图,控制器和观测器均满足设计要求。
基于状态观测器的反馈控制
状态估计误差
参考资料
- Inverted
Pendulum: Digital Controller Design
- Observers
and observer-state feedback | Xu Chen