倒立摆的状态观测器设计与仿真

状态估计原理

倒立摆的状态反馈控制一文中,我们默认系统状态可以直接获得。但实际中有的状态无法直接测量,而且还要考虑噪声的影响,所以经常需要设计状态观测器估计系统状态。

本文采用Luenberger状态观测器,其动态特性由如下方程描述

的最后一项根据实际系统输出与估计的系统输出之间的差值来修正系统状态估计,状态估计误差满足

如果矩阵的特征值都有负的实部,则会趋于零,通过配置的特征值可以决定的收敛速度。在设计控制器和观测器之前,要判断系统的能控性和能观性,在最后的代码中会有体现,这里就不多提了。

基于状态观测器的控制

现在基于状态估计对倒立摆系统进行反馈控制,反馈控制信号

系统状态方程为

即有

合并,得到如下矩阵方程

系统输出

那么观测器和控制器耦合到一起形成了一个系统,整个系统特征方程变为阶的。系统整体结构图可以在任何一本相关教材上找到,这里就不再贴出。基于倒立摆的状态反馈控制中的代码修改,得到如下MATLAB仿真代码:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
% 倒立摆模型
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_open = ss(A, B, C, D);

% 判断系统的能控性和能观性
co = ctrb(sys_open);
controllability = rank(co);
ob = obsv(sys_open);
observability = rank(ob);

% 控制器和观测器的极点配置
poles = [-5; -10; -5+10j; -5-10j];
K = place(A, B, poles);
poles = [-7; -8; -9; -10];
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);
t = 0:0.01:2;
% 初始状态,状态x和误差e的初始值都要设置
x0 = [-0.2; 0; 0.1; 0]; e0 = -x0;
xe0 = [x0; e0];
% 输入信号设置,使位移x的终值为0.1
rss = 0.1/(-0.0071); r = rss*ones(size(t));
% 同时返回(9)中的输出y和(8)中的状态xe,即[x; e]向量保存到xe中
[y, t, xe] = lsim(sys_co, r, t, xe0);
% 绘图,分别是输出y和状态估计误差e的图像
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')

由于观测器估计的系统状态与实际状态有误差,所以系统输出(小车位移和摆杆角度)随时间变化规律与之前的有差异:

基于状态观测器的反馈控制

状态估计误差随着时间推移衰减为零:

状态估计误差

参考资料

  1. Inverted Pendulum: State-Space Methods for Controller Design
  2. 现代控制工程