一级倒立摆平衡控制系统MATLAB仿真,可显示倒立摆平衡动画,对比极点配置,线性二次型,PID,PI及PD五种算法

20 阅读3分钟

1.算法仿真效果

本课题是针对博主原来写的文章《基于MATLAB的一级倒立摆控制仿真,带GUI界面操作显示倒立摆动画,控制器控制输出》的升级。

 

升级内容包括如下几个方面:增加了PI控制器,PD控制器,同时对极点配置,线性二次型,PID,PI及PD五种算法的控制输出曲线进行对比。

 

matlab2022a仿真结果如下(完整代码运行后无水印):

 

1.jpeg

2.jpeg

3.jpeg

4.jpeg

5.jpeg

6.jpeg  

仿真操作步骤可参考程序配套的操作视频。

 

2.算法涉及理论知识概要

       一个可以活动的小车上立着一根不稳定随时会倒下的杆。小车的轮子由电机控制,可以控制小车电机的转动力矩M。同时,也可以获取小车轮子转动的圈数N(可以精确到小数)和杆相对于垂直位置的倾角α.

 

      不考虑车轮打滑, 小车所受力大小等于电机力矩乘车轮半径, 小车位置可以从转动圈数计算出, 小车可简化为最经典的一阶倒立摆:

bca847f76e7371c12d61e6730020171a_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png  

 对小车水平方向:

Mx¨+bx˙+N=F

 

对摆水平方向:

N=md2dt(x+lsin⁡θ)

 

即:

N=mx¨+mlθ¨cos⁡θ¨−mlθ˙2sin⁡θ

 

对摆垂直方向:

P=mg+md2dt(lcos⁡θ)

即:

 

P=mg−mlθ¨sin⁡θ¨−mlθ˙2cos⁡θ

 

关节力矩:

−Plsin⁡θ−Nlcos⁡θ=Iθ¨令 ϕ=π+θ

在工作点 θ≈0 进行线性化: sin⁡θ=0,cos⁡θ=1,θ˙2=0 经过一顿操作化简之后能得到:

(I+ml2)ϕ¨−mglϕ=mlx¨ (M+m)x¨+bx˙−mlϕ¨=F=u

 

3.MATLAB核心程序 `%%%%%%%%%%%%%%%%%%%%%%选择倒立摆的控制方式%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% --- Executes on button press in pushbutton4.

function pushbutton4_Callback(hObject, eventdata, handles)

% hObject    handle to pushbutton4 (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

pause;

 

% --- Executes on button press in pushbutton5.

function pushbutton5_Callback(hObject, eventdata, handles)

% hObject    handle to pushbutton5 (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

close(gcbf);

clc,clear,close all

 

 

% --- Executes on button press in pushbutton6.

function pushbutton6_Callback(hObject, eventdata, handles)

% hObject    handle to pushbutton6 (see GCBO)

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

 

load mat\R1.mat

y1=y;

t1=t;

 

load mat\R2.mat

y2=y;

t2=t;

 

load mat\R3.mat

y3=y;

t3=t;

 

load mat\R4.mat

y4=y;

t4=t;

 

load mat\R5.mat

y5=y;

t5=t;

 

 

figure;

subplot(211);

plot(t1,y1(:,1),'r','linewidth',2);

hold on

plot(t2,y2(:,1),'b','linewidth',2);

hold on

plot(t3,y3(:,1),'m','linewidth',2);

hold on

plot(t4,y4(:,1),'k','linewidth',2);

hold on

plot(t5,y5(:,1),'g','linewidth',2);

hold on

legend('极点配置法','线性二次型','PID','PI','PD');

title('偏转角变化对比');

xlim([0,10]);

 

subplot(212);

plot(t1,y1(:,3),'r','linewidth',2);

hold on

plot(t2,y2(:,3),'b','linewidth',2);

hold on

plot(t3,y3(:,3),'m','linewidth',2);

hold on

plot(t4,y4(:,3),'k','linewidth',2);

hold on

plot(t5,y5(:,3),'g','linewidth',2);

hold on

legend('极点配置法','线性二次型','PID','PI','PD');

title('小车位移变化对比');

xlim([0,10]);

0sj_021m`