基于S函数逻辑的滑模控制系统仿真
项目介绍
本项目实现了一个基于
滑模变结构控制(Sliding Mode Control, SMC)算法的二阶非线性系统仿真。虽然滑模控制常用于Simulink模型中,但本项目通过纯MATLAB代码(M语言)完整复现了包含系统动力学、控制律计算、以及闭环求解的全过程。
演示的核心目标是展示滑模控制在面对非线性特性和外部扰动时的鲁棒性。代码模拟了物理被控对象与控制器的交互,重点实现了指数趋近律和饱和函数消抖策略,有效抑制了传统滑模控制中的“抖振”现象。
功能特性
- 二阶非线性系统建模:仿真对象具备惯量、阻尼以及非线性刚度/重力项(正弦项),并包含周期性的外部负载扰动。
- 滑模控制器设计:
*
滑模面:采用经典的线性滑模面设计($s = ce + dot{e}$)。
*
指数趋近律:结合了等速趋近和指数趋近特性,加速远离滑模面时的调节速度。
*
抖振抑制:实现了边界层饱和函数(Saturation Function)替代符号函数(Sign Function)的切换逻辑。
- 闭环数值求解:利用MATLAB的
ode45 求解器模拟连续时间系统的动态响应。 - 数据重构与分析:由于ODE求解器仅返回状态,代码包含后处理模块,用于重建控制量 $u$、跟踪误差 $e$ 和滑模面值 $s$ 的历史数据。
- 多维可视化:提供位置跟踪对比、误差收敛曲线、控制输入(展示消抖效果)以及相平面(Phase Portrait)轨迹图。
系统要求
- MATLAB R2016b 或更高版本
- 无需额外工具箱(仅需基础MATLAB环境)
使用方法
- 确保MATLAB当前工作目录包含脚本文件。
- 直接运行脚本(主函数)。
- 程序将执行仿真计算,并在控制台输出运行状态。
- 运行结束后,系统将自动生成两个图形窗口,分别展示综合控制性能和独立状态响应。
---
代码实现逻辑详解
本项目代码采用模块化结构设计,主要包含以下流程,逻辑与实际代码实现完全一致:
1. 参数初始化
程序首先清除环境,然后定义两类核心参数:
- 物理系统参数:定义了惯量(J)、阻尼系数(B)和刚度系数(K)。
- 控制器参数:设定了滑模面斜率(c)、指数趋近律系数(epsilon, k)以及抖振与饱和函数的切换阈值(delta)。
2. 闭环系统求解 (ODE Simulation)
通过
ode45 函数求解闭环微分方程。
- 求解器调用一个封装函数(Wrapper),该函数在每个时间步长内同时模拟“被控对象”的物理响应和“控制器”的计算过程。
- 求解范围设定为0到10秒,初始状态设为有一定的偏差([0.5; 0]),以观察系统如何收敛至参考轨迹。
3. 数据后处理与重构
由于
ode45 使用变步长算法且仅返回系统状态(位置和速度),为了精确分析控制器的行为,代码包含一个专门的后处理循环:
- 首先通过样条插值(spline)将变步长数据重采样为固定步长(0.001s)的时间序列,确保绘图平滑。
- 然后遍历所有时间点,再次调用参考轨迹生成函数和控制器函数。
- 目的:这一步是为了显式计算并记录每一时刻的控制输入量 u、误差 e 和 滑模函数值 s,这些中间变量通常不被ODE求解器直接输出。
4. 结果可视化
代码利用
subplot 生成综合图表:
- 位置跟踪:对比参考信号(红色虚线)与实际响应(蓝色实线)。
- 跟踪误差:展示误差随时间收敛至零的过程。
- 控制输入:展示控制器输出电压或力矩的变化,可直观观察是否启用了平滑处理(饱和函数)。
- 相平面图:绘制
de (误差微分) 与 e (误差) 的关系,并叠加滑模面直线,直观展示系统状态如何被吸引并沿滑模面滑动。
---
关键算法与函数分析
系统动力学模拟 (Wrapper Function)
该部分模拟了物理环境。
- 动力学方程:$Jddot{q} = u - Bdot{q} - Ksin(q) + d(t)$
- 扰动注入:代码显式加入了一个正弦外部扰动 $1.5sin(2pi t)$,用于测试控制器的鲁棒性。
- 状态导数:计算出的加速度 $ddot{q}$ 被积分得到速度和位置。
滑模控制器核心 (Controller Function)
这是SMC算法的核心实现部分:
- 误差计算:实时计算位置误差 $e$ 和速度误差 $dot{e}$。
- 滑模面定义:计算 $s = c cdot e + dot{e}$。
- 标称模型补偿:利用已知的系统参数计算 $f(x)$ 和 $g(x)$,用于抵消系统已知的非线性项(反馈线性化)。
- 趋近律设计:采用指数趋近律,控制量由两部分组成:
*
等效控制 ($u_{eq}$):用于维持系统在滑模面上运动,主要包含对参考轨迹加速度和系统阻尼/刚度项的补偿。
*
切换控制 ($u_{sw}$):用于将系统状态拉回滑模面。$u_{sw} = frac{1}{g} (epsilon cdot text{sgn}(s) + k cdot s)$。
- 去抖动策略:代码通过
ctrl.use_sat 标志位控制。开启时,使用连续的饱和函数($s/delta$)替代不连续的符号函数(sign),在边界层 $delta$ 内实现线性调节,从而避免高频抖振。 - 执行器限幅:代码末尾加入了物理限幅逻辑,将控制输出强制限制在 [-100, 100] 范围内,模拟真实电机的输出饱和。
参考轨迹生成器
单纯的时间函数,用于生成平滑的正弦波参考信号及其一阶(速度)、二阶(加速度)导数,确保控制器能够获得完整的前馈信息。