ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

滑模控制从原理到Simulink仿真:四旋翼姿态控制与调参避坑指南

滑模控制从原理到Simulink仿真:四旋翼姿态控制与调参避坑指南 搞了这么多年控制算法从经典PID一路折腾到各种现代控制方法我越来越觉得滑模控制是个绕不开的东西。它在非线性系统、强扰动场合下的表现确实能打尤其是做四旋翼仿真、机械臂轨迹跟踪这类工程问题时滑模控制几乎是工程师工具箱里的标配方案之一。这篇文章不整虚的就从我对滑模控制的理解出发把设计思路、数学原理、Simulink实现和调参避坑一次性讲清楚适合刚接触滑模控制的研究生、工程师也适合在PID方案上遇到瓶颈想换思路的同行参考。1. 滑模控制的核心思想与设计框架1.1 一句话理解滑模控制滑模控制的全称是滑模变结构控制英文Sliding Mode Control简称SMC。它的核心思想可以概括为设计一个滑动面然后通过控制律迫使系统状态在有限时间内到达这个滑动面并沿着滑动面滑向平衡点。这个思路跟PID完全是两个路子。PID是在误差上做文章通过比例、积分、微分的组合来修正偏差滑模控制则是在系统状态上划了一条“轨道”让状态变量顺着轨道滑下去。你不需要精确知道系统的全部动态只要满足匹配条件的不确定性在一定范围内滑模控制就能通过高频切换把系统“拉”到滑动面上来。打个比方就像你在一个光滑斜坡上滑雪地形的具体摩擦系数你不需要精确测量你只需要控制好身体朝向让雪板始终横切在指定的滑降轨道上哪怕有侧风把你往旁边吹你也能通过不断调整姿态回到轨道上。这个“不断调整”在控制上就是高频切换而这个“指定轨道”就是滑动面。1.2 两个阶段到达阶段与滑动阶段滑模控制的过程拆开来看分两个阶段。第一阶段是到达阶段也叫趋近阶段。这个阶段系统的状态还没有跑到滑动面上控制律的作用是把状态从任意初始点拉向滑动面。第二阶段是滑动阶段状态到达滑动面之后控制律的任务变成让状态保持在滑动面上并沿着滑动面收敛到期望的平衡点。这两阶段的划分在实际设计里特别重要因为你得分别设计两套机制。到达阶段对应的是“到达条件”和“趋近律”滑动阶段对应的是滑模面的参数选取。很多新手上来只盯着滑动面设计忽略了趋近律的合理性结果系统要么到达太慢要么到达时冲击过大这在工程上是致命的。1.3 为什么滑模控制对不确定性那么宽容滑模控制最吸引人的特性就是鲁棒性。所谓的鲁棒性通俗讲就是“系统参数变了、外界有扰动控制效果依然稳定”。这背后的数学原理在于滑模控制的切换项。传统PID的抗扰能力靠积分的累积本质上是把扰动的影响慢慢“磨掉”响应速度有限滑模控制则直接在控制律里加了一个不连续项比如增益乘以符号函数这个项的绝对值大于扰动上界时无论系统内部参数怎么摄动、外部扰动怎么变化状态都会被强行推向滑动面。换句话说滑模控制不是被动地去估计扰动而是主动地“压住”扰动。这也就是为什么滑模控制特别适合四旋翼这类系统。四旋翼的动力学模型里包含大量非线性项气动参数会随飞行姿态变化还容易受到阵风等外部扰动影响。你用PID去调得好好的参数换个飞行状态可能就不稳了滑模控制因为对模型不确定性天然有包容性在参数发生偏移时依然能维持较好的控制品质。2. 滑模控制的数学原理与设计要点2.1 滑模面的设计从最简单的线性滑模面说起滑模面的设计是整个控制器的骨架。最经典的是线性滑模面对于一个二阶系统滑模面一般取s c * e edot其中e是误差edot是误差的导数c是滑模面参数必须大于0。当系统进入滑动阶段s 0也就是说edot -c * e这是一个一阶线性微分方程它的解是指数衰减的衰减速率由c决定。c越大状态沿滑模面收敛的速度越快。这里的含义值得好好体会。滑模面把二阶系统的镇定问题降阶成了一个一阶系统的稳定问题。这跟“你只需要管好一个变量剩下的交给几何关系”是一个道理。所以滑模面参数c的选择本质上是性能指标的选择c越大收敛越快但可能带来更大的控制输入峰值和更严重的抖振c越小收敛越平缓但抗扰能力会下降。后面调参部分我再细说。2.2 等效控制项是怎么来的滑模控制的控制律通常分成两部分u u_eq u_swu_eq是等效控制项它描述的是“在理想情况下即在系统完全处于滑动面上时维持滑动状态所需要的控制量”。求法是把滑模面对时间求导令导数为零反解出控制量。拿一个简单的仿射非线性系统来演算xdotdot f(x, xdot) g(x) * u构造滑模面s c*e edot对它求导得sdot c*edot edotdot代入系统方程并令sdot 0反解出的u就是等效控制u_eq (-f(x, xdot) - c*edot xddot_ref) / g(x)注意这里的f和g是模型的名义值。也就是说等效控制项对模型的依赖程度很高模型不准确时等效控制算得不准但没关系因为我们还有切换项兜底。2.3 切换控制项与趋近律的选择切换控制项的作用就是保证系统能到达滑模面并且在有扰动的情况下维持在滑模面上。最简单的取法u_sw -k * sign(s)k是切换增益必须大于系统不确定性模型误差加外部扰动的上界。只要k足够大s* sdot 0这个到达条件就能满足系统必然收敛到滑模面。但直接上sign(s)有个问题——抖振。因为符号函数在s 0附近是不连续的控制输入会在两个方向之间瞬间切换实际系统中这种高频切换会激发未建模动态导致剧烈的振荡。这就是所谓“抖振”英文叫chattering。为了缓解抖振工程上常用趋近律来替代单纯的符号函数切换。常见的趋近律有等速趋近律sdot -ε * sign(s)ε是等速趋近速率指数趋近律sdot -ε * sign(s) - k * s第二项让s大时趋近快s小时趋近慢幂次趋近律sdot -k * |s|^α * sign(s)0 α 1在s接近0时趋近速率自然变小其中指数趋近律用得最多。它引入了-k*s这个比例项相当于在切换项之外加了一个“柔性拉力”s越大的时候拉得越快s越小的时候拉力越小这样既能保证到达速度又能减少到达滑模面时的冲击。模拟的时候就会发现用指数趋近律比纯sign(s)的抖振幅度小得多。3. 从PID到滑模为什么四旋翼控制要换思路3.1 四旋翼模型的非线性困难在哪四旋翼的动力学模型写出来就是一组高度耦合的非线性微分方程。机体坐标系下的角速度和姿态角之间的转换关系是非线性的气动阻力和螺旋桨转速的平方成正比电机延迟和机架振动等实际因素还会引入高阶未建模动态。用PID控制四旋翼传统做法是把它线性化处理在小角度假设下把模型简化成线性系统然后在平衡点附近设计PID参数。这在悬停和小幅机动时够用但一旦做大角度机动、快速穿越或者挂载载荷发生变化系统就偏离线性化点了PID参数会“失效”控制品质明显下降严重时直接发散。滑模控制因为是非线性控制方法不依赖局部线性化它处理非线性项的方式是把不确定性包括线性化误差、参数摄动、外部扰动都打包进一个有界项然后通过切换增益去覆盖它。这个思路在理论上保证了全局稳定性这也是它为什么和四旋翼是“绝配”。3.2 四旋翼控制架构中的滑模角色四旋翼的控制架构通常是内外环结构。外环是位置环把期望位置转换成期望姿态角roll、pitch、yaw内环是姿态环跟踪期望姿态角并输出PWM控制量。滑模控制一般用在姿态环上因为姿态环是四旋翼稳定性的核心响应速度要求高非线性耦合最严重。外环也可以用滑模但工程上内环滑模外环PID的组合更常见。原因是位置环的动态响应相对慢PID在慢回路上调起来比较省心姿态环的快速性和鲁棒性才是决定飞行品质的关键把滑模用在这里性价比最高。我做四旋翼仿真时采用的就是这个方案外环PID生成姿态指令内环滑模跟踪姿态指令。仿真结果比内外环全PID方案在抗风扰动方面的表现好不少尤其是有持续侧风的情况下滑模方案的姿态偏差明显更小。3.3 一个简化的四旋翼姿态动力学模型为了在仿真里设计滑模控制器姿态动力学一般简化为三个通道的独立方程以roll角为例phiddot (Jy - Jz)/Jx * thetadot * psidot tau_phi / Jx d_phi其中Jx、Jy、Jz是转动惯量tau_phi是滚转力矩控制量d_phi是集总扰动。pitch和yaw通道形式类似只是转动惯量和角速度的交叉乘对调。滑模控制器可以基于这个简化模型来设计把交叉耦合项当作扰动的一部分由切换项来抵消。这里要注意一点如果你足够追求精度仿真模型里千万别也用简化模型那就自欺欺人了。我习惯求滑模控制律用的是名义简化模型仿真验证用的则是完整非线性模型包含惯性积、气动阻尼、电机动态等这样才能验证滑模控制对模型误差的鲁棒性。4. Simulink仿真全流程从模型搭建到S函数编写4.1 仿真的整体架构规划四旋翼滑模控制的Simulink仿真我一般分成四个模块参考轨迹生成模块、位置控制模块、姿态控制模块、四旋翼动力学模块。如果是纯验证滑模算法可以直接把位置环去掉只做姿态跟踪把仿真的核心集中在姿态环上这样能减少干扰因素更快看到控制器效果。我这边以姿态控制为例搭建一个完整的Simulink模型需要这几步确定仿真步长。滑模控制是变结构控制对离散化比较敏感建议用固定步长仿真步长取1e-3或更小。搭建四旋翼动力学模块。用MATLAB Function实现姿态动力学方程。搭建滑模控制器模块。输入是期望角速度、期望姿态角、实际姿态角和角速度输出是力矩控制量。加扰动模块。在动力学模型的力矩输入端叠加一个正弦扰动或阶跃扰动用于验证鲁棒性。4.2 滑模控制器模块的MATLAB Function实现姿态环的滑模控制器我用MATLAB Function实现。以roll通道为例滑模面取s c * (phi - phi_des) (phidot - phidot_des)控制律采用等效控制加指数趋近律u_eq (Jx * (phiddot_des - c*(phidot - phidot_des)) - (Jy-Jz)*thetadot*psidot) / Jx u_sw -K / Jx * (sign(s) lambda * s)等等这里我重新整理一下写成代码里实际的样子。注意控制量应该除以控制输入系数因为动力学方程里tau/Jx那一项的控制输入前是有系数的。完整的MATLAB Function写法如下function tau_phi smc_roll(phi, phidot, phi_des, phidot_des, phiddot_des, theta_dot, psi_dot) % 参数定义 Jx 0.015; % 转动惯量 c 8; % 滑模面参数 K 2; % 切换增益 lambda 10; % 指数趋近系数 eps 0.1; % 边界层厚度 % 滑模面 e phi - phi_des; edot phidot - phidot_des; s c * e edot; % 饱和函数替代符号函数 sat_s min(max(s/eps, -1), 1); % 等效控制 u_eq Jx * (phiddot_des - c * edot) - (Jy - Jz) * theta_dot * psi_dot; % 切换控制 u_sw -K * (sign(s) lambda * s); % 总控制输出 tau_phi u_eq u_sw; end注意上面代码里我用到Jy和Jz但没传参实际写的时候要把所有需要的量都传进来这只是个示意结构的片段。另外我特意写了饱和函数sat_s虽然是示意但实际仿真我一定会用sat函数替代sign函数这个后面讲抖振抑制的时候再展开。4.3 动力学模块搭建和信号连接动力学模块直接实现姿态运动方程输入是三个通道的力矩tau_phi、tau_theta、tau_psi输出是姿态角phi、theta、psi及角速度。内部逻辑用积分器模块或者MATLAB Function都行我习惯用MATLAB Function因为方便后续往模型里加扰动项。关键点是角速度输出要反馈给控制器做滑模面的计算姿态角也要反馈。Simulink里别用代数环一定要经过积分器模块的连续状态来解耦。我的做法是先把角加速度算出来经过积分器得到角速度再经过积分器得到角度这样就自然地打破了代数环。信号连接上还要注意单位的统一。姿态角一律用弧度输入期望信号也是弧度。很多人在仿真里角度单位换来换去结果控制器增益怎么调都不对最后发现是单位问题这种低级错误真的浪费了大量时间。4.4 仿真结果怎么看仿真跑起来之后要重点看三个信号姿态角的跟踪曲线、滑模面的收敛曲线、控制输入力矩曲线。姿态角跟踪曲线体现控制性能看它的超调量和稳态误差滑模面曲线体现滑模阶段的收敛性能理想情况下s应该快速收敛到0附近的小邻域控制输入曲线体现执行机构的压力。如果控制输入频繁剧烈振荡你的参数就需要调整了。我在一次仿真中把期望roll角设成20°的阶跃信号给动力学模块加了幅度0.5的正弦扰动滑模控制方案的姿态角最大偏差控制在1.5°以内而同样参数调优后的PID方案最大偏差到了4°多。这就是滑模鲁棒性最直观的体现。5. 参数整定经验哪些参数要调怎么调才稳5.1 滑模面参数c的整定规则滑模面参数c决定了滑动阶段的收敛速率。对姿态环来说我一般先估算系统闭环带宽需求然后据此设定c的范围。c的值不要拍脑袋取。如果系统期望调节时间是0.5秒左右那么c取4到8这个范围基本合适如果期望更快可以继续增大但要留意控制输入是否饱和。工程上我的经验是c太小比如2姿态跟踪会显得“肉”误差收敛很慢c过大比如30控制输入峰值会很大接近执行机构的物理极限建议从c5起步逐步增大观察跟踪响应是否还平滑5.2 切换增益K的选择逻辑切换增益K是滑模控制里最敏感也最关键的参数。它的物理意义是“对抗不确定性的强度”理论上只要K大于扰动的上界就能保证系统稳定但实际中K过大会让抖振幅度显著增大。我的整定方法是反向操作先给一个较小的K观察状态在滑模面附近的表现如果误差稳定在一个小范围内没发散就说明K够用如果系统“很难收住”说明K不足需要增大。这样找出来的K是满足稳定性的最小值抖振也相对最小。一个好的经验法则是K的值应该是扰动上界的1.5到2倍。你在仿真中给扰动模块设置了多大的幅值心里有数按这个上界去定K的量级整定效率高很多。5.3 边界层法抑制抖振的实际效果抖振是滑模控制工程化最大的敌人。数学上抖振源于sign(s)在s0处的不连续性解决思路就是把这层不连续“抹平”。边界层法是实现最简单、效果最可控的方案用饱和函数sat(s/eps)替换sign(s)eps是边界层厚度。边界层的作用在于当|s| eps时控制律接近原切换控制的动作当|s| eps时控制量变成连续线性输出避免了高频切换。代价是系统的稳态误差会变大这个误差跟eps成正比。我实测下来的经验是eps不要取太大不然滑模的强鲁棒性就没了也不要太小太小等于没加。我一般在0.01到0.1这个量级去试配合K一起调。调好后控制输入明显平滑很多四旋翼姿态响应的振荡也小了很多代价是稳态误差从原来的几乎为零变成0.1°左右这在工程上完全可以接受。5.4 一个调参顺序建议很多新手调滑模参数时东一榔头西一棒子三个参数同时动最后出了问题都不知道是谁引起的。我建议按这个顺序调先固定K和eps调c直到跟踪速度满足需求固定c和eps从小到大调K直到扰动下系统不失控最后微调eps在抖振和稳态误差之间取平衡每步只动一个参数记录下每个参数改变后的响应曲线变化这不仅让调试过程可控也为后续写论文或输出调参报告积累了素材。6. 仿真中踩过的坑与解决实录6.1 抖振严重到仿真发散我第一次在Simulink里跑滑模姿态控制器时直接用sign(s)仿真步长取1e-3结果控制力矩曲线简直像锯齿一样姿态角跟踪曲线虽然勉强能收敛但角速度上有明显的高频噪声仿真后期甚至出现了数值发散。排查下来原因有两层。第一层是sign函数的不连续性和数值求解器的刚性冲突固定步长下离散化把高频切换变成了数值振荡第二层是我K给得太大切换幅度远超实际扰动需求。解决方案是三个动作同时做换用饱和函数替代符号函数把仿真步长缩小到2e-4把K从5降到了2。经过这三步控制输入曲线平滑了很多姿态响应也稳定了。这个问题几乎每个做滑模仿真的人都会遇到如果一上来就抖振先别怀疑算法有问题大概率是数值处理没做到位。6.2 期望轨迹突变导致控制量饱和另一个典型问题是期望姿态角给得太大太突然时滑模控制器输出的力矩需求超过了四旋翼能提供的物理上限控制量饱和后系统的跟踪性能急剧下降。这个问题的本质是滑模控制在设计时默认控制输入是“无限能力”的但实际系统肯定有物理约束。我在仿真里加了限幅模块之后发现饱和期间滑模控制器会“拼命”输出限幅值一旦期望信号的阶跃足够大饱和时间过长状态就会冲过头之后要花很长时间才能拉回来。解决办法有两个方向。一是从参考轨迹上做文章不要直接给阶跃信号用S型平滑曲线或者梯形速度曲线做期望输入降低初始冲击二是在控制器输出前加合理的力矩限幅限幅值参考电机的物理输出能力来设定。我后来把阶跃信号换成斜坡跟踪信号后系统平滑了很多也更容易观察滑模的真正性能。6.3 测量噪声放大问题仿真里不加噪声看不出问题一加噪声就原形毕露。滑模控制对量测噪声其实挺敏感的因为滑模面里有误差的导数项求导运算会放大噪声进入切换项之后还会激励出额外的抖振。我仿真四旋翼姿态环时给陀螺仪信号叠加了白噪声结果角速度信号测量噪声被滑模面的求导项放大控制力矩曲线出现了明显的高频抖动。解决方法是给角速度反馈信号加一阶低通滤波器截止频率取在控制带宽的3到5倍既能滤掉噪声又不至于影响控制相位。这里要特别提醒滤波器的时间常数不要太大滤波会导致反馈信号的相位滞后若滞后严重切换增益又足够大系统甚至可能出现极限环振荡。这个坑也困扰了我一阵子后来是通过逐步减小滤波时间常数、观察滑模面收敛情况来找到平衡的。6.4 常见问题速查表现象可能原因排查与解决控制力矩剧烈高频振荡sign函数切换、K过大、仿真步长过大换sat函数降低K缩小步长姿态跟踪稳态误差偏大边界层eps过大、滑模增益过小减小eps适当增大K大幅阶跃响应超调严重控制量饱和、c过大平滑期望轨迹限制力矩输出噪声下控制抖动加剧滑模面微分项放大噪声加低通滤波减小滑模面微分增益系统无法到达滑模面K小于扰动上界、模型错误增大K检查名义模型是否正确仿真后期数值发散固定步长下高频切换激励刚性问题减小步长用ode4或ode5求解器6.5 观测器配合滑模控制的补充思路说到这里顺便提一个扩展方向。上面所有实现都假设状态全部可测但实际飞行器里角速度可测、某些状态可能估计不准或者有延迟这时通常的做法是引入滑模观测器或者扩张状态观测器来估计集总扰动把扰动估计值前馈补偿到控制律里。这个做法的好处是把切换增益K的要求降低——因为大头的扰动被观测器估计并补偿了切换项只需要处理估计残差即可抖振会进一步减弱。我后续在做抗扰滑模控制时采用了这种“观测器滑模”的组合效果比单独用滑模控制还好控制输入比纯滑模平滑很多。不过要加一句观测器本身就引入了额外的动态调试复杂度明显上升如果你刚上手滑模控制先把纯滑模跑通调顺再考虑加观测器一步一个台阶比较稳。6.6 离散化深度思考与经验最后分享一个容易被忽略的点。Simulink仿真用的连续模型和离散控制器的组合中采样周期的选择会影响滑模面的收敛质量。滑模控制理论上是连续时间设计实际物理系统必然是离散采样的采样周期过大切换控制在离散域上会出现明显的“极限环等价物”——状态在滑模面附近来回穿越的幅度会明显变大。我的经验是采样频率至少要是滑模动态带宽的20倍以上。以姿态环设计带宽10Hz为例采样频率最少200Hz对应采样周期5ms。我做仿真时采样周期取1ms得到的结果就比较干净。如果你做的是实物验证这个准则同样适用采样频率不够时先别急着怀疑算法把采样频率提上去看是否改善很多时候就是这个简单的问题。7. 写在最后的一点个人体会做了一段时间滑模控制之后我对它的评价是理论门槛不高但工程化的坑是真的多。滑模面的构造、到达条件的验证这些数学部分花几天就能理解真正花时间的地方全在调参、滤波、抗抖振、处理数值问题这些细节上。但话说回来也正因为它需要你踏踏实实去调试去理解每个参数背后的物理意义整个过程对我的控制直觉提升帮助很大。如果你也在做运动控制或机器人相关的项目建议别光在论文里看滑模动手在Simulink里搭一个简单的姿态控制器亲眼看一次滑模面的收敛过程比读十篇综述都管用。参数调顺了之后你会对“鲁棒性”这三个字有完全不一样的体感。
返回列表