基于扩张观测器的滑模控制的matlab控制系统设计,使用simulink仿真。仿真电子资料

基于扩张观测器的滑模控制的matlab控制系统设计,使用simulink仿真。仿真电子资料
在这里插入图片描述

好的,以下是一个基于 扩张观测器(Extended State Observer, ESO) 的滑模控制系统的 MATLAB 和 Simulink 设计。我们将通过 Simulink 模型和 MATLAB 脚本实现该系统,并附上详细代码。


1. MATLAB 脚本设计

首先,我们编写一个 MATLAB 脚本来定义控制器参数、动力学模型和扩张观测器的逻辑。

% 参数设置
m = 1; % 系统质量 (kg)
b = 0.1; % 阻尼系数
k = 10; % 弹性系数
dt = 0.01; % 时间步长 (秒)
T = 10; % 总时间 (秒)
t = 0:dt:T; % 时间向量

% 初始状态
x = 0; % 位置
v = 0; % 速度

% 目标轨迹
x_des = sin(2 * pi * t / T); % 正弦目标轨迹

% 滑模控制参数
lambda = 5; % 滑模面系数
eta = 1; % 滑模增益

% ESO 参数
beta1 = 10; % ESO 增益 1
beta2 = 20; % ESO 增益 2
z1 = 0; % ESO 状态估计 1
z2 = 0; % ESO 状态估计 2

% 初始化变量
s = zeros(size(t)); % 滑模面
u = zeros(size(t)); % 控制输入
filtered_u = zeros(size(t)); % 经过低通滤波器的控制输入

% 动力学仿真
for i = 1:length(t)-1
    % 计算误差
    e = x_des(i) - x;
    de = -v;
    
    % 滑模面
    s(i) = lambda * e + de;
    
    % 扩张观测器更新
    z1_dot = z2 - beta1 * (z1 - x);
    z2_dot = -beta2 * (z1 - x);
    z1 = z1 + z1_dot * dt;
    z2 = z2 + z2_dot * dt;
    
    % 滑模控制输入
    u(i) = m * (-k * x - b * v + k * x_des(i)) + eta * sign(s(i)) - z2;
    
    % 动力学更新
    a = (u(i) - b * v - k * x) / m;
    v = v + a * dt;
    x = x + v * dt;
end

% 绘图
figure;
subplot(3, 1, 1);
plot(t, x, 'r-', t, x_des, 'b--');
xlabel('时间 (秒)');
ylabel('位置 (米)');
legend('实际轨迹', '目标轨迹');

subplot(3, 1, 2);
plot(t, u);
xlabel('时间 (秒)');
ylabel('控制输入');
title('控制输入随时间变化');

subplot(3, 1, 3);
plot(t, s);
xlabel('时间 (秒)');
ylabel('滑模面');
title('滑模面随时间变化');

2. Simulink 仿真设计

接下来,我们在 Simulink 中实现上述控制器和动力学模型的仿真。

Simulink 模型结构
  1. 打开 Simulink 并创建新模型
  2. 添加以下模块:
    • Sine Wave:生成目标轨迹信号。
    • Integrator:用于积分加速度和速度。
    • Scope:用于显示输出结果。
    • MATLAB Function:用于实现滑模控制器和扩张观测器逻辑。
    • SumGain:用于实现数学运算。
配置 MATLAB Function

将上述 MATLAB 脚本中的控制器逻辑封装到一个 MATLAB Function 中。以下是 MATLAB Function 的基本框架:

function [sys, x0, str, ts] = smc_es_controller(t, x, u, flag)
switch flag
    case 0 % 初始化
        [sys, x0, str, ts] = mdlInitializeSizes;
    case 2 % 更新状态
        sys = mdlUpdate(t, x, u);
    case 3 % 输出
        sys = mdlOutputs(t, x, u);
    otherwise
        sys = [];
end

function [sys, x0, str, ts] = mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 2; % ESO 的两个状态
sizes.NumDiscStates = 0;
sizes.NumOutputs = 2; % 控制输入和观测扰动
sizes.NumInputs = 4; % 状态和目标轨迹
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0 = [0; 0]; % ESO 初始状态
str = [];
ts = [-1 0]; % 可变步长

function sys = mdlUpdate(t, x, u)
sys = [];

function sys = mdlOutputs(t, x, u)
% 解析输入
x_actual = u(1);
v_actual = u(2);
x_des = u(3);
v_des = u(4);

% 参数
m = 1; b = 0.1; k = 10;
lambda = 5; eta = 1;
beta1 = 10; beta2 = 20;

% ESO 更新
z1 = x(1);
z2 = x(2);
z1_dot = z2 - beta1 * (z1 - x_actual);
z2_dot = -beta2 * (z1 - x_actual);

% 滑模面
e = x_des - x_actual;
de = v_des - v_actual;
s = lambda * e + de;

% 滑模控制输入
u_raw = m * (-k * x_actual - b * v_actual + k * x_des) + eta * sign(s) - z2;

sys = [u_raw; z2];

运行仿真

  1. 在 Simulink 中运行模型。
  2. 使用 Scope 模块观察机械手的位置、速度和控制输入的变化。
  3. 检查轨迹跟踪效果是否满足要求。

总结

  • 扩张观测器(ESO) 用于估计系统的总扰动(包括未建模动态和外部干扰),从而提高滑模控制的鲁棒性。
  • 滑模控制 提供了快速收敛和强鲁棒性,但需要结合滤波器或扩张观测器来减少抖振现象。
  • 上述代码和 Simulink 模型可以作为基础框架,根据具体需求进一步调整参数和功能。

在这里插入图片描述
为了实现基于扩张观测器(Extended State Observer, ESO)的滑模控制,并使用 Simulink 进行仿真,我们可以按照以下步骤进行。以下是 MATLAB 脚本和 Simulink 模型的设计。

1. MATLAB 脚本设计

首先,我们编写一个 MATLAB 脚本来定义控制器参数、动力学模型和扩张观测器的逻辑。

% 参数设置
m = 1; % 系统质量 (kg)
b = 0.1; % 阻尼系数
k = 10; % 弹性系数
dt = 0.01; % 时间步长 (秒)
T = 10; % 总时间 (秒)
t = 0:dt:T; % 时间向量

% 初始状态
x = 0; % 位置
v = 0; % 速度

% 目标轨迹
x_des = sin(2 * pi * t / T); % 正弦目标轨迹

% 滑模控制参数
lambda = 5; % 滑模面系数
eta = 1; % 滑模增益

% ESO 参数
beta1 = 10; % ESO 增益 1
beta2 = 20; % ESO 增益 2
z1 = 0; % ESO 状态估计 1
z2 = 0; % ESO 状态估计 2

% 初始化变量
s = zeros(size(t)); % 滑模面
u = zeros(size(t)); % 控制输入
filtered_u = zeros(size(t)); % 经过低通滤波器的控制输入

% 动力学仿真
for i = 1:length(t)-1
    % 计算误差
    e = x_des(i) - x;
    de = -v;
    
    % 滑模面
    s(i) = lambda * e + de;
    
    % 扩张观测器更新
    z1_dot = z2 - beta1 * (z1 - x);
    z2_dot = -beta2 * (z1 - x);
    z1 = z1 + z1_dot * dt;
    z2 = z2 + z2_dot * dt;
    
    % 滑模控制输入
    u(i) = m * (-k * x - b * v + k * x_des(i)) + eta * sign(s(i)) - z2;
    
    % 动力学更新
    a = (u(i) - b * v - k * x) / m;
    v = v + a * dt;
    x = x + v * dt;
end

% 绘图
figure;
subplot(3, 1, 1);
plot(t, x, 'r-', t, x_des, 'b--');
xlabel('时间 (秒)');
ylabel('位置 (米)');
legend('实际轨迹', '目标轨迹');

subplot(3, 1, 2);
plot(t, u);
xlabel('时间 (秒)');
ylabel('控制输入');
title('控制输入随时间变化');

subplot(3, 1, 3);
plot(t, s);
xlabel('时间 (秒)');
ylabel('滑模面');
title('滑模面随时间变化');

2. Simulink 仿真设计

接下来,我们在 Simulink 中实现上述控制器和动力学模型的仿真。

Simulink 模型结构
  1. 打开 Simulink 并创建新模型
  2. 添加以下模块:
    • Sine Wave:生成目标轨迹信号。
    • Integrator:用于积分加速度和速度。
    • Scope:用于显示输出结果。
    • MATLAB Function:用于实现滑模控制器和扩张观测器逻辑。
    • SumGain:用于实现数学运算。
配置 MATLAB Function

将上述 MATLAB 脚本中的控制器逻辑封装到一个 MATLAB Function 中。以下是 MATLAB Function 的基本框架:

function [sys, x0, str, ts] = smc_es_controller(t, x, u, flag)
switch flag
    case 0 % 初始化
        [sys, x0, str, ts] = mdlInitializeSizes;
    case 2 % 更新状态
        sys = mdlUpdate(t, x, u);
    case 3 % 输出
        sys = mdlOutputs(t, x, u);
    otherwise
        sys = [];
end

function [sys, x0, str, ts] = mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 2; % ESO 的两个状态
sizes.NumDiscStates = 0;
sizes.NumOutputs = 2; % 控制输入和观测扰动
sizes.NumInputs = 4; % 状态和目标轨迹
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0 = [0; 0]; % ESO 初始状态
str = [];
ts = [-1 0]; % 可变步长

function sys = mdlUpdate(t, x, u)
sys = [];

function sys = mdlOutputs(t, x, u)
% 解析输入
x_actual = u(1);
v_actual = u(2);
x_des = u(3);
v_des = u(4);

% 参数
m = 1; b = 0.1; k = 10;
lambda = 5; eta = 1;
beta1 = 10; beta2 = 20;

% ESO 更新
z1 = x(1);
z2 = x(2);
z1_dot = z2 - beta1 * (z1 - x_actual);
z2_dot = -beta2 * (z1 - x_actual);

% 滑模面
e = x_des - x_actual;
de = v_des - v_actual;
s = lambda * e + de;

% 滑模控制输入
u_raw = m * (-k * x_actual - b * v_actual + k * x_des) + eta * sign(s) - z2;

sys = [u_raw; z2];

运行仿真

  1. 在 Simulink 中运行模型。
  2. 使用 Scope 模块观察机械手的位置、速度和控制输入的变化。
  3. 检查轨迹跟踪效果是否满足要求。

总结

  • 扩张观测器(ESO) 用于估计系统的总扰动(包括未建模动态和外部干扰),从而提高滑模控制的鲁棒性。
  • 滑模控制 提供了快速收敛和强鲁棒性,但需要结合滤波器或扩张观测器来减少抖振现象。
  • 上述代码和 Simulink 模型可以作为基础框架,根据具体需求进一步调整参数和功能。

在这里插入图片描述
为了实现基于扩张观测器(Extended State Observer, ESO)的滑模控制,并使用 Simulink 进行仿真,我们可以按照以下步骤进行。以下是 MATLAB 脚本和 Simulink 模型的设计。

1. MATLAB 脚本设计

首先,我们编写一个 MATLAB 脚本来定义控制器参数、动力学模型和扩张观测器的逻辑。

% 参数设置
m = 1; % 系统质量 (kg)
b = 0.1; % 阻尼系数
k = 10; % 弹性系数
dt = 0.01; % 时间步长 (秒)
T = 10; % 总时间 (秒)
t = 0:dt:T; % 时间向量

% 初始状态
x = 0; % 位置
v = 0; % 速度

% 目标轨迹
x_des = sin(2 * pi * t / T); % 正弦目标轨迹

% 滑模控制参数
lambda = 5; % 滑模面系数
eta = 1; % 滑模增益

% ESO 参数
beta1 = 10; % ESO 增益 1
beta2 = 20; % ESO 增益 2
z1 = 0; % ESO 状态估计 1
z2 = 0; % ESO 状态估计 2

% 初始化变量
s = zeros(size(t)); % 滑模面
u = zeros(size(t)); % 控制输入
filtered_u = zeros(size(t)); % 经过低通滤波器的控制输入

% 动力学仿真
for i = 1:length(t)-1
    % 计算误差
    e = x_des(i) - x;
    de = -v;
    
    % 滑模面
    s(i) = lambda * e + de;
    
    % 扩张观测器更新
    z1_dot = z2 - beta1 * (z1 - x);
    z2_dot = -beta2 * (z1 - x);
    z1 = z1 + z1_dot * dt;
    z2 = z2 + z2_dot * dt;
    
    % 滑模控制输入
    u(i) = m * (-k * x - b * v + k * x_des(i)) + eta * sign(s(i)) - z2;
    
    % 动力学更新
    a = (u(i) - b * v - k * x) / m;
    v = v + a * dt;
    x = x + v * dt;
end

% 绘图
figure;
subplot(3, 1, 1);
plot(t, x, 'r-', t, x_des, 'b--');
xlabel('时间 (秒)');
ylabel('位置 (米)');
legend('实际轨迹', '目标轨迹');

subplot(3, 1, 2);
plot(t, u);
xlabel('时间 (秒)');
ylabel('控制输入');
title('控制输入随时间变化');

subplot(3, 1, 3);
plot(t, s);
xlabel('时间 (秒)');
ylabel('滑模面');
title('滑模面随时间变化');

2. Simulink 仿真设计

接下来,我们在 Simulink 中实现上述控制器和动力学模型的仿真。

Simulink 模型结构
  1. 打开 Simulink 并创建新模型
  2. 添加以下模块:
    • Sine Wave:生成目标轨迹信号。
    • Integrator:用于积分加速度和速度。
    • Scope:用于显示输出结果。
    • MATLAB Function:用于实现滑模控制器和扩张观测器逻辑。
    • SumGain:用于实现数学运算。
配置 MATLAB Function

将上述 MATLAB 脚本中的控制器逻辑封装到一个 MATLAB Function 中。以下是 MATLAB Function 的基本框架:

function [sys, x0, str, ts] = smc_es_controller(t, x, u, flag)
switch flag
    case 0 % 初始化
        [sys, x0, str, ts] = mdlInitializeSizes;
    case 2 % 更新状态
        sys = mdlUpdate(t, x, u);
    case 3 % 输出
        sys = mdlOutputs(t, x, u);
    otherwise
        sys = [];
end

function [sys, x0, str, ts] = mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 2; % ESO 的两个状态
sizes.NumDiscStates = 0;
sizes.NumOutputs = 2; % 控制输入和观测扰动
sizes.NumInputs = 4; % 状态和目标轨迹
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0 = [0; 0]; % ESO 初始状态
str = [];
ts = [-1 0]; % 可变步长

function sys = mdlUpdate(t, x, u)
sys = [];

function sys = mdlOutputs(t, x, u)
% 解析输入
x_actual = u(1);
v_actual = u(2);
x_des = u(3);
v_des = u(4);

% 参数
m = 1; b = 0.1; k = 10;
lambda = 5; eta = 1;
beta1 = 10; beta2 = 20;

% ESO 更新
z1 = x(1);
z2 = x(2);
z1_dot = z2 - beta1 * (z1 - x_actual);
z2_dot = -beta2 * (z1 - x_actual);

% 滑模面
e = x_des - x_actual;
de = v_des - v_actual;
s = lambda * e + de;

% 滑模控制输入
u_raw = m * (-k * x_actual - b * v_actual + k * x_des) + eta * sign(s) - z2;

sys = [u_raw; z2];

运行仿真

  1. 在 Simulink 中运行模型。
  2. 使用 Scope 模块观察机械手的位置、速度和控制输入的变化。
  3. 检查轨迹跟踪效果是否满足要求。

总结

  • 扩张观测器(ESO) 用于估计系统的总扰动(包括未建模动态和外部干扰),从而提高滑模控制的鲁棒性。
  • 滑模控制 提供了快速收敛和强鲁棒性,但需要结合滤波器或扩张观测器来减少抖振现象。
  • 上述代码和 Simulink 模型可以作为基础框架,根据具体需求进一步调整参数和功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值