滑模控制系统时域仿真平台 (SMC Simulation Platform)
项目简介
本项目是一个基于MATLAB/Simulink环境构建的通用滑模控制(Sliding Mode Control, SMC)时域仿真系统。该平台专注于演示和验证非线性系统在参数不确定性和外部扰动下的鲁棒控制性能。
项目核心代码实现了一个典型的二阶阻尼-弹簧-质量系统的动力学模型,并在此基础上设计了基于滑模面的鲁棒控制器。为了解决滑模控制中常见的“抖振(Chattering)”问题,平台内置并对比了三种不同的切换函数策略(符号函数、饱和函数、双曲正切函数),支持用户通过可视化图表直观地评估不同算法对控制精度、平滑度及抗扰能力的影响。
主要功能特性
- 二阶非线性系统建模:内置参数化的物理模型(质量-阻尼-弹簧系统),支持自定义质量、阻尼系数及刚度系数。
- 多策略抖振抑制对比:在同一仿真条件下,自动串行执行三种控制策略并进行对比:
*
Sign (符号函数):经典的滑模控制,具有最强的理论鲁棒性但伴随剧烈抖振。
*
Saturation (饱和函数):引入边界层概念,在边界层内采用线性反馈,平衡精度与抖振。
*
Tanh (双曲正切函数):利用平滑的S形曲线替代硬切换,实现全程连续的控制输出。
- 混合趋近律设计:控制器结合了等速趋近律与指数趋近律,确保系统状态能快速且稳定地收敛至滑模面。
- 鲁棒性验证环境:
*
参考信号跟踪:系统自动跟踪变化的正弦波信号。
*
复杂扰动注入:集成突发性阶跃负载扰动(模拟外部冲击)与持续性高频正弦噪声(模拟传感器或环境噪声)。
- 高精度数值解算:不依赖Simulink工具箱,底层手动实现了四阶龙格-库塔(Runge-Kutta 4th Order) 积分算法,确保非线性微分方程求解的精度。
- 全方位可视化分析:仿真结束后自动生成包含六个子图的综合分析面板,涵盖时域响应、误差收敛、控制输入、滑模面到达过程及相平面轨迹。
系统物理模型与参数
代码中构建的被控对象为单自由度机械系统,其动力学方程模拟了以下物理特性:
- 系统类型:二阶线性非时变系统(LTI),但在控制律设计中被视为一般的二阶动态系统进行处理。
- 默认参数:
* 质量 (m) = 2.0 kg
* 阻尼 (b) = 0.5 N*s/m
* 刚度 (k) = 10.0 N/m
- 执行器限制:模拟了物理执行器的饱和特性,控制输入幅值被限制在 ±200 N 以内。
核心算法与实现细节
1. 滑模控制器设计
控制器采用基于模型的等效控制(Equivalent Control)加上切换控制(Switching Control)的架构:
- 滑模面定义:采用比例-微分(PD)形式的滑模面 $s = c cdot e + dot{e}$,其中 $e$ 为位置跟踪误差。
- 等效控制 ($u_{eq}$):基于系统名义模型计算,用于抵消系统的内部动力学(阻尼项和刚度项)及参考轨迹的加速度要求。
- 切换控制 ($u_{sw}$):采用趋近律算法 $u_{sw} = frac{1}{g} (epsilon cdot text{func}(s) + k cdot s)$,用于克服干扰并迫使系统状态保持在滑模面上。
2. 仿真引擎
- 主循环:
main 函数作为入口,依次调用仿真子程序。 - 求解器:
run_simulation 函数内部通过手动编写的RK4算法对状态方程进行迭代求解,步长固定为 0.001秒。 - 扰动逻辑:
* 在 $t in [5.0, 7.0)$ 秒期间注入大幅值阶跃扰动(幅值 5.0)。
* 全时段叠加高频小幅值背景噪声。
3. 可视化分析
结果展示模块
visualize_results 生成包含以下内容的综合图表:
- 位置跟踪:对比三种算法下的实际轨迹与期望轨迹。
- 误差收敛:展示跟踪误差随时间衰减的过程,特别关注初始阶段和受扰动阶段。
- 控制输入:直观展示“抖振”现象,其中Sign函数对应高频大幅切换,而Tanh函数对应平滑曲线。
- 滑模函数:显示状态变量 $s(t)$ 是否收敛至零及其收敛速度。
- 相平面轨迹:即 $e-dot{e}$ 图,验证系统状态是否沿着滑模面($s=0$ 线)滑动至平衡点。
- 抗扰特写:对5-7秒扰动注入区间的误差曲线进行局部放大,展示系统的恢复能力。
使用方法
- 确保计算机上安装有 MATLAB 软件。
- 将包含
main 函数的代码保存为 .m 文件。 - 在 MATLAB 命令行窗口中运行该文件或直接点击编辑器中的“运行”按钮。
- 程序将自动清理工作区,执行三次独立的仿真过程,并弹出一个综合图形窗口显示对比结果。
- 控制台会输出当前正在执行的仿真阶段提示。
系统要求
- MATLAB R2016b 或更高版本(代码仅使用基础 MATLAB 函数,不依赖额外工具箱)。
- 不需要 Simulink 模块库,纯代码实现。