这是前几周现代鲁棒控制课程一位同学的大作业,ppt做的很详细,但是并没有分享代码,我就根据ppt里的单摆模型以及所涉及到的鲁棒滑模控制方法和思路,自己搭了一套仿真程序,非常便捷,需要切换控制方法时只需要把目标代码取消注释,便可以跑出相应结果,便于新手对鲁棒滑膜控制进行学习。
知识点部分引用截图:
%% 单摆相关参数
theta = -1.00; % 攻角deg x1
omegaz = 2.00; % 俯仰角速度,deg/s x2
del_theta = 0.00; % 攻角微分deg
del_omegaz = 0.00; % 俯仰角速度微分,deg/s
g = 9.78; %重力加速度
J = 1.2; % 转动惯量kg/m^2
L = 1.74; % 摆长m
V_s = 0.18; % 摩擦系数m/s^2
%二阶系统非线性微分方程
del_theta = omegaz;
del_omegaz = - 0.5 *g * sin(theta) / L - V_s * omegaz / J + u / J;
f = - 0.5 *g * sin(theta) / L - V_s * omegaz / J;
method = '滑模控制';
s = del_theta + c * theta; % 滑模面
u = - ep * sign(s) - f - c * omegaz; %滑模控制基于趋近律
u = - f - c * omegaz; %滑模控制基于等效控制原理
method = '终端滑模控制';
s = omegaz + alpha * theta^(q/p); % 终端滑模面
u = - ep * sign(s)- f - alpha * beta * abs(theta)^(beta - 1) * omegaz; %终端滑模控制基于趋近律
u = - f - alpha * beta * abs(theta)^(beta - 1) * omegaz; %终端滑模控制基于等效控制原理
method = '快速终端滑模控制';
s = omegaz + k1 * theta^(a1) + k2 * theta^(a2); % 快速终端滑模面
u = - f - k1 * a1 * abs(theta)^(a1 - 1) * omegaz - k2 * a2 * abs(theta)^(a2 - 1) * omegaz; %快速终端滑模控制基于等效控制原理
method = '非奇异终端滑模控制';
s = theta + alpha * omegaz^(p/q); % 非奇异终端滑模面
u = - f - q/(alpha * p) * omegaz ^ (2-p/q); %非奇异终端滑模控制基于等效控制原理
method = '非奇异快速终端滑模控制';
s = theta + k3 * sign(theta)^(a3) + k4 * sign(omegaz)^(a4); % 非奇异快速终端滑模面
u = (- omegaz - k3 * a3 * abs(theta)^(a3 - 1) * omegaz)/(k4 * a4 * abs(omegaz)^(a4 - 1))- f ; %非奇异快速终端滑模控制基于等效控制原理
注:控制器中基于趋近律和基于等效控制原理的区别为是否带有滑模面的符号函数,可以根据前两个控制器的代码观察得出。
% 单摆滑模控制测试仿真
%根据现代鲁棒控制桑豪ppt
% Jun 24 2020 Wed Jonny Su
clc;
close all;
clear all;
cd ('D:\OneDrive - 徐州开放大学\NPU\program\Morphing\Robust');
%% 单摆相关参数
theta = -1.00; % 攻角deg x1
omegaz = 2.00; % 俯仰角速度,deg/s x2
del_theta = 0.00; % 攻角微分deg
del_omegaz = 0.00; % 俯仰角速度微分,deg/s
g = 9.78; %重力加速度
J = 1.2; % 转动惯量kg/m^2
L = 1.74; % 摆长m
V_s = 0.18; % 摩擦系数m/s^2
%% 控制参数
% 滑模面
c = 0.3;
ep = 0.5;
u = 0;
% 终端滑模面&非奇异终端滑模面
% alpha = 0,9; %什么神仙bug
alpha = 0.9;
p = 9;
q = 7;
% 快速终端滑模面
k1 = 1.1;
k2 = 0.9;
a1 = 9/7;
a2 = 7/9;
% 非奇异快速终端滑模面
k3 = 1.1;
k4 = 0.9;
a3 = 3;
a4 = 9/7;
beta = q/p; %两个奇数
%% Simulation parameters
step = 0.01; %步长
t = 0; %时间
n = 1; %步数
%% 二阶系统仿真
while (t < 50) %仿真时间50s
%二阶系统非线性微分方程
del_theta = omegaz;
del_omegaz = - 0.5 *g * sin(theta) / L - V_s * omegaz / J + u / J;
f = - 0.5 *g * sin(theta) / L - V_s * omegaz / J;
%% 控制器设计
%滑模控制
method = '滑模控制';
s = del_theta + c * theta; % 滑模面
u = - ep * sign(s) - f - c * omegaz; %滑模控制基于趋近律
% u = - f - c * omegaz; %滑模控制基于等效控制原理
%终端滑模控制
% method = '终端滑模控制';
% s = omegaz + alpha * theta^(q/p); % 终端滑模面
% u = - ep * sign(s)- f - alpha * beta * abs(theta)^(beta - 1) * omegaz; %终端滑模控制基于趋近律
% u = - f - alpha * beta * abs(theta)^(beta - 1) * omegaz; %终端滑模控制基于等效控制原理
%快速终端滑模控制
% method = '快速终端滑模控制';
% s = omegaz + k1 * theta^(a1) + k2 * theta^(a2); % 快速终端滑模面
% u = - f - k1 * a1 * abs(theta)^(a1 - 1) * omegaz - k2 * a2 * abs(theta)^(a2 - 1) * omegaz; %快速终端滑模控制基于等效控制原理
%非奇异终端滑模控制
% method = '非奇异终端滑模控制';
% s = theta + alpha * omegaz^(p/q); % 非奇异终端滑模面
% u = - f - q/(alpha * p) * omegaz ^ (2-p/q); %非奇异终端滑模控制基于等效控制原理
%非奇异快速终端滑模控制
% method = '非奇异快速终端滑模控制';
% s = theta + k3 * sign(theta)^(a3) + k4 * sign(omegaz)^(a4); % 非奇异快速终端滑模面
% u = (- omegaz - k3 * a3 * abs(theta)^(a3 - 1) * omegaz)/(k4 * a4 * abs(omegaz)^(a4 - 1))- f ; %非奇异快速终端滑模控制基于等效控制原理
%% 状态更新
states_old = [theta;omegaz]; %弹道倾角 俯仰角速度
del = [del_theta;del_omegaz]; %微分量
states_new = states_old + del * step; %更新 赋值
theta = states_new(1);
omegaz = states_new(2);
% 保存数据
Vehicle_states(n,:) = [theta;omegaz]; %
Del_states(n,:) = [del_theta;del_omegaz]; %
Time(n) = t; %时间记录
Control_states(n,:) = [u]; %控制变量
% 时间更新
t = t + step; %仿真步长
n = n + 1; %计数+1
end
%% 绘图检验
figure;
% 速度
plot(Time,Vehicle_states(:,1),Time,Vehicle_states(:,2),'linewidth',1.5);
%axis([0 100 1400 1600]) ;
legend('$\theta(^\circ)$','$\omega_z(^\circ/s)$','FontName','Times New Roman','FontSize',14,'Interpreter','latex')
grid on;
title(['控制方法为 ',method,' 时的响应曲线']);
xlabel('$T(s)$','FontName','Times New Roman','FontSize',14,'Interpreter','latex');
% ylabel('$\theta(^\circ)$','FontName','Times New Roman','FontSize',14,'Interpreter','latex');
% set(gca,'FontName','Times New Roman','FontSize',14,'linewidth',1.5);
figure;
plot(Time,Control_states(:,1),'linewidth',1.5);
%axis([0 100 18500 21500]) ;
grid on;
title(['控制方法为 ',method,' 时的输入信号']);
xlabel('$T(s)$','FontName','Times New Roman','FontSize',14,'Interpreter','latex');
ylabel('$input$','FontName','Times New Roman','FontSize',14,'Interpreter','latex');
% set(gca,'FontName','Times New Roman','FontSize',14,'linewidth',1.5);
以上就是单摆鲁棒滑模控制matlab实现的全部内容,欢迎讨论交流。