0.简介

本文是《线性系统理论》大作业的一部分,内容是一阶和二阶倒立摆的分析与控制,本文是 线性系统大作业——0.一阶和二阶倒立摆建模与控制系统设计 的一部分。

最后,本文中使用的 MATLAB 代码和 Simulink 仿真模型已经上传到 GitHub 上。
Code: https://github.com/Cc19245/Inverted-pendulum.git

1.建立数学模型

一阶倒立摆受力分析模型

如图所示,假设 u u u为外部作用力, M M M为小车质量, m m m为摆杆质量,摆杆长度为 2 l 2l 2l且摆杆质量均匀分布。设 x x x为小车位置, θ \theta θ为摆杆与竖直方向的夹角。系统不考虑空气阻力的影响。

本文给出这些参数如表所示,假设杆的质量是均匀分布的,并且不考虑系统的摩擦。

物理量数值
小车质量( M M M) 2 k g 2kg 2kg
摆杆质量( m m m) 0.1 k g 0.1kg 0.1kg
摆杆长度( 2 l 2l 2l) 1 m 1m 1m

1.1.牛顿运动定律分析

先对小车进行受力分析,水平方向有 M x ¨ + H = u \begin{aligned} M\ddot{x}+H = u \end{aligned} Mx¨+H=u

再对摆进行受力分析,水平方向有 H = m d 2 d t 2 ( x + l sin ⁡ θ ) \begin{aligned} H = m\dfrac{d^2}{dt^2}(x+l\sin\theta) \end{aligned} H=mdt2d2(x+lsinθ)

H = m x ¨ + m l ( θ ¨ cos ⁡ θ − θ ˙ 2 sin ⁡ θ ) \begin{aligned} H = m\ddot{x}+ml(\ddot{\theta}\cos{\theta}-\dot{\theta}^2\sin{\theta}) \end{aligned} H=mx¨+ml(θ¨cosθθ˙2sinθ)

摆的竖直方向有 V − m g = m d 2 d t 2 ( l cos ⁡ θ ) \begin{aligned} V -mg = m\dfrac{d^2}{dt^2}(l\cos{\theta}) \end{aligned} Vmg=mdt2d2(lcosθ)

V = m g − m l ( θ ¨ sin ⁡ θ + θ ˙ 2 cos ⁡ θ ) \begin{aligned} V = mg -ml(\ddot{\theta}\sin{\theta} + \dot{\theta}^2\cos\theta) \end{aligned} V=mgml(θ¨sinθ+θ˙2cosθ)

对摆应用动量矩定理,以 θ \theta θ顺时针方向旋转为正,设摆绕着质心的转动惯量为 I I I,则有
V l sin ⁡ θ − H l cos ⁡ θ = I θ ¨ \begin{aligned} Vl\sin\theta - Hl\cos\theta = I \ddot{\theta} \end{aligned} VlsinθHlcosθ=Iθ¨

整理可得 ( M + m ) x ¨ + m l θ ¨ cos ⁡ θ − m l θ ˙ 2 sin ⁡ θ = u m l x ¨ cos ⁡ θ + ( I + m l 2 ) θ ¨ − m g l sin ⁡ θ = 0 \begin{aligned} \begin{array}{l} (M+m) \ddot{x}+m l \ddot{\theta}\cos \theta -m l\dot{\theta}^{2} \sin \theta =u \\ m l\ddot{x} \cos \theta +(I+m l^{2}) \ddot{\theta}-m g l \sin \theta=0 \\ \end{array}\end{aligned} (M+m)x¨+mlθ¨cosθmlθ˙2sinθ=umlx¨cosθ+(I+ml2)θ¨mglsinθ=0

写成矩阵形式如下: [ M + m m l cos ⁡ θ m l cos ⁡ θ I + m l 2 ] [ x ¨ θ ¨ ] + [ 0 − m l θ ˙ sin ⁡ θ 0 0 ] [ x ˙ θ ˙ ] = ( u m g l sin ⁡ θ ) \begin{aligned} {\left[\begin{array}{cc} M+m & m l \cos \theta \\ m l \cos \theta & I+m l^{2} \end{array}\right]\left[\begin{array}{c} \ddot{x} \\ \ddot{\theta} \end{array}\right]+\left[\begin{array}{cc} 0 & -m l \dot{\theta}\sin \theta \\ 0 & 0 \end{array}\right]\left[\begin{array}{l} \dot{x} \\ \dot{\theta} \end{array}\right]=\left(\begin{array}{c} u \\ m g l \sin \theta \end{array}\right)} \end{aligned} [M+mmlcosθmlcosθI+ml2][x¨θ¨]+[00mlθ˙sinθ0][x˙θ˙]=(umglsinθ)

1.2.欧拉-拉格朗日方程分析

欧拉-拉格朗日方程可以描述为 d d t ( ∂ T ∂ q ˙ ) − ∂ T ∂ q + ∂ V ∂ q = F \begin{aligned} \dfrac{d}{dt}\left( \dfrac{\partial T}{\partial\dot q}\right) - \dfrac{\partial T}{\partial q} + \dfrac{\partial V}{\partial q} = F \end{aligned} dtd(q˙T)qT+qV=F 其中 q q q为系统的广义坐标系, F F F为系统的广义力, T T T为系统动能, V V V 为系统势能。

则对于一阶倒立摆系统来说,选择小车位移 x x x和倒立摆的角度 θ \theta θ作为广义坐标,小车推力 u u u为广义力,则有
T = 1 2 M x ˙ 2 + 1 2 I θ ˙ 2 + 1 2 m { [ d d t ( x + l sin ⁡ θ ) ] 2 + [ d d t ( l cos ⁡ θ ) ] } V = m g l cos ⁡ θ \begin{aligned} \begin{array}{l} T=\frac{1}{2} M \dot{x}^{2}+\frac{1}{2} I \dot{\theta}^{2}+\frac{1}{2} m\left\{\left[\frac{d}{d t}(x+l \sin \theta)\right]^{2}+\left[\frac{d}{d t}(l \cos \theta)\right]\right\}\\ V=mgl \cos \theta \end{array}\end{aligned} T=21Mx˙2+21Iθ˙2+21m{[dtd(x+lsinθ)]2+[dtd(lcosθ)]}V=mglcosθ

计算欧拉-拉格朗日方程中的各项,有 d d t ( ∂ T ∂ x ˙ ) = ( M + m ) x ¨ + m l cos ⁡ θ θ ¨ − m l sin ⁡ θ θ ˙ 2 ∂ T ∂ x = 0 , ∂ V ∂ x = 0 d d t ( ∂ T ∂ θ ˙ ) = I θ ¨ + m l ( x ¨ cos ⁡ θ − x ˙ sin ⁡ θ θ ˙ + l θ ¨ ) ∂ T ∂ θ = − m l x ˙ θ ˙ sin ⁡ θ , ∂ V ∂ θ = − m g l sin ⁡ θ , \begin{aligned} \begin{array}{l} \dfrac{d}{d t}\left(\dfrac{\partial T}{\partial \dot{x}}\right)=(M+m) \ddot{x}+m l \cos \theta \ddot{\theta}-m l \sin \theta \dot{\theta}^{2} \\ \dfrac{\partial T}{\partial x}=0, \dfrac{\partial V}{\partial x}=0 \\ \frac{d}{d t}\left(\frac{\partial T}{\partial\dot{\theta}}\right)= I\ddot{\theta}+ml(\ddot{x}\cos{\theta} - \dot{x}\sin{\theta}\dot{\theta}+l\ddot{\theta}) \\ \dfrac{\partial T}{\partial \theta} = -ml\dot{x}\dot{\theta}\sin{\theta}, \dfrac{\partial V}{\partial \theta} = -mgl\sin \theta, \end{array}\end{aligned} dtd(x˙T)=(M+m)x¨+mlcosθθ¨mlsinθθ˙2xT=0,xV=0dtd(θ˙T)=Iθ¨+ml(x¨cosθx˙sinθθ˙+lθ¨)θT=mlx˙θ˙sinθ,θV=mglsinθ,

带入欧拉-拉格朗日方程整理可得 ( M + m ) x ¨ + m l θ ¨ cos ⁡ θ − m l θ ˙ 2 sin ⁡ θ = u m l x ¨ cos ⁡ θ + ( I + m l 2 ) θ ¨ + m g l sin ⁡ θ = 0 \begin{aligned} \begin{array}{l} (M+m) \ddot{x}+m l \ddot{\theta}\cos \theta -m l\dot{\theta}^{2} \sin \theta =u \\ m l\ddot{x} \cos \theta +(I+m l^{2}) \ddot{\theta}+m g l \sin \theta=0 \\ \end{array}\end{aligned} (M+m)x¨+mlθ¨cosθmlθ˙2sinθ=umlx¨cosθ+(I+ml2)θ¨+mglsinθ=0

[ M + m m l cos ⁡ θ m l cos ⁡ θ I + m l 2 ] [ x ¨ θ ¨ ] + [ 0 − m l sin ⁡ θ θ ˙ 0 0 ] [ x ˙ θ ˙ ] = [ u m g l sin ⁡ θ ] \begin{aligned} \left[\begin{array}{cc} M+m & m l \cos \theta \\ m l \cos \theta & I+m l^{2} \end{array}\right]\left[\begin{array}{c} \ddot{x} \\ \ddot{\theta} \end{array}\right]+\left[\begin{array}{cc} 0 & -m l \sin \theta \dot{\theta} \\ 0 & 0 \end{array}\right]\left[\begin{array}{c} \dot{x} \\ \dot{\theta} \end{array}\right]=\left[\begin{array}{c} u \\ m g l \sin \theta \end{array}\right] \end{aligned} [M+mmlcosθmlcosθI+ml2][x¨θ¨]+[00mlsinθθ˙0][x˙θ˙]=[umglsinθ]

可见使用欧拉-拉格朗日方程建立的系统动力学方程与使用牛顿运动定律分析得到的系统动力学方程相同,因此初步验证了所建立的系统动态方程的正确性。

2.Simulink仿真

利用上面建立的一阶倒立摆的系统动力学方程,可以在Simulink中搭建系统的仿真模型,如图所示。

一阶倒立摆simulink仿真模型

假设系统的初始状态为 x = 0 , θ = π 6 x=0,\theta=\frac{\pi}{6} x=0,θ=6π,且系统无输入,则此后小车位置 x x x和倒立摆的摆角 θ \theta θ的变化如图所示。

使用Simulink建模的一阶倒立摆初始响应

3.使用SimMechancis仿真

使用SimMechanics可以直接搭建物理模型,只需要对物理模型进行参数赋值和关节的连接就可以完成一个仿真物理模型的搭建。因此这里可以使用SimMechanics建立物理模型进行仿真,并和上面动力学建模的仿真结果进行对比,从而验证上面推导的动力学方程的正确性。如图所示,是使用SimMechanicalcs建立的物理模型。其中增益模块的增益值-1是由于SimMechanicalcs中的 θ \theta θ方向和上面推导的方向相反。如图所示,是使用SimMechanicalcs的仿真结果。

一阶倒立摆SimMechancis模型

一阶倒立摆SimMechancis模型的动态响应

由图可见这个结果和上面动力学建模并使用Simulink仿真的结果完全相同,从而证明了之前动力学建模的正确性。

4.在平衡点附近模型线性化

为了使用线性系统理论的知识对系统进行分析和控制,需要对上述的非线性系统在在平衡点附近进行线性化。系统平衡点附近时, θ \theta θ很小,并且假设其角速度 θ ˙ \dot{\theta} θ˙也很小,则可进行近似处理: cos ⁡ θ ≈ 1 , sin ⁡ θ ≈ θ , sin ⁡ θ θ ˙ ≈ 0 \cos{\theta} \approx 1, \sin\theta \approx \theta, \sin \theta \dot{\theta} \approx0 cosθ1,sinθθ,sinθθ˙0。从而得到一阶倒立摆系统在平衡点附近的线性化模型为
[ M + m m l m l I + m l 2 ] [ x ¨ θ ¨ ] = [ u m g l θ ] \begin{aligned} \left[\begin{array}{cc} M+m & m l \\ m l & I+m l^{2} \end{array}\right]\left[\begin{array}{c} \ddot{x} \\ \ddot{\theta} \end{array}\right]=\left[\begin{array}{c} u \\ m g l \theta \end{array}\right] \end{aligned} [M+mmlmlI+ml2][x¨θ¨]=[umglθ]

定义系统的状态变量为 ( x 1 , x 2 , x 3 , x 4 ) = ( x , x ˙ , θ , θ ˙ ) (x_1,x_2,x_3,x_4)=(x,\dot{x},\theta,\dot{\theta}) (x1,x2,x3,x4)=(x,x˙,θ,θ˙),系统的输入量为小车外力 u u u,系统输出为小车的位移 x x x,则可得系统的状态空间方程为
[ x ˙ x ¨ θ ˙ θ ¨ ] = [ 0 1 0 0 0 0 − m 2 g l 2 I ( M + m ) + M m l 2 0 0 0 0 1 0 0 m g l ( M + m ) I ( M + m ) + M m l 2 0 ] [ x x ˙ θ θ ˙ ] + [ 0 I + m l 2 I ( M + m ) + M m l 2 0 − m l I ( M + m ) + M m l 2 ] u y = x = [ 1 0 0 0 ] [ x x ˙ θ θ ˙ ] \begin{aligned} \begin{array}{c} {\left[\begin{array}{c} \dot{x} \\ \ddot{x} \\ \dot{\theta} \\ \ddot{\theta} \end{array}\right]=\left[\begin{array}{cccc} 0 & 1 & 0 & 0 \\ 0 & 0 & \dfrac{-m^{2} g l^{2}}{I(M+m)+M m l^{2}} & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & \dfrac{m g l(M+m)}{I(M+m)+M m l^{2}} & 0 \end{array}\right]\left[\begin{array}{c} x \\ \dot{x} \\ \theta \\ \dot{\theta} \end{array}\right]+\left[\begin{array}{c} 0 \\ \dfrac{I+m l^{2}}{I(M+m)+M m l^{2}} \\ 0 \\ \dfrac{-m l}{I(M+m)+M m l^{2}} \end{array}\right] u} \\ y=x=\left[\begin{array}{llll} 1 & 0 & 0 & 0 \end{array}\right]\left[\begin{array}{c} x \\ \dot{x} \\ \theta \\ \dot{\theta} \end{array}\right] \end{array}\end{aligned} x˙x¨θ˙θ¨=000010000I(M+m)+Mml2m2gl20I(M+m)+Mml2mgl(M+m)0010xx˙θθ˙+0I(M+m)+Mml2I+ml20I(M+m)+Mml2mluy=x=[1000]xx˙θθ˙

带入系统参数,可得一阶倒立摆系统的状态空间方程为 [ x ˙ x ¨ θ ˙ θ ¨ ] = [ 0 1 0 0 0 0 − 0.3630 0 0 0 1 0 0 15.2444 0 ] [ x x ˙ θ θ ˙ ] + [ 0 0.4938 0 − 0.7407 ] u y = [ 1 0 0 0 ] [ x x ˙ θ θ ˙ ] \begin{aligned} \begin{array}{c} {\left[\begin{array}{c} \dot{x} \\ \ddot{x} \\ \dot{\theta} \\ \ddot{\theta} \end{array}\right]=\left[\begin{array}{cccc} 0 & 1 & 0 & 0 \\ 0 & 0 & -0.3630 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 15.2444 & 0 \end{array}\right]\left[\begin{array}{c} x \\ \dot{x} \\ \theta \\ \dot{\theta} \end{array}\right]+\left[\begin{array}{c} 0 \\ 0.4938 \\ 0 \\ -0.7407 \end{array}\right] u} \\ y=\left[\begin{array}{llll} 1 & 0 & 0 & 0 \end{array}\right]\left[\begin{array}{c} x \\ \dot{x} \\ \theta \\ \dot{\theta} \end{array}\right] \end{array} \end{aligned} x˙x¨θ˙θ¨=0000100000.3630015.2444010xx˙θθ˙+00.493800.7407uy=[1000]xx˙θθ˙

5.系统能控性、能观性和稳定性分析

5.1.能控性分析

对于一个连续的时间系统: x ˙ = A x + B u y = C x + D u \begin{aligned} \begin{matrix} \dot{x}=Ax+Bu \\ y= Cx+Du \end{matrix}\end{aligned} x˙=Ax+Buy=Cx+Du

系统能控的充要条件是系统的能控性矩阵为行满秩阵,即 r a n k ( S c ) = r a n k ( [ B A B A 2 B … A n − 1 B ] ) = n \begin{aligned} rank(S_c) = rank(\begin{bmatrix} B & AB & A^2B & \dots & A^{n-1}B \end{bmatrix})=n\end{aligned} rank(Sc)=rank([BABA2BAn1B])=n

根据上面可控性的原理,对系统进行可控性分析,将式中的 A , B A,B A,B代入判据中,编写MATLAB代码如下:

M = 2;
m = 0.1;
g = 9.8;
l =0.5;
I = 1/3*m*l^2;

a23 = -m*m*g*l*l/(I*(m+M)+M*m*l*l);
a43 = m*g*l*(M+m)/(I*(m+M)+M*m*l*l);
b2 = (I+m*l*l)/(I*(m+M)+M*m*l*l);
b4 = -m*l/(I*(m+M)+M*m*l*l);

A = [0 1 0 0;
    0 0 a23 0;
    0 0 0 1;
    0 0 a43 0];
B = [0;
    b2;
    0;
    b4];
C =[1 0 0 0]; 

S_c = [B A*B A^2*B A^3*B]
fprintf('rank(S_c) = %d\n', rank(S_c));

程序运行结果为: r a n k ( S c ) = 4 \begin{aligned} rank(S_c)=4\end{aligned} rank(Sc)=4

因此系统是状态完全可控的。

5.2.能观性分析

系统能观的充要条件是系统的能观性矩阵为列满秩阵,即 r a n k ( Q o ) = r a n k ( [ C C A C A 2 ⋮ C A n − 1 ] ) = n \begin{aligned} rank(Q_o) = rank(\begin{bmatrix} C \\C A \\ CA^2 \\ \vdots \\ CA^{n-1} \end{bmatrix})=n\end{aligned} rank(Qo)=rank(CCACA2CAn1)=n

根据上面能观性原理,继续编写MATLAB代码判断系统能观性

Q_o = [C;
    C*A;
    C*A^2;
    C*A^3];
fprintf('rank(Q_o) = %d\n', rank(Q_o));

程序运行结果为: r a n k ( Q o ) = 4 \begin{aligned} rank(Q_o)=4\end{aligned} rank(Qo)=4

因此系统是能观的。

5.3.稳定性分析

5.3.1.Routh-Hurwitz判据

劳斯–赫尔维茨稳定性判据给出线性定常系统 ς ( A , B , C ) \varsigma(A,B,C) ς(A,B,C)输出稳定的充要条件是其传递函数
Φ = C ( s I − A ) − 1 B \begin{aligned} \varPhi = C(sI-A)^{-1}B\end{aligned} Φ=C(sIA)1B
的所有极点都位于复平面S的左半平面,即系统特征方程 ∣ λ I − A ∣ = 0 \mid \lambda I - A\mid = 0 λIA=0的特征根具有负实部。
使用Matlab计算矩阵A的特征值:

disp('eig(A)=');
eig(A)

程序输出结果为 λ = [ 0 , 0 , 3.9044 , − 3.9044 ] \lambda = \left[0, 0, 3.9044, -3.9044\right] λ=[0,0,3.9044,3.9044],存在复平面右半平面的特征根,因此系统是不稳定的。

5.3.2.Lyapunov函数

Lyapunov定理给出线性时不变系统在平衡点 x e = 0 x_e = 0 xe=0处渐进稳定的充分必要条件是对任意给定的对称正定矩阵 Q Q Q,存在一个对称正定矩阵 P P P,满足李雅普诺夫方程 A ⊤ P + P A = − Q \begin{aligned} A^\top P + PA = -Q \end{aligned} AP+PA=Q

使用MATLAB进行Lyapunov方程的求解,程序如下:

P = lyap(A',eye(4))

程序运行结果为 λ = 1.0 e + 33 × [ − 0.0000 , − 0.0000 , 0.0000 , 3.0550 ] \lambda = 1.0e+33\times\left[-0.0000, -0.0000,0.0000, 3.0550\right] λ=1.0e+33×[0.0000,0.0000,0.0000,3.0550]。由于存在数值稳定性问题仍然解得 P P P,但是 P P P不是正定矩阵,因此系统不稳定。(这里应该有点问题)

6.基于极点配置方法的控制器设计

根据上述分析可知系统存在复平面右半平面的极点导致系统不稳定,因此需要设计一个状态反馈控制器 u = − K x u=-Kx u=Kx,配置系统闭环极点全部到复平面左半平面。

假设希望将系统的闭环极点配置到 μ 1 = − 1 , μ 2 = − 2 , μ 3 = − 1 + j 3 , μ 4 = − 1 − j 3 \mu_1=-1, \mu_2=-2, \mu_3=-1+j\sqrt{3}, \mu_4=-1-j\sqrt{3} μ1=1,μ2=2,μ3=1+j3 ,μ4=1j3 。则可以通过调用MATLAB中的acker和place命令来方便地计算反馈矩阵K,代码如下:

% 调节器的极点配置问题
J = [-1 -2 -1+j*sqrt(3) -1-j*sqrt(3)];
K1 = acker(A,B,J); 
K2 = place(A,B,J); 
disp('K1 = ');
disp(K1);
disp('K2 = ');
disp(K2);

程序输出结果为 K 1 = K 2 = ( − 1.1020 , − 2.2041 , − 37.5147 , − 8.2194 ) K1 = K2 = (-1.1020, -2.2041, -37.5147, -8.2194) K1=K2=(1.1020,2.2041,37.5147,8.2194),可见对于单输入系统来说使用acker和place命令得到的结果是一样的。

为了检验上述极点配置的闭环系统的性能,使用在平衡点线性化的系统配置的极点K对非线性系统进行极点配置,并在Simulink中搭建如图所示,其中math-model模块是一阶倒立摆的非线性数学模型。

一阶倒立摆的极点配置

假设系统初始状态为 [ x 1 , x 2 , x 3 , x 4 ] = [ x , x ˙ , θ , θ ˙ ] = [ 0 , 0 , 5 ∘ , 0 ] \left[x_1,x_2,x_3,x_4\right]=\left[x,\dot{x},\theta,\dot{\theta}\right]=\left[0,0,5^{\circ},0\right] [x1,x2,x3,x4]=[x,x˙,θ,θ˙]=[0,0,5,0],运行Simulink仿真模型,得到系统的闭环响应应如图所示,由图可见系统在微小扰动的情况下仍然能够保持稳定,说明所设计的状态反馈控制器是有效的。

一阶倒立摆极点配置的闭环系统状态响应

7.状态观测器设计

7.1.全阶观测器

定义线性系统的观测器的数学模型为
x ~ ˙ = ( A − K e C ) x ~ + B u + K e y \begin{aligned} \dot{\widetilde{x}} = (A-K_eC)\widetilde{x}+Bu+K_ey \end{aligned} x ˙=(AKeC)x +Bu+Key
其中, x ~ \widetilde{x} x 为估计状态, C x ~ C\widetilde{x} Cx 为估计输出。对于观测器的极点配置,一般来说其响应速度至少要比所考虑的闭环系统快2至5倍。因此假设所配置的观测器极点为 μ 1 = − 2 , μ 2 = − 6 , μ 3 = − 2 − j 2 3 , μ 4 = − 2 + j 2 3 \mu_1 = -2, \mu_2 = -6, \mu_3 = -2-j2\sqrt{3}, \mu_4 = -2+j2\sqrt{3} μ1=2,μ2=6,μ3=2j23 ,μ4=2+j23

前文已经验证,取系统的输出变量为 x x x,系统是能观的。因此这里可以直接进行观测器的配置。考虑原系统的对偶系统,可以证明原系统的对偶系统和全解观测器的极点配置问题是等价的,因此可以使用状态反馈极点配置的方法进行极点配置,MATLAB代码如下:

A_ = A';
B_ = C';
C_ = B';
J_ = [-2 -6 -2-j*2*sqrt(3) -2+j*2*sqrt(3)];
Ke = (acker(A_, B_, J_))';
disp('Ke = ');
disp(Ke);

程序输出结果为 K e = ( 12.0 , 75.2 , − 988.9 , − 3689.2 ) Ke = (12.0, 75.2, -988.9, -3689.2) Ke=(12.0,75.2,988.9,3689.2)

7.2.最小阶观测器

最小阶观测器由全阶观测器中经过变量替换得到,可由下式描述:
η ~ ˙ = A ^ η ~ + B ^ y + F ^ u \begin{aligned} \dot{\tilde{\eta}}=\hat{\boldsymbol{A}} \tilde{\boldsymbol{\eta}}+\hat{\boldsymbol{B}} y+\hat{\boldsymbol{F}} \boldsymbol{u}\end{aligned} η~˙=A^η~+B^y+F^u
其中, η = x b − K e y η ~ = x ~ b − K e y A ^ = A b b − K e A a b B ^ = A ^ K e + A b a − K e A a a F ^ = B b − K e B a \begin{aligned} \begin{array}{l} \boldsymbol{\eta}= \boldsymbol{x}_{\mathrm{b}}-\boldsymbol{K_e} y\\ \tilde{\boldsymbol{\eta}}=\tilde{\boldsymbol{x}}_{\mathrm{b}}-\boldsymbol{K_e} y\\ \hat{\boldsymbol{A}}=\boldsymbol{A}_{\mathrm{bb}}-\boldsymbol{K_e} \boldsymbol{A}_{\mathrm{ab}} \\ \hat{\boldsymbol{B}} = \hat{\boldsymbol{A}} \boldsymbol{K_e}+\boldsymbol{A}_{\mathrm{ba}}-\boldsymbol{K_e} A_{\mathrm{aa}}\\ \hat{\boldsymbol{F}}= \boldsymbol{B}_{\mathrm{b}}-\boldsymbol{K_e} \boldsymbol{B}_{\mathrm{a}} \end{array}\end{aligned} η=xbKeyη~=x~bKeyA^=AbbKeAabB^=A^Ke+AbaKeAaaF^=BbKeBa
则针对 A ^ \hat{\boldsymbol{A}} A^进行极点配置即可。

对于一阶倒立摆系统来说,状态变量 x x x等于输出 y y y,因此可以直接测量,剩余的状态变量这是不可测量的部分。对状态空间模型划分如下:
x = [ x a x b ] = [ x x ˙ θ θ ˙ ] , A = [ 0 1 0 0 0 0 − 0.3630 0 0 0 0 1 0 0 15.2444 0 ] , B = [ 0 0.4938 0 − 0.7407 ] \begin{aligned} x = \left[ \begin{array}{c} x_a \\ \hdashline \boldsymbol {x_b} \end{array}\right] = \left[ \begin{array}{c} x \\ \hdashline \dot{x} \\ \theta \\ \dot{\theta} \end{array} \right] , A = \left[\begin{array}{c:ccc} 0 & 1 & 0 & 0 \\ \hdashline 0 & 0 & -0.3630 &0\\ 0 & 0 & 0 & 1 \\ 0 & 0 & 15.2444 & 0 \end{array}\right] , B = \left[ \begin{array}{c} 0 \\ \hdashline 0.4938 \\ 0 \\ -0.7407 \end{array} \right]\end{aligned} x=[xaxb]=xx˙θθ˙,A=0000100000.3630015.24440010,B=00.493800.7407

划分后的降阶观测器是3阶系统,假设期望配置的极点位置为 μ 1 = − 6 , μ 2 = − 2 − j 2 3 , μ 3 = − 2 + j 2 3 \mu_1 = -6, \mu_2 = -2-j2\sqrt{3}, \mu_3 = -2+j2\sqrt{3} μ1=6,μ2=2j23 ,μ3=2+j23 ,则可编写MATLAB代码如下:
编写代码:

Aaa = A(1, 1);
Aab = A(1, 2:end);
Aba = A(2:end, 1);
Abb = A(2:end, 2:end);
J_j = [-6 -2+j*2*sqrt(3) -2-j*2*sqrt(3)];
Ke_j = (acker(Abb',Aab',J_j))';
disp('Ke_j = ');
disp(Ke_j);

程序输出为 K e j = ( 10 , − 152.2041 , − 684.4898 ) Ke_j = (10, -152.2041, -684.4898) Kej=(10,152.2041,684.4898)

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

8.1.基于全阶观测器的状态反馈控制

对于线性系统来说,基于全阶观测器的状态反馈控制系统的状态方程为
[ x ˙ e ˙ ] = [ A − B K 0 A − K e C ] [ x e ] \begin{aligned} \begin{bmatrix} \dot{x} \\ \dot{e} \end{bmatrix} = \begin{bmatrix} A & -BK \\ 0 & A-K_eC \end{bmatrix} \begin{bmatrix} x \\ e \end{bmatrix} \end{aligned} [x˙e˙]=[A0BKAKeC][xe]

但是这里一阶倒立摆系统是非线性系统,上述观测器和极点配置都是使用线性化的模型得到的,因此式并不能完全真实反映系统状态。

为了检验基于全阶观测器的状态反馈控制效果,搭建具有全阶观测器的状态反馈控制器的非线性系统Simulink仿真模型如图所示。

使用全阶观测器的状态反馈控制Simulink仿真模型

Simulink仿真模型中,全阶状态观测器由于设计变量较多,使用Simulink模块搭建较为复杂,因此编写s-function来实现,代码如下:

% 一阶倒立摆系统的全阶观测器s-function建模
function [sys,x0,str,ts,simStateCompliance]=
order1_all_observer_sfun(t,x,u,flag, x_0, th_0)
switch flag,
    case 0,
        [sys,x0,str,ts,simStateCompliance]=
        mdlInitializeSizes(t,x,u, x_0, th_0);
    case 1,
        sys=mdlDerivatives(t,x,u);
    case 2,
        sys=mdlUpdate(t,x,u);
    case 3,
        sys=mdlOutputs(t,x,u);
    case 4,
        sys=mdlGetTimeOfNextVarHit(t,x,u);
    case 9,
        sys=mdlTerminate(t,x,u);
    otherwise
        DAStudio.error('Simulink:blocks:unhandledFlag',
        num2str(flag));
end
% 主函数结束

% ---------------------------------------------
function [sys,x0,str,ts,simStateCompliance]=
mdlInitializeSizes(t,x,u,x_0, th_0)
% 初始化
sizes = simsizes;% 生成sizes数据结构

sizes.NumContStates  = 4;% 连续状态数, 分别是x', theta1', theta2', x, theta1, theta2
sizes.NumDiscStates  = 0;% 离散状态数,缺省为 0
sizes.NumOutputs     = 4;% 输出量个数,缺省为 0, 
sizes.NumInputs      = 1;% 输入量个数,缺省为 0, 这里的输入取为e
sizes.DirFeedthrough = 1;% 是否存在直接馈通。1:存在;0:不存在,缺省为 1 
sizes.NumSampleTimes = 1;   % at least one sample time is needed

sys = simsizes(sizes);
x0  = [x_0; 0; th_0; 0];% 设置初始状态
str = [];% 保留变量置空
ts  = [0 0]; % 连续系统
simStateCompliance = 'UnknownSimState';
% end mdlInitializeSizes

% ---------------------------------------------
function sys=mdlDerivatives(t, x, u)
%  计算导数例程子函数
M = 2; m = 0.1; l =0.5; I = 1/3*m*l^2; g = 9.8;
a23 = -m*m*g*l*l/(I*(m+M)+M*m*l*l);
a43 = m*g*l*(M+m)/(I*(m+M)+M*m*l*l);
b2 = (I+m*l*l)/(I*(m+M)+M*m*l*l);
b4 = -m*l/(I*(m+M)+M*m*l*l);
A = [0 1 0 0;
    0 0 a23 0;
    0 0 0 1;
    0 0 a43 0];
b = [0; b2; 0; b4]; 
K = [-1.1020, -2.2041, -37.5147, -8.2194];  
Ke = [12; 75.2; -988.9; -3689.2];
sys = (A-b*K)*x + Ke*u ;  % 注意这里的u就是x(1)的观测误差e(1)

% ---------------------------------------------
function sys=mdlUpdate(t,x,u)
%3. 状态更新例程子函数
sys = [];

% ---------------------------------------------
function sys=mdlOutputs(t,x,u)
%4. 计算输出例程子函数
sys=x;

% ---------------------------------------------
function sys=mdlGetTimeOfNextVarHit(t,x,u)
% 5. 计算下一个采样时间,仅在系统是变采样时间系统时调用
sampleTime = 1;    %  Example, set the next hit to be one second later.
sys = t + sampleTime;

% ---------------------------------------------
function sys=mdlTerminate(t,x,u)
% 6. 仿真结束时要调用的例程函数
sys = [];

假设系统初始状态为 [ x 1 , x 2 , x 3 , x 4 ] = [ x , x ˙ , θ , θ ˙ ] = [ 0 , 0 , 5 ∘ , 0 ] \left[x_1,x_2,x_3,x_4\right]=\left[x,\dot{x},\theta,\dot{\theta}\right]=\left[0,0,5^{\circ},0\right] [x1,x2,x3,x4]=[x,x˙,θ,θ˙]=[0,0,5,0],并且状态观测器的初始观测误差为 [ e 1 , e 2 , e 3 , e 4 ] = [ 0 , 0 , 5 ∘ , 0 ] \left[e_1,e_2,e_3,e_4\right]=\left[0,0,5^{\circ},0\right] [e1,e2,e3,e4]=[0,0,5,0],运行Simulink仿真模型,系统的动态响应如图所示,全阶观测器的观测误差如图,可见系统可以很好地稳定。

基于全阶观测器的状态反馈控制动态响应

全阶观测器的观测误差

8.2.基于最小观测器的状态反馈控制

对于线性系统来说,基于最小阶观测器的状态反馈控制系统的状态方程为
[ x ˙ e ˙ ] = [ A − B K B K b 0 A b b − K e A a b ] [ x e ] \begin{aligned} \begin{bmatrix} \dot x \\ \dot{e} \end{bmatrix} = \begin{bmatrix} A - BK & BK_b \\ 0 & A_{bb} - K_eA_{ab} \end{bmatrix} \begin{bmatrix} x \\ e \end{bmatrix}\end{aligned} [x˙e˙]=[ABK0BKbAbbKeAab][xe]

同理可知,该方程并不能完全准确的反映一阶倒立摆系统的响应。为了检验基于最小阶观测器的状态反馈控制效果,搭建具有最小阶观测器的状态反馈控制器的非线性系统Simulink仿真模型如图所示。

使用最小阶观测器的状态反馈控制Simulink仿真模型
Simulink仿真模型中,最小阶状态观测器由于设计变量较多,使用Simulink模块搭建较为复杂,因此编写s-function来实现,代码如下:

% 一阶倒立摆系统的最小阶观测器s-function建模
function [sys,x0,str,ts,simStateCompliance] =
order1_min_observer_sfun(t,x,u,flag, x_0, th_0)
switch flag,
    case 0,
        [sys,x0,str,ts,simStateCompliance]=
        mdlInitializeSizes(t,x,u, x_0, th_0);
    case 1,
        sys=mdlDerivatives(t,x,u);
    case 2,
        sys=mdlUpdate(t,x,u);
    case 3,
        sys=mdlOutputs(t,x,u);
    case 4,
        sys=mdlGetTimeOfNextVarHit(t,x,u);
    case 9,
        sys=mdlTerminate(t,x,u);
    otherwise
        DAStudio.error('Simulink:blocks:unhandledFlag',
        num2str(flag));
end
% 主函数结束

% ---------------------------------------------
function [sys,x0,str,ts,simStateCompliance]=
mdlInitializeSizes(t,x,u,x_0, th_0)
% 初始化
sizes = simsizes;% 生成sizes数据结构

sizes.NumContStates  = 3;% 连续状态数
sizes.NumDiscStates  = 0;% 离散状态数,缺省为 0
sizes.NumOutputs     = 4;% 输出量个数,缺省为 0, 
sizes.NumInputs      = 2;% 输入量个数,缺省为 0, 这里的输入取为输入u和y
sizes.DirFeedthrough = 1;% 是否存在直接馈通。1:存在;0:不存在,缺省为 1 
sizes.NumSampleTimes = 1;   % at least one sample time is needed
sys = simsizes(sizes);       
x0  = [0; th_0; 0] - [10; -152.2041; -684.4898]*x_0;  % 设置初始状态
str = [];% 保留变量置空
ts  = [0 0]; % 连续系统
simStateCompliance = 'UnknownSimState';
% end mdlInitializeSizes

% ---------------------------------------------
function sys=mdlDerivatives(t, x, u)
%  计算导数例程子函数
M = 2; m = 0.1; l =0.5; I = 1/3*m*l^2; g = 9.8;
a23 = -m*m*g*l*l/(I*(m+M)+M*m*l*l);
a43 = m*g*l*(M+m)/(I*(m+M)+M*m*l*l);
b2 = (I+m*l*l)/(I*(m+M)+M*m*l*l);
b4 = -m*l/(I*(m+M)+M*m*l*l);
A = [0 1 0   0;
     0 0 a23 0;
     0 0 0   1;
     0 0 a43 0];
B = [0; b2; 0; b4]; 
Ke_j = [10;  -152.2041; -684.4898];
A_hat = A(2:end, 2:end) - Ke_j*A(1, 2:end);
B_hat = A_hat*Ke_j + A(2:end, 1) - Ke_j*A(1,1);
F_hat = B(2:end) - Ke_j*B(1);
sys = A_hat*x + B_hat*u(2) + F_hat*u(1) ;  % u1就是输入,u2是原系统输出y

% ---------------------------------------------
function sys=mdlUpdate(t,x,u)
%3. 状态更新例程子函数
sys = [];

% ---------------------------------------------
function sys=mdlOutputs(t,x,u)
%4. 计算输出例程子函数
C_hat = [0 0 0; 1 0 0; 0 1 0; 0 0 1];
D_hat = [1; 10; -152.2041; -684.4898];
sys = C_hat*x + D_hat*u(2);

% ---------------------------------------------
function sys=mdlGetTimeOfNextVarHit(t,x,u)
 % 5. 计算下一个采样时间,仅在系统是变采样时间系统时调用
sampleTime = 1;    %  Example, set the next hit to be one second later.
sys = t + sampleTime;

% ---------------------------------------------
function sys=mdlTerminate(t,x,u)
 % 6. 仿真结束时要调用的例程函数
sys = [];

假设系统初始状态为 [ x 1 , x 2 , x 3 , x 4 ] = [ x , x ˙ , θ , θ ˙ ] = [ 0 , 0 , 5 ∘ , 0 ] \left[x_1,x_2,x_3,x_4\right]=\left[x,\dot{x},\theta,\dot{\theta}\right]=\left[0,0,5^{\circ},0\right] [x1,x2,x3,x4]=[x,x˙,θ,θ˙]=[0,0,5,0],并且最小阶状态观测器的初始观测误差为 [ e 2 , e 3 , e 4 ] = [ 0 , 5 ∘ , 0 ] \left[e_2,e_3,e_4\right]=\left[0,5^{\circ},0\right] [e2,e3,e4]=[0,5,0]。运行Simulink仿真模型,系统的动态响应如图所示,最小阶观测器的观测误差如图,其中由于状态变量 x 1 x_1 x1是小车的位移,即系统输出可以直接测量,因此它的误差一直是0。可见基于最小阶观测器的系统动态响应速度比使用全阶观测器效果更好,这是因为有一个状态变量可以进行准确的观测,因此系统收敛速度更快。

基于最小阶观测器的状态反馈控制动态响应

最小阶观测器的观测误差

9.LQR控制

已知系统的状态空间模型 x ˙ = A x + B u \begin{aligned} \dot{x} &= Ax+Bu \end{aligned} x˙=Ax+Bu
LQR问题就是确定下列最佳控制向量的矩阵 K K K u ( t ) = − K x ( t ) \begin{aligned} u(t)=-Kx(t)\end{aligned} u(t)=Kx(t) 使得下列性能指标达到最小值:
J = ∫ 0 ∞ [ x ⊤ Q x + u ⊤ R u ] d t \begin{aligned} J = \int_0^\infty [\boldsymbol x^\top\boldsymbol{Qx} + \boldsymbol u^\top \boldsymbol{Ru}]dt\end{aligned} J=0[xQx+uRu]dt

选择 Q = I , R = I \boldsymbol Q= \boldsymbol I,\boldsymbol R= \boldsymbol I Q=I,R=I,使用MATLAB求解的代码如下:

Q = eye(4);
R = eye(1);
K_lqr = lqr(A,B,Q,R);
disp('K_lqr = ');
disp(K_lqr);

得到最优状态反馈矩阵为 K l q r = ( − 1 , − 2.7964 , − 53.9967 , − 13.9239 ) K_lqr = (-1, -2.7964, -53.9967, -13.9239) Klqr=(1,2.7964,53.9967,13.9239)

直接使用这个反馈控制矩阵在Simulink中仿真非线性模型的LQR控制,假设系统初始状态为 [ x 1 , x 2 , x 3 , x 4 ] = [ x , x ˙ , θ , θ ˙ ] = [ 0 , 0 , 5 ∘ , 0 ] \left[x_1,x_2,x_3,x_4\right]=\left[x,\dot{x},\theta,\dot{\theta}\right]=\left[0,0,5^{\circ},0\right] [x1,x2,x3,x4]=[x,x˙,θ,θ˙]=[0,0,5,0],系统的动态响应如图所示,可见系统的控制效果非常好。

一阶倒立摆LOR控制的动态响应

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐