简介:连续滑模控制(变结构控制)是机器人控制中常用的非线性鲁棒控制方法,其核心思想是根据系统状态动态切换控制结构,从而获得对参数摄动和外部扰动的较强抑制能力。这份资源包即围绕该主题,面向机器人控制、自动化及相关专业的本科高年级学生与工程师,提供完整的MATLAB/Simulink仿真程序,重点展示第4章多个仿真案例。包内共59个文件,包括46个.m脚本(覆盖控制律、被控对象、输入信号、绘图与模糊逻辑等模块)、12个.mdl仿真模型(可直接运行观察滑模动态过程)以及1个.mat数据文件(保存关键参数),压缩包整体仅61KB,轻量化设计便于快速下载与本地运行。目前已有1213人学习下载,可见其实用性获得初步认可。通过按编号对照案例,可以快速掌握连续滑模控制从建模、控制律设计到仿真实测的整体流程,适合作为课程设计或科研入门的参考实现。
1. 连续滑模控制为什么值得你亲手跑一遍:一套能复现机器人轨迹跟踪的 MATLAB 仿真包
做机器人控制的人,早晚会和"滑模"打交道。它经常被搜成"滑膜",实际是 Sliding Mode Control,变结构控制的一种。核心思想很反直觉:不是把系统掰到某个平衡点,而是先设计一条"滑模面",再用力把状态压到这条面上,让系统沿着面自己滑向目标。好处是鲁棒性强,对模型误差和外加扰动不敏感;代价是经典 sign 切换会给控制量带来高频抖振,这也是新手第一次跑仿真最容易翻车的地方。
这份资源是某经典机器人控制教材配套的第 4 章仿真程序包,共 12 个案例,全部以.m脚本和.mdl模型文件形式给出,覆盖从自由摆、单关节到双连杆轨迹跟踪的完整链条。适合三类人:正在学变结构控制的本科生、刚接触滑模的读研党,以及想快速验证控制律再移植到实机上的工程师。接下来我按"文件怎么看 → 核心代码怎么读 → 怎么跑通 → 坑在哪 → 怎么改"的顺序把它拆透。
2. 先看懂文件命名规律:这套程序包里藏着一条完整的主线
拿到一个 40 多个文件的压缩包,第一件事不是急着双击运行,而是先按命名规律把文件分类。这套第 4 章程序的文件名高度规整,能直接反推出作者的实验路径。
2.1 命名规律:plant、ctrl、plot、mf 四条线各管什么
先看高频后缀的语义:
plant:被控对象模型,也就是机器人动力学本身,通常是两连杆或多连杆机械臂的 M(q)、C(q, q_dot)、G(q) 矩阵计算。这一层决定你仿真里"物理世界"长什么样。ctrl:控制器,核心文件。滑模控制律、趋近律参数、饱和函数都在这里实现。sim.mdl:Simulink 顶层模型,把 plant 和 ctrl 接起来,负责仿真推进。plot:结果可视化,画跟踪曲线、误差曲线、控制力矩曲线。mf:隶属度函数。有 mf 出现的章节,说明控制器里融合了模糊逻辑或自适应模糊滑模,这是后期章节的进阶内容。input和design:分别负责期望轨迹信号生成和控制参数设计。
一个典型案例的分工是:chap4_7plant.m算动力学,chap4_7ctrl.m算控制律,chap4_7sim.mdl跑仿真,chap4_7plot.m出图。.mat文件(比如K_file.mat)用来存放需要预加载的增益矩阵,避免每次跑仿真前手动敲一遍参数。
2.2 12 个案例的梯度安排:从单关节到双连杆再到模糊滑模
从 1 到 12 编号,基本对应教材第 4 章的进阶路线。前几个案例是基础滑模和连续滑模的对比,中间开始引入双连杆耦合、模型不确定性和外部扰动,后面几个出现wf、w这类文件,大概率涉及滤波或自适应增益调节。
我拆过类似结构,这里给一个通常的对应关系:
| 案例范围 | 典型内容 | 关键文件特征 |
|---|---|---|
| 1-3 | 滑模控制基本概念、符号函数切换 | ctrl 中会出现 sign 函数 |
| 4-6 | 连续滑模、边界层厚度调节 | ctrl 中会出现 sat 或 tanh |
| 7-9 | 双连杆机械臂轨迹跟踪、抗扰动 | plant 文件明显变长,包含 M/C/G |
| 10-12 | 轨迹规划、输入整形、模糊滑模组合 | 多出 design、input、mf 文件 |
这个梯度对自学非常友好。你可以直接从第 7 章的chap4_7入手——它是最典型的"双连杆 + 连续滑模 + 轨迹跟踪"组合,能一口气看到完整闭环。
2.3 这套资源能解决什么,不能解决什么
它能让你在半天内理解连续滑模控制从建模到出图的完整链路,免去自己查资料拼代码的时间;还能作为你换被控对象、改期望轨迹、对比不同趋近律的实验底座。
它不能替代你理解滑模理论。如果连滑模面 s = e_dot + c*e 都还没想明白,直接调参只会把时间耗在"参数为什么这么怪"上。建议先跑通一个案例,再回头看理论,会顺畅很多。
3. 核心实现拆解:滑模面、趋近律和连续化处理(附可抄的 MATLAB 代码)
这一章是整个资源的技术核心。我从典型文件里抽出三块必看内容:被控对象的动力学建模、滑模面的设计、以及把 sign 换成 sat 的连续化处理。
3.1 被控对象建模:两连杆机器人的 M、C、G 矩阵怎么算
机器人滑模仿真里,plant 文件写的通常是拉格朗日动力学模型,形式固定为:
M(q) * q_ddot + C(q, q_dot) * q_dot + G(q) = tau + d
其中 M 是惯性矩阵,C 是科氏力/离心力矩阵,G 是重力项,d 是外部扰动。典型的两连杆模型在 MATLAB 里的写法长这样:
function [M, C, G] = chap4_7plant(q, q_dot) % 两连杆机械臂动力学模型 % 输入: q(2x1)关节角, q_dot(2x1)关节角速度 % 输出: M惯性矩阵, C科氏力矩阵, G重力项 m1 = 1.0; m2 = 1.0; % 连杆质量 [kg] l1 = 1.0; l2 = 1.0; % 连杆长度 [m] g = 9.8; % 重力加速度 [m/s^2] q1 = q(1); q2 = q(2); % 惯性矩阵 M(q) M11 = (m1 + m2) * l1^2 + m2 * l2^2 + 2 * m2 * l1 * l2 * cos(q2); M12 = m2 * l2^2 + m2 * l1 * l2 * cos(q2); M21 = M12; M22 = m2 * l2^2; M = [M11, M12; M21, M22]; % 科氏力矩阵 C(q, q_dot) h = -m2 * l1 * l2 * sin(q2); C = [h * q_dot(2), h * (q_dot(1) + q_dot(2)); -h * q_dot(1), 0]; % 重力项 G(q) G = [(m1 + m2) * g * l1 * cos(q1) + m2 * g * l2 * cos(q1 + q2); m2 * g * l2 * cos(q1 + q2)]; end这段代码的逻辑很直接:输入当前关节角和角速度,输出动力学矩阵。SLAM 里常说"模型即代码",机器人仿真里这句话同样成立——你的 M、C、G 算错一个符号,后面控制器再怎么调都白搭。
参数说明:m1、m2 和 l1、l2 是物理参数,影响系统的自然频率和耦合强度;g 是重力常数。改任何一项,等价于换了一台机器人。如果后面要对照真实机械臂,把这里的物理参数换成实机标定值即可。
3.2 控制律实现:从 sign 切换到 sat 连续化
连续滑模和普通滑模的唯一区别,就在切换函数上。经典滑模控制律长这样:
tau = M * (q_dd_des + c * e_dot) + C * q_dot + G - K * sign(s)
其中 s = e_dot + c * e,c 是滑模面斜率,K 是切换增益。这里如果用 sign(s),控制力矩会在滑模面两侧高频切换,产生抖振——这就是你会在 plot 图里看到的"锯齿"。实际工程里很少有人直接上 sign,而是用饱和函数 sat 或 tanh 替换。
function tau = chap4_7ctrl(q, q_dot, q_des, q_dot_des, q_ddot_des, param) % 连续滑模控制器 % 输入: 实际状态q/q_dot, 期望轨迹q_des/q_dot_des/q_ddot_des % 参数结构体param: 含c(滑模面斜率), K(切换增益), phi(边界层厚度) c = param.c; K = param.K; phi = param.phi; % 跟踪误差及其导数 e = q - q_des; e_dot = q_dot - q_dot_des; % 滑模面 s = e_dot + c * e; % 饱和函数替代符号函数, 消除抖振 sat_s = min(max(s / phi, -1), 1); % 等效控制 + 切换控制 tau_eq = param.M * (q_ddot_des + c * e_dot) + param.C * q_dot + param.G; tau_sw = -K * sat_s; tau = tau_eq + tau_sw; end关键区别在第一眼能看到的地方:sat_s = min(max(s / phi, -1), 1)这行,把s / phi限制在[-1, 1]区间内。当 s 很大时,饱和函数输出 ±1,等效于符号函数;当 s 落到边界层[-phi, phi]内时,输出变成线性比例,切换被"软化",抖振自然消失。
参数说明:phi 就是边界层厚度,是连续滑模最重要的旋钮。phi 太大,控制平滑但跟踪精度变差;phi 太小,抖振打回原形。经验值通常是滑模面数量级的 0.01 到 0.1 倍,具体要靠试。K 是切换增益,必须大于扰动上界,否则鲁棒性会崩溃。
3.3 Simulink 模型与脚本的协同:先跑哪些文件
.mdl模型不是双击就能跑,多数情况下它依赖工作区里已有的变量。所以运行顺序有讲究。我建议的固定顺序是:
% 1. 加载控制器参数(如果存在独立参数脚本) % 例如: 先在命令行手动设置param结构体, 或直接运行设计脚本 param.c = 15; % 滑模面斜率 param.K = 40; % 切换增益 param.phi = 0.05; % 边界层厚度 param.M = []; % 稍后由plant计算并填回 % 2. 初始化动力学模型所需的物理参数 % 通常由sim.mdl内部调用plant文件完成, 不需要手动执行 % 3. 运行Simulink模型 open_system('chap4_7sim.mdl'); % 打开模型 simOut = sim('chap4_7sim.mdl', 'StopTime', '10'); % 仿真10秒 % 4. 绘出结果 run('chap4_7plot.m');第一行open_system打开模型,第二行sim是真正的执行动作。StopTime 是仿真时长,设太短看不到收敛过程,设太长又浪费时间。10 秒对双连杆轨迹跟踪足够。
逻辑说明:这个顺序的本质是先给工作区喂参数,再通过 Simulink 把 plant 和 ctrl 接成闭环。很多新手直接双击.mdl然后点 Run,结果报"undefined variable param",就是因为跳过了第 1 步。
4. 从零跑通 chap4_7:双连杆连续滑模轨迹跟踪的可复现参数
这一章我用chap4_7作为完整案例,带你从参数设置跑到出图,全部参数给到可直接复现的程度。
4.1 准备工作:把文件放进 MATLAB 路径
先把压缩包解压,把包含全部.m和.mdl的文件夹设为 MATLAB 当前路径,并确认 Simulink 已安装(ver('simulink')能看到版本信息即为正常)。然后执行上一章的参数初始化脚本。
这里给一套我在双连杆上试过能稳定收敛的参数组合,你直接抄即可:
| 参数 | 含义 | 推荐值 |
|---|---|---|
| m1, m2 | 连杆质量 | 1.0 kg |
| l1, l2 | 连杆长度 | 1.0 m |
| g | 重力加速度 | 9.8 m/s^2 |
| c | 滑模面斜率 | 15 |
| K | 切换增益 | 40 |
| phi | 边界层厚度 | 0.05 |
| StopTime | 仿真时长 | 10 s |
| 期望轨迹 q1_des | 关节1参考角 | sin(t) |
| 期望轨迹 q2_des | 关节2参考角 | cos(t) |
4.2 手动验算一次闭环收敛性
拿到参数后先别急着跑仿真,用一小段脚本验算滑模面的可达性,能避免你后面把时间浪费在无意义的调参上。
% 在仿真前做一次开环验算 q0 = [0.5; 0.2]; % 初始关节角 q_dot0 = [0; 0]; % 初始角速度 s0 = q_dot0 + param.c * (q0 - [0; 0]); fprintf('初始滑模面 s0 = [%.3f, %.3f]\n', s0(1), s0(2)); % 检查K是否大于扰动上界 % 若扰动d_max = 5, 则K必须 > 5, 否则无法保证可达 assert(param.K > 5, '切换增益K过小, 无法克服扰动');逻辑说明:s0是滑模面的初值,决定控制器"从多远开始拉"。assert那行是在验证 K 是否满足匹配条件——滑模控制保证可达性的前提是切换增益大于扰动上界,这条不满足,后面全是白做。
参数说明:扰动上界要按你的 plant 模型实际估计。如果仿真里加了幅值为 5 的正弦扰动,K 取 40 完全冗余但安全;如果扰动上界是 100,K=40 就会翻车。
4.3 Simulink 模型检查:确认信号线和 S 函数调用顺序
打开chap4_7sim.mdl后,重点检查三处:
- 期望轨迹信号是否从输入端口接入控制器。
- plant 函数的调用是否在控制器之前完成——控制律用到的 M、C、G 必须来自"当前仿真步"的 plant 输出。
- 输出端口是否把 q、q_dot、tau、s 全部引出,否则 plot 脚本会因缺少变量报错。
我见过很多人在模型里直接把 M(q) 反号搭进控制器,造成代数环,仿真直接卡死或者步长小到飞起。解决办法是在 ctrl 模块里用set_param断开直通路径,或者把 M 的计算从控制律里拆出去,单独走一条信号线延时一拍。具体到这套资源,通常设计者已经处理过,你不用改,但要知道这是隐患。
4.4 看懂 plot 输出:收敛、抖振、误差三条曲线
仿真跑完后,plot脚本会画出几条关键曲线。你要看的东西按优先级排序:
- 跟踪误差 e(t) 是否收敛到 0 附近:收敛则说明滑模面设计合理;不收敛往往是 phi 太大或 c 太小。
- 控制力矩 tau(t) 是否有高频振铃:有振铃说明连续化没生效(可能用了 sign),或者 phi 取太小。
- 滑模面 s(t) 是否在有限时间内被压到边界层内:这是滑模控制"到达阶段"的直观验证,s 快速进入
[-phi, phi]区间并保持,说明控制器正常工作。
5. 连续滑模仿真避坑指南:五个翻车现场与补救办法
仿真资源的坑不在代码本身,而在使用场景。这里写下我调这套程序时踩过的五条实坑,全部按"现象 → 原因 → 解决"给出。
5.1 控制力矩波形像锯齿,抖振严重
现象:plot 出的 tau 曲线不是平滑曲线,而是高频密齿状切换,类似锯齿波。
原因:控制器里用了 sign(s) 而非 sat 或 tanh。这套资源虽然叫"连续滑模",但部分早期案例为了演示对比,会刻意保留符号函数版本;或者你在修改参数时把 phi 改成了 0,饱和函数退化为 sign。
解决:确认param.phi不为 0;把控制律里的sign(s)替换为min(max(s/phi, -1), 1)。替换后重新跑仿真,锯齿波形会消失,代价是误差会略微增大,这是"平滑换精度"的正常权衡。
5.2 系统发散,输出直接飞到天文数字
现象:仿真运行到中途,关节角输出变成 1e5 级别的巨大数值,或者直接报"Simulink 仿真失败"。
原因:多半是 M 矩阵求逆时出现了奇异或接近奇异。双连杆机械臂在 q2 接近 0 或 pi 时,惯性矩阵 M 的某些元素趋近于零,控制器里的inv(M)或 M 除法数值爆炸。
解决:对 M 做正则化处理,给对角线加一个小量:M_reg = M + 0.01 * eye(2);。或者约束期望轨迹,避免关节角穿越机械奇异位形。注意,这类发散不是控制器设计问题,而是数值仿真问题。我一般会在 plant 函数入口加一行检查:若det(M) < 0.01,直接报错并终止仿真。
5.3 仿真速度极慢,卡得怀疑人生
现象:模型能跑,但仿真进度条几乎不动,10 秒的仿真要跑好几分钟。
原因:模型里存在代数环或极小的步长死循环。代数环迫使求解器在每个时间步内迭代求解,加上连续滑模控制律里有符号函数/饱和函数这类非光滑项,变步长求解器会不断把步长缩小。
解决:确定固定步长,例如ode4+ 步长 0.001 秒,牺牲一点精度换速度;如果发现改进不大,检查模型中是否存在 M(q) 直接反馈到控制器的直通路径,在中间加一个 Memory 模块延时一拍,能显著缓解。
5.4 跟踪误差收敛不到零,总有 0.1 级别的静差
现象:误差曲线最后稳定在 0.1 或 0.05 左右,不再下降。
原因:边界层厚度 phi 太大,等效控制精度不足;或者是期望轨迹加速度 q_ddot_des 没被正确引入控制律,导致跟踪带相位滞后。
解决:逐步减小 phi(0.05 → 0.02 → 0.01),观察抖振和误差的折中;同时检查 ctrl 里是否真的使用了q_ddot_des作为前馈项。如果 q_ddot_des 缺失,跟踪效果会始终带着一个与加速度有关的滞后。
5.5 旧版.mdl文件打不开或模型降级提示
现象:双击.mdl时 MATLAB 报"模型版本过旧,需要升级"或直接不认。
原因:.mdl是旧版 Simulink 格式,新版本虽然兼容,但升级过程中可能出现信号线错乱或配置缺失。
解决:先open_system查看警告内容,确认参数和连线都完整再保存。如果模型里含有 S-Function 或自定义模块,请确认对应.m文件也在路径上。最稳妥的复现方式是:不依赖.mdl,直接用.m脚本在命令行搭一个 Simulink 模型,控制逻辑不变。这在后期改自用模型时是常态操作。
6. 把第 4 章程序改造成自己的机器人和验证方法:边界与技巧
程序包最终要落到"你自己的工作"上,不能永远停留在跑别人的例子里。这一章给出移植改造的边界和两套验证办法。
6.1 换被控对象时,三类文件各自要改什么
如果你有一台自己的二自由度机械臂,想用这套连续滑模控制,改动边界很清楚:
- 只改
plant.m:把 m1、m2、l1、l2 换成你自己机械臂的参数,M、C、G 的计算结构不变。 - 微调
ctrl.m:K、c、phi 三个参数要重调,控制律结构不动。特别是 K,它要重新按新机械臂的扰动上界选择。 - 保持模型接线不变:Simulink 顶层模型里 plant 和 ctrl 的接口约定是 q、q_dot、q_des、tau,只要新 plant 函数输出和 ctrl 输入保持 2 维向量,模型不用动。
我见过最容易犯的错,是把新机械臂的减速比和电机惯量误差直接加进 plant 里,却没在 ctrl 里同步补偿。结果就是高频振荡。正确做法是先把减速比和传动效率折算到连杆侧的惯量矩阵里,保证 plant 的 M 矩阵仍然是模型世界的"真实惯性"。
6.2 验证新参数是否靠谱的"先线性化再上滑模"法
改完参数后,先别急着把 c 和 K 调大追求极端性能。我的习惯做法是:
- 把期望轨迹设为常数(定点跟踪),用
linmod在平衡点线性化系统,看闭环极点是否落在左半平面。 - 极点稳定后,再换回正弦或梯形轨迹做动态跟踪。
- 观察滑模面 s 是否进入边界层,以及进入后是否保持。
这套验证顺序能帮你区分"控制器设计错误"和"参数没调好"。很多情况是模型线性化后就发现了问题——比如某连杆重力项符号反了,导致平衡点根本不存在。
6.3 仿真结果落成论文图的三个习惯
plot脚本里的作图函数值得直接复用,但你要注意三个细节:把线宽加粗到 1.5 以上、在图例里写清"desired"和"actual"、坐标轴标签要带单位和物理量。这种细节在论文投稿时能省很多时间。
还有一个实用习惯:每次实验后把参数结构和输出数据一起存成一个.mat文件,命名带日期,例如exp_20250410_phi005.mat。这样后面回溯"哪组参数出了哪张图"时,不用重跑仿真。从那以后我每调一组新参数,都会强制走一遍"存参数 → 跑仿真 → 存结果 → 出图"这条流水线。改自己的机械臂参数时尤其管用,一套流程下来,很少再为参数玄学返工。
希望这套连续滑模仿真包的拆解能帮到你,跑通第 7 章案例时,你就能体会到"看着误差曲线收敛到零"的踏实感。
本文还有配套的精品资源,点击获取