一级倒立装置
简介与建模
绪论
倒立摆是自动控制系统中的一个重要模型,在理论和实践中都具有重要意义。首先,在自动控制理论中测试一些算法,如经典控制理论PID控制或现代控制理论LQR在设备控制器中应用算法的全状态反馈,可以测试算法的鲁棒性等性能,二是实际工程中有许多项目都是以倒立摆为模型,在实际生产中首先测试倒立摆,如火箭在上升时能保持姿势稳定等。
倒立摆虽然不易控制,但结构简单,目的明确。无论是直线还是旋转倒立摆,总体都分为转动部分和摆杆部分,目的就是能让摆杆迅速摆起到竖直位置并保持稳定另外在尽可能大的外界干扰的情况下能保持稳定。整体研究分为两类,一类是起摆控制(即快速起摆到静态稳定位置),另一类是稳定摆控制(即使系统稳定)。
稳摆控制一般简化为线性控制,起摆控制难以使用非线性控制器。由于其能力和空间有限,本文讨论了稳摆控制。
简化直线倒立的数学模型和系统分析
对于自动控制系统的研究,首先需要建立数学模型,使用数学工具对系统进行分析和校正,实现控制器设计。倒置摆本身是一个非线性系统,我们很难分析它,所以我们以简单的直线倒置摆为例,以实现摆杆的稳定位置线性化建模。
如倒立摆简单图所示,首先分析系统的应力。对于手推车和摆杆的水平方向,可以得到以下运动方程,其中b是摩擦系数:
M x ¨ b x ˙ N = F N = m x ¨ m l θ ˙ 2 s i n θ ? m l θ ˙ 2 c o s θ M\ddot x b\dot x N=F \\ N=m\ddot x ml\dot \theta^2sin \theta-ml\dot \theta^2cos \theta\\ Mx¨ bx˙ N=FN=mx¨ mlθ˙2sinθ−mlθ˙2cosθ
对推车和摆杆在竖直方向上的合力求和,可以得到以下运动方程 P − m g = m l θ ¨ s i n θ + m l θ ¨ 2 c o s θ P l s i n θ + N l c o s θ = I θ ¨ I = m l 2 / 3 P-mg=ml\ddot \theta sin\theta+ml\ddot \theta^2 cos\theta\\ Plsin\theta+Nlcos\theta=I \ddot \theta\\ I=ml^2/3 P−mg=mlθ¨sinθ+mlθ¨2cosθPlsinθ+Nlcosθ=Iθ¨I=ml2/3 对上面的 公式进行一定的简化 c o s θ ≈ 1 s i n θ ≈ θ θ ˙ 2 ≈ 0 cos \theta\approx 1\\ sin \theta\approx \theta\\ \dot \theta ^2 \approx 0 cosθ≈1sinθ≈θθ˙2≈0 分别结合前两个公式和后三个公式得到下面方程 ( I + m l 2 ) θ ¨ − m g l θ = m l x ¨ ( M + m ) x ¨ + b x ˙ − m l θ ¨ = F = u (I+ml^2) \ddot\theta-mgl\theta=ml\ddot x\\ (M+m)\ddot x+b\dot x-ml\ddot\theta=F=u (I+ml2)θ¨−mglθ=mlx¨(M+m)x¨+bx˙−mlθ¨=F=u
若以F为输入,小车的位置、速度,摆杆的位置、速度为状态变量的话,可以得到以下的倒立摆的state-space,为了方便之后的仿真,这里参考项目直接设定具体数值。
符号 | 物理意义 | 值(单位) |
---|---|---|
F | 作用在小车上的力 | N |
M | 小车质量 | 0.5 kg |
m | 摆杆质量 | 0.2 kg |
x | 小车位移 | m |
b | 摩擦系数 | 0.1 N/m/sec |
L | 摆杆中心和旋转中心的距离 | 0.3 m |
I | 转动惯量 | 0.006 kg.m^2 |
{ [ x ˙ x ¨ θ ˙ θ ¨ ] = [ 0 1 0 0 0 − 0.1818 2.673 0 0 0 0 0 0 − 0.4545 31.18 0 ] [ x x ˙ θ θ ˙ ] + [ 0 1.8182 0 4 , 5455 ] u y = [ x θ ] = [ 1 0 0 0 0 0 1 0 ] [ x x ˙ θ θ ˙ ] + [ 0 0 ] u \begin{cases} \begin{bmatrix} \dot x\\\ddot x\\\dot \theta \\\ddot \theta \end{bmatrix}=\begin{bmatrix} 0 & 1 & 0 &0 \\ 0 & -0.1818 & 2.673 & 0\\ 0 & 0 & 0 & 0\\ 0 & -0.4545 & 31.18 & 0\\ \end{bmatrix}\begin{bmatrix} x\\ \dot x\\ \theta\\ \dot\theta \end{bmatrix}+\begin{bmatrix} 0\\1.8182\\0\\4,5455 \end{bmatrix} u\\ \\\\y=\begin{bmatrix} x \\ \theta \end{bmatrix}=\begin{bmatrix} 1&0&0&0\\0&0&1&0 \end{bmatrix} \begin{bmatrix} x\\ \dot x\\ \theta\\ \dot\theta \end{bmatrix}+\begin{bmatrix} 0\\0 \end{bmatrix}u \end{cases} ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧⎣⎢⎢⎡x˙x¨θ˙θ¨⎦⎥⎥⎤=⎣⎢⎢⎡00001−0.18180−0.454502.673031.180000⎦⎥⎥⎤⎣⎢⎢⎡xx˙θθ˙⎦⎥⎥⎤+⎣⎢⎢⎡01.818204,5455⎦⎥⎥⎤uy=[xθ]=[10000100]⎣⎢⎢⎡xx˙θθ˙⎦⎥⎥⎤+[00]u
其中详细的推到可以查看参考2和5
到这里就得到了倒立摆稳定时数学模型了,接下来就是对于系统的分析了,这里需要知道系统的稳定性1、能控性2进行探讨。
这里直接利用MATLAB进行计算和结果输出:
//系统数学模型的建立和性能分析
clear;clc;
%创建数学模型
A=[0 1 0 0; 0 -0.1818 2.673 0; 0 0 0 1; 0 -0.4545 31.18 0];
B=[0 1.18 0 4.545]';
C=[1 0 0 0;0 0 1 0];
D=[0 0]';
states = {'x' 'x_dot' 'phi' 'phi_dot'};
inputs = {'u'};
outputs = {'x'; 'phi'};
sys_state=ss(A,B,C,D,'statename',states,'inputname',inputs,'outputname',outputs);
%查看特征值,发现存在存在正实部,存在一个极点在S平面的右半平面,系统开环不稳定
[V,D1]=eig(A);
disp('特征值为:')
diag(D1)
%判断系统能观能控性,发现能观能控,我们必须设计控制器来才能进行平衡位置的稳定控制
CONT=ctrb(A,B);
a=rank(CONT);
if a==4
disp('4 能控')
else
disp('非能控')
end
clear a;
OBSER=obsv(A,C);
b=rank(OBSER);
if b==4
disp('4 能观')
else
disp('非能观')
end
clear b;
由结果可知,系统是开环不稳定,即是欠驱动系统,但是又是可观可控性的,所以的我们可以对系统进行校正,选择合适的控制器结构(如串联还是反馈,全反馈还是半反馈),采用合适的算法设计控制器参数,最终实现对倒立摆系统的稳定控制。
仿真部分
在状态空间中设计线性控制器适合使用全状态反馈校正,即是将系统中全部的状态乘上对应的反馈增益然后反馈回去。其中控制器的设计结构如图所示,其中K就是反馈增益矩阵。
其中反馈增益可以通过多种控制理论得到。如有期望闭环极点时,可以利用极点配置法。本文将利用简单常用的LQR最优控制来确定各状态的反馈增益3。其具体做法就是
- 由系统本身和经验选择Q,R;
- 求解黎卡提方程;
- 得到增益矩阵K
LQR算法具体设计和Q、R矩阵设定详细可以查看参考6
其中求解方程部分直接用MATLAB的lqr()函数代替,其他详细代码也可以查看参考3
MATLAB模型建立与仿真
//MATLAB控制器的设计和性能测试
%这里我们利用LQR控制设计全反馈状态线性控制器,建立闭环状态空间
Q = C'*C;
R = 1;
K1 = lqr(A,B,Q,R);
Ac = (A-B*K1);
Bc = B;
Cc = C;
Dc = D;
states = {'x' 'x_dot' 'phi' 'phi_dot'};
inputs = {'r'};
outputs = {'x'; 'phi'};
sys_cl = ss(Ac,Bc,Cc,Dc,'statename',states,'inputname',inputs,'outputname',outputs);
%利用阶跃信号得到系统性能
t = 0:0.01:5;
r =0.2*ones(size(t));%0.2幅值的阶跃信号
[y,t,x]=lsim(sys_cl,r,t);%闭环系统的阶跃响应
[AX,H1,H2] = plotyy(t,y(:,1),t,y(:,2),'plot');
set(get(AX(1),'Ylabel'),'String','小车距离 (m)')
set(get(AX(2),'Ylabel'),'String','摆杆角度 (radians)')
title('闭环系统1的阶跃响应')
%换出不同权重得到不同反馈增益得到的阶跃信号
Q(1,1) = 5000;
Q(3,3) = 100;
K2 = lqr(A,B,Q,R);
Ac = (A-B*K2);
figure(2);
sys_cl = ss(Ac,Bc,Cc,Dc,'statename',stat