1.算法仿真效果
本课题是针对博主原来写的文章《基于MATLAB的一级倒立摆控制仿真,带GUI界面操作显示倒立摆动画,控制器控制输出》的升级。
升级内容包括如下几个方面:增加了PI控制器,PD控制器,同时对极点配置,线性二次型,PID,PI及PD五种算法的控制输出曲线进行对比。
matlab2022a仿真结果如下(完整代码运行后无水印):
仿真操作步骤可参考程序配套的操作视频。
2.算法涉及理论知识概要
一个可以活动的小车上立着一根不稳定随时会倒下的杆。小车的轮子由电机控制,可以控制小车电机的转动力矩M。同时,也可以获取小车轮子转动的圈数N(可以精确到小数)和杆相对于垂直位置的倾角α.
不考虑车轮打滑, 小车所受力大小等于电机力矩乘车轮半径, 小车位置可以从转动圈数计算出, 小车可简化为最经典的一阶倒立摆:
对小车水平方向:
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