基于matlab的一级倒立摆直线运动稳定性控制仿真

目录

一、理论基础

二、MATLAB核心仿真

三、仿真结论分析

四、参考文献 


一、理论基础

       倒立摆系统是是一个具有高阶次、不稳定、多变量、非线性和强藕合特性的不稳定系统。在控制过程中,为了简化直线一级倒立摆系统分析,在建立实际数学模型过程中,忽略了空气阻力和各种摩擦之后,将直线一级倒立摆系统直接抽象成小车和匀质杆组成的系统,如图1所示。

M  小车质量

m  摆杆质量

b  小车摩擦系数

l   摆杆转动轴心到杆质心的长度

I  摆杆惯量

F  加在小车上的力

x  小车位置

 其中,N——小车与摆杆相互作用力的水平方向的分量,

P——小车与摆杆相互作用力的垂直方向的分量。

以下是应用牛顿法建立直线一级倒立摆系统的动力学方程过程:

通过受力分析可知,由小车水平方向所受的合力,可得如下方程:

       由方程组(7)知该系统是明显的非线性系统。为便于控制器的设计,需要将系统在工作点(= 0)进行线性化处理。当摆杆与垂直向上方向之间的夹角与 1(单位为弧度)之比很小时,则可以进行近似处理: 

二、MATLAB核心仿真

R1  = str2double(get(handles.edit5,'string'));
I1  = str2double(get(handles.edit6,'string'));

R2  = str2double(get(handles.edit7,'string'));
I2  = str2double(get(handles.edit8,'string'));

R3  = str2double(get(handles.edit9,'string'));
I3  = str2double(get(handles.edit10,'string'));

R4  = str2double(get(handles.edit11,'string'));
I4  = str2double(get(handles.edit12,'string'));

M   = str2double(get(handles.edit13,'string'));


CC1 = R1 + sqrt(-1)*I1;
CC2 = R2 + sqrt(-1)*I2;
CC3 = R3 + sqrt(-1)*I3;
CC4 = R4 + sqrt(-1)*I4;



k  = str2double(get(handles.edit1,'string'));
V  = str2double(get(handles.edit2,'string'));
dt = 0.01*V;
l  = str2double(get(handles.edit3,'string'));

% M  = 2.0;
m  = 0.1;
g  = 9.81;
TT = str2double(get(handles.edit4,'string'));
%系统初始值
zf = [0 0 0 0]';
z  = [0 0 2 0]';
r  = 0.2;
%创建倒立摆系统
c1 = M*l;
c2 = m*l;
c3 = m*g;
c4 =(M+m)*g;
%倒立摆的四个矩阵,具体可以看理论文档上的说明
A  = [0 1 0 0;c4/c1 0 0 0;0 0 0 1;-c3/M 0 0 0];
B  = [0 -1/c1 0 1/M]';
C  = [1 0 0 0;0 0 1 0];
D  = [0 0]';

%配置极点
cpl =[CC1 CC2 CC3 CC4];
Ks  = place(A,B,cpl);

Y = [];

for i=1:TT
    z1     =(A-B*Ks)*(z-zf);
    z      = z + z1*dt;
    y(:,i) = z;
    
    %动画
    x1 = z(3)-k/2+z(4)*dt*i;x2=z(3)+k/2+z(4)*dt*i;
    y1 =-4;
    y2 =-2.5;
    x4 =(x1+x2)/2+l*sin(z(1));
    y4 = y2+l*cos(z(1));
    
    t  = 0:pi/100:2*pi;
    
    %倒立摆上的球体
    x3 = x4+r*cos(t);
    y3 = y4+r*sin(t);
    axes(handles.axes1);
    plot(x3,y3,'r.');
    hold on
    %轨道
    plot([-40,40],[-4,-4],'k','linewidth',2);
    hold on
    %模拟小车
    plot([x1,x2],[y1,y1],'b','linewidth',2);
    hold on
    plot([x2,x2],[y1,y2],'b','linewidth',2);
    hold on    
    plot([x1,x2],[y2,y2],'b','linewidth',2);
    hold on    
    plot([x1,x1],[y1,y2],'b','linewidth',2);
    hold on    
    %倒立摆
    plot([(x1+x2)/2,x4],[y2,y4],'m','linewidth',2); 
    hold off

    xlabel('小车位移');
    ylabel('高度');
    axis([-30 30 -5 15])
    Y = [Y,(x1+x2)/2];
    axes(handles.axes2);
    plot(Y);
    axis([0,TT,-15,15]);
    xlabel('时间');
    ylabel('小车位移');
    pause(0.001);
    if (i==1)
        pause(0.01);
    end
    if (abs(z(1)-zf(1))<=0.001)&(abs(z(3)-zf(3))<=0.002)
        break;
    end
end

三、仿真结论分析

运行后,matlab启动GUI操作界面:

四、参考文献 

[1]邢景虎, 陈其工, 江明. 基于LQR的直线一级倒立摆最优控制系统研究[J]. 工业仪表与自动化装置, 2007(6):3.A08-45

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/126376744