直线一级倒立摆控制方法研究

时间:2021-12-29 01:19:31

✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。

????个人主页:算法工程师的学习日志


分享一下以前在校做的一个课题-直线一级倒立摆控制方法研究。


1 研究背景

倒立摆是一个开环不稳定的强非线性系统,其控制策略与杂技运动员顶杆平衡表演的技巧有异曲同工之处,目的在于使得摆杆处于临界稳定状态,是进行控制理论研究的典型实验平台。20世纪50年代,麻省理工学院的控制论专家根据火箭助推器原理设计出了第一套倒立摆实验设备,开启了最初的相关研究工作。倒立摆的种类丰富多样,按照其结构可将其分为:直线倒立摆、环形倒立摆以及平面倒立摆等,按照摆杆级数又可将其分为:一级、二级甚至三级等。

直线一级倒立摆控制方法研究

图1 直线一级倒立摆原理

按照工作原理可将现有的直线一级倒立摆实验装置抽象成小车和摆杆组成的系统,其中小车可沿固定导轨左右移动,摆杆可绕小车与摆杆之间的铰接点*转动,如图1所示。控制系统依据读取到的小车位置以及摆杆角度信号,通过控制作用在小车上的水平力,使其沿固定导轨左右移动,可以使得摆杆始终处于垂直向上这样一个临界稳定位置,实验装置具体参数如表1所示。

直线一级倒立摆控制方法研究


2 模型推导

设N和P为小车与摆杆相互作用力的水平和垂直方向的分量。

 

直线一级倒立摆控制方法研究

图2 小车受力分析图

下面N和P为小车与摆杆相互作用力的水平和垂直方向的分量。

直线一级倒立摆控制方法研究

直线一级倒立摆控制方法研究


3 现代控制理论分析

3.1 状态空间方程

直线一级倒立摆控制方法研究

直线一级倒立摆控制方法研究



3.2 能控性和能观性

在MATLAB中进行计算,代码如下:

A=[0 1 0 0;0 -0.0883 0.6293 0;0 0 0 1;0 -0.2357 27.8285 0];
B=[0;0.8832;0;2.3566];
C=[1 0 0 0;0 0 1 0];
cnotallow=[B A*B A^2*B A^3*B];
disp('可控性矩阵的秩:')
disp(rank(control))
observe=[C;C*A];
disp('可观性矩阵的秩:')
disp(rank(observe))

直线一级倒立摆控制方法研究

直线一级倒立摆控制方法研究

3.3 状态反馈

直线一级倒立摆控制方法研究

直线一级倒立摆控制方法研究

直线一级倒立摆控制方法研究

3.4 状态观测器

直线一级倒立摆控制方法研究

直线一级倒立摆控制方法研究

直线一级倒立摆控制方法研究

3.5 LRQ控制

线性二次型性能指标易于分析、处理和计算,而且通过线性二次型最优设计方法得到的倒立摆系统具有较好的鲁棒性与动态特性以及能够获得线性反馈结构等优点,因而在实际的倒立摆控制系统设计中得到了广泛的应用。但是在使用该方法时,最优控制的效果取决于加权阵Q和R的选取。

直线一级倒立摆控制方法研究

直线一级倒立摆控制方法研究

直线一级倒立摆控制方法研究

从上述图中可以发现,Q矩阵中,增加Q11、Q33,系统响应时间有明显改善,稳定时间和上升时间变短,并且使摆杆的角度变化减少。增大Q11、Q33,系统的响应还会更快,但是对于实际离散控制系统,过大的控制量会引起系统震荡。反复试验当取Q11=1000,Q33=200时,如图12所示,此时摆杆角度超调足够小,稳态误差满足要求,稳定时间也不超过2秒,达到了良好的控制效果。

4 参考文献

[1]王玲琳. 学习控制算法设计及倒立摆控制实现[D].内蒙古大学,2013.

[2]汤乐. 倒立摆系统建模与控制方法研究[D].河南大学,2013.

[3]刘文秀,郭伟,余波年. 倒立摆状态反馈极点配置与LQR控制Matlab实现[J]. 现代电子技术,2011,10:88-90.

[4]肖力龙. 直线一级倒立摆起摆与稳摆控制研究及控制系统设计[D].中南大学,2007.

[5]史晓霞, 张振东, 李俊芳等, 一二级倒立摆系统数学模型的建立与意义.河北工业大学学报,2001,30(5):48一51.

[6]姚俊, 等. Simulik建模与仿真[M].西安:西安电子科技大学出版社,2003.

附录

MATLAB代码如下:


clear;clc
%%
A=[0 1 0 0;0 -0.0883 0.6293 0;0 0 0 1;0 -0.2357 27.8285 0];
B=[0;0.8832;0;2.3566];
C=[1 0 0 0;0 0 1 0];
D=[0;0];
Q=C'*C;
R=1;
K=lqr(A,B,Q,R)
P=[-24,-24,-2.4+3.2*1i,-2.4-3.2*1i] ;
K=acker(A,B,P)
P1=[-8.01 -7.99 -8.02 -7.98];
%P1=[-48.01 -47.99 -8.02 -7.98];
G=(place(A',C',P1))'
 
%% 启动simulink模型
sim('model_daolibai.slx')
figure(1)
plot(tout,yout(:,1),tout,yout(:,2),tout,yout(:,3),tout,yout(:,4))
legend('实际控制的小车位移','实际控制的小车角度','观测到的倒立摆位移','观测到的倒立摆角度')
title('控制系统位移和角度变化')
xlabel('时间/s')
ylabel('幅值')
figure(2)
plot(tout,yout(:,1),tout,yout(:,3))
legend('实际控制的小车位移','观测到的小车位移')
title('小车位移变化')
xlabel('时间/s')
ylabel('幅值')
figure(3)
y=yout(:,1)-yout(:,3);
plot(y)
title('实际控制与观测到的小车位移误差')
figure(4)
plot(tout,yout(:,2),tout,yout(:,4))
legend('实际控制的倒立摆角度','观测到的倒立摆角度')
title('倒立摆角度变化')
xlabel('时间/s')
ylabel('幅值')
figure(5)
y=yout(:,2)-yout(:,4);
plot(y)
title('实际控制与观测到的倒立摆角度误差')
 
%% 00
Q=C'*C;
K=lqr(A,B,Q,R)
sim('untitled10528_1.slx')
figure(1)
plot(tout,yout(:,1),tout,yout(:,2))
legend('小车位移','摆杆角度')
grid on
title('控制系统位移和角度变化')
xlabel('时间/s')
ylabel('幅值')
%% 11
Q(1,1)=500;Q(3,3)=100;
K=lqr(A,B,Q,R)
sim('untitled10528_1.slx')
figure(1)
plot(tout,yout(:,1),tout,yout(:,2))
legend('小车位移','摆杆角度')
grid on
title('控制系统位移和角度变化')
xlabel('时间/s')
ylabel('幅值')
%% 22
Q(1,1)=1000;Q(3,3)=200;
K=lqr(A,B,Q,R)
sim('untitled10528_1.slx')
figure(1)
plot(tout,yout(:,1),tout,yout(:,2))
legend('小车位移','摆杆角度')
grid on
title('控制系统位移和角度变化')
xlabel('时间/s')
ylabel('幅值')
 
%% 33
Q(1,1)=2000;Q(3,3)=1000;
K=lqr(A,B,Q,R)
sim('untitled10528_1.slx')
figure(1)
plot(tout,yout(:,1),tout,yout(:,2))
legend('小车位移','摆杆角度')
grid on
title('控制系统位移和角度变化')
xlabel('时间/s')
ylabel('幅值')差')