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

M 小车质量
m 摆杆质量
b 小车摩擦系数
l 摆杆转动轴心到杆质心的长度
I 摆杆惯量
F 加在小车上的力
x 小车位置

其中,N——小车与摆杆相互作用力的水平方向的分量,
P——小车与摆杆相互作用力的垂直方向的分量。
以下是应用牛顿法建立直线一级倒立摆系统的动力学方程过程:
通过受力分析可知,由小车水平方向所受的合力,可得如下方程:

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


- 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