资讯动态

反步滑模控制提升四旋翼抗风扰稳定性及Matlab仿真实现

发布时间:2026/10/21 17:33:48 来源:尧图企业网站定制
做无人机控制的朋友应该都有过这种经历地面上一米不飘的无人机飞到半空中一阵阵风吹过来机身就开始抖位置开始飘姿态角来回晃。如果你用的还是传统PID有时候调得再顺碰到阵风扰动也会出现长时间恢复不过来的情况。这背后不是参数没调好而是控制律本身对不确定外扰的鲁棒性不够。今天要聊的就是用反步控制Backstepping结合滑模控制SMC来提升四旋翼在动态风扰环境下的稳定性。这篇内容会完整讲清控制律怎么推导、Matlab仿真源码怎么落地、以及实际操作中到底有哪些坑适合做无人机方向课题、竞赛或者刚接触非线性控制又想把东西真正跑起来的朋友作为参考。1. 风扰环境下四旋翼控制的真实痛点从PID失稳说起四旋翼这东西看着简单四个电机一转就能飞但它本质上是一个高度非线性、强耦合、欠驱动的系统。所谓欠驱动就是控制输入只有四个总推力加三个力矩却要管六个自由度的运动。位置靠姿态间接控制姿态又靠转速差直接控制两个回路摞在一起任何一个环节出问题整机就不稳。而风扰恰恰是这条控制链路上最麻烦的外部因素。在真实环境中无人机遇到的多半不是恒定均匀的风而是阵风、突变风、湍流、或者不同高度层的剪切风。阵风一旦打在机身上等效于突然叠加了一个外部力和外部力矩。这个时候你原来调好的那组PID参数就很容易“失灵”——因为PID本质上是把系统在某一个工作点附近做了线性化处理它不知道模型到底是怎么变化的只会按照误差的比例、积分、微分去强行纠正。风扰一强纠正速度跟不上就会出现位置漂移、姿态持续振荡、甚至越调越抖的现象。我举一个很直观的例子。悬停状态下期望位置是原点姿态角为零。一阵水平风从侧面吹过来无人机会先被推着往侧向漂。PID控制器检测到位置偏差后会输出一个倾斜角指令让无人机朝反方向倾斜用推力水平分量把位置拉回来。问题在于PID的输出和风的扰动力之间没有直接对应的模型补偿它只能“等误差变大再纠正”。结果就是稳态误差偏大动态响应偏慢风持续吹的时候飞机会停在风力与推力平衡的那个偏移点上而不是回到原点。这就是为什么很多人在仿真里用PID飞得好好的一带到有风的场景就直接露馅。还有一个经常被忽略的点四旋翼的模型本身带有非常明显的非线性项比如姿态运动方程里角速度乘积产生的惯性耦合项、旋翼拉力与姿态角之间的三角函数关系。传统PID虽然能靠高增益把非线性“压”下去但高增益又会放大传感器噪声和执行器饱和的风险。所以真正想在动态风扰环境下做稳定控制得从控制器结构上去想办法而不是单纯把PID增益往上怼。2. 反步控制与滑模控制的基本盘2.1 反步控制为什么适合四旋翼这种级联系统反步控制的核心思路是一层一层往外“反推”。先针对最内层的状态构造一个虚拟控制量让它能稳定这一层然后把这个虚拟控制量当成下一层的“期望输入”继续往设计直到最后得到真实控制输入。整个过程中每一步都能对应一个Lyapunov函数所以稳定性证明是系统性的不需要像PID那样靠经验试。四旋翼的控制结构天然适合反步法因为它本来就是内外环串级系统位置外环给出期望姿态角姿态内环给出力矩。反步法可以把这种串级关系自然地写进设计里每一个中间量都有明确的物理含义不像PID靠大回路暴力抱团。换句话说反步控制不是“用更大的增益把误差压住”而是“每层的误差都各有一个专门的子系统去消化它”这比纯线性反馈要合理得多。不过纯反步法也有短板它比较依赖模型准确性。如果模型里的参数和真实系统偏差较大或者有外部的突加扰动它的效果会被明显削弱。因为反步法是靠模型构造前馈补偿项的模型错得越多补偿就越是“补偿不到位”。2.2 滑模控制的抗扰逻辑让误差贴着滑模面走滑模控制和反步法走的完全是另一条路。它的核心思想是定义一个滑模面比如 s ė ce然后设计控制律让系统状态不管初始在哪里都能在有限时间内被“拽”到这个滑模面上之后就一直贴着这个面滑到平衡点。因为滑模面本身就是误差收敛的加速器一旦状态到了滑模面上系统动态就被“锁死”在这一阶方程里外部匹配扰动对它的影响大幅衰减。这个“匹配扰动不变性”是滑模控制最值钱的地方。风扰在方程里如果和控制输入是同一个通道滑模控制就能通过高频切换动作把它直接抵消掉。代价就是抖振chattering——控制量在滑模面附近来回切换执行器频繁反向长时间跑下来会发热、磨损甚至激发未建模的柔性模态。所以单纯用滑模控制虽然鲁棒性强但工程上往往要配合各种消抖手段比如边界层法、高阶滑模或者和别的设计方法融合。2.3 两者结合的真正意义用反步搭骨架用滑模压扰动反步法给了一个很好的Lyapunov设计框架但它对不确定项的处理不够硬核滑模法有很强的抗扰能力但它缺少一套从系统模型出发进行递归构造的方法。把两者组合起来最自然的做法是用反步法一层层构造虚拟控制律在每一层的误差动力学中加入滑模面和滑模趋近项。这样既保留了反步法的结构优势又让每一层都有直接抑制外部扰动的滑模通道。在我的实际方案里位置环和姿态环都用反步滑模框架设计区别只是系数和滑模面参数不同。相比纯反步加了滑模项之后位置偏差明显小了一个数量级相比纯滑模因为反步框架本身就提供模型前馈补偿切换增益不需要给得很大抖振也要好控制得多。一句话概括反步滑模不是两个方法“轮流用”而是把滑模作为鲁棒项嵌入反步的递推结构里形成一套完整的多回路控制器。3. 控制器设计全过程从动力学模型到反步滑模控制律3.1 四旋翼动力学模型要设计控制器首先要有一个足够建模的动力学模型。采用简化刚体模型忽略螺旋桨柔性形变和气动阻力高阶项基本形式如下。位置方程惯性系下m为质量φ为滚转角θ为俯仰角ψ为偏航角U1为总升力m ẍ (cosφ sinθ cosψ sinφ sinψ) U1 m ÿ (cosφ sinθ sinψ − sinφ cosψ) U1 m z̈ −mg (cosφ cosθ) U1姿态运动方程机体轴下Ix、Iy、Iz为三轴转动惯量U2、U3、U4为滚转、俯仰、偏航力矩Ix φ̈ (Iy − Iz) θ̇ψ̇ U2 Iy θ̈ (Iz − Ix) φ̇ψ̇ U3 Iz ψ̈ (Ix − Iy) φ̇θ̇ U4带风扰时位置方程右边再加上一个外部加速度项 d(t)比如 ẍ ... dx姿态方程也类似。风扰可以理解为同时作用在位置通道和姿态通道上的等价扰动。控制器目标就是不管 d(t) 怎么变位置和姿态都能跟踪期望值。3.2 位置外环设计滑模面输出期望加速度我以 x 通道为例说明设计过程y、z通道完全对称。定义跟踪误差和误差变化率e_x x_d − x ė_x ẋ_d − ẋ构造滑模面s_x ė_x c₁ e_xc₁是外环反步系数它决定位置误差收敛速度。滑模面收敛了误差自然收敛因为 s_x 0 本身就是一个一阶稳定微分方程。对滑模面求导ṡ_x ë_x c₁ ė_x ẍ_d − ẍ c₁ ė_x β其中 ẍ 是带风扰的实际位置加速度。我们希望加速度能设计成一个期望加速度指令 a_x然后把 ẍ_d − a_x c₁ė_x 这个量控制到零附近。采用指数趋近律ṡ_x −k₁ s_x − ε₁ sat(s_x)这里的 sat 是饱和函数用于替代理想符号函数 sign目的是抑制抖振。把趋近律代进去解出期望加速度指令a_x ẍ_d c₁ ė_x k₁ s_x ε₁ sat(s_x)对 y、z通道同样设计a_y ÿ_d c₂ ė_y k₂ s_y ε₂ sat(s_y) a_z z̈_d c₃ ė_z k₃ s_z ε₃ sat(s_z)注意 a_x、a_y 并不是真实物理力而是期望加速度。四旋翼没有单独的水平推力装置水平加速度是靠倾斜姿态产生推力水平分量实现的。所以下一步要把加速度指令转化成期望姿态角和总推力。3.3 从期望加速度解算出期望姿态角这一块很多新手容易卡住。四旋翼的推力方向是由机体姿态决定的我们在惯性系下想要 a_x、a_y、a_z 这三个加速度就必须反解出期望的滚转角 φ_d 和俯仰角 θ_d以及总升力 U1。常用的解析方式是给定期望偏航角 ψ_d先计算总期望推力方向与重力方向的组合向量U1 m · sqrt(a_x² a_y² (a_z g)²)然后反解姿态角θ_d atan2( a_x·cosψ_d a_y·sinψ_d , a_z g ) φ_d atan2( a_x·sinψ_d − a_y·cosψ_d , (a_z g)·cosθ_d )这样就完成了外环到内环的衔接位置控制器输出的是期望姿态角 θ_d、φ_d 和总推力 U1姿态内环再去跟踪这两个姿态角。3.4 姿态内环反步滑模力矩控制律姿态内环的结构和位置环完全一致只是通道换成了 φ、θ、ψ。以滚转通道为例e_φ φ_d − φ s_φ ė_φ c₄ e_φ ṡ_φ φ̈_d − φ̈ c₄ ė_φ α把姿态动力学代入 φ̈ (Iy − Iz)/Ix · θ̇ψ̇ U2/Ix再采用同样的指数趋近律解出力矩控制律U2 Ix · ( φ̈_d c₄ ė_φ k₄ s_φ ε₄ sat(s_φ) ) − (Iy − Iz) θ̇ψ̇同理得到俯仰和偏航力矩U3 Iy · ( θ̈_d c₅ ė_θ k₅ s_θ ε₅ sat(s_θ) ) − (Iz − Ix) φ̇ψ̇ U4 Iz · ( ψ̈_d c₆ ė_ψ k₆ s_ψ ε₆ sat(s_ψ) ) − (Ix − Iy) φ̇θ̇这里的 (Iy − Iz)θ̇ψ̇ 等项就是模型里的惯性耦合补偿也是反步法能比PID做得更精细的地方——控制律本身就把非线性耦合考虑进去了。3.5 稳定性证明思路整个闭环系统的Lyapunov函数可以取所有滑模面的平方和V ½( s_x² s_y² s_z² s_φ² s_θ² s_ψ² )对时间求导每一项都会出现 ṡᵢ·sᵢ。由于每一步都强制了趋近律 ṡᵢ −kᵢsᵢ − εᵢsat(sᵢ)所以V̇ −Σ kᵢsᵢ² − Σ εᵢ·|sᵢ| ≤ 0只要各增益为正数V̇ 恒小于零系统就是Lyapunov意义下的全局渐近稳定。风扰只要能被等效成匹配扰动滑模项就能直接把它压制住这就是整个方案的理论根基。4. Matlab仿真建模与源码落地4.1 源码整体结构这套Matlab源码的整体思路是用脚本文件加函数文件的方式组织没用复杂的App方便注释和改参数。核心文件包括以下几个模块。主运行脚本main.m负责初始化所有参数、设置期望轨迹、调用ODE45积分器跑仿真并调用绘图函数出结果。动力学函数quad_dynamics.m输入当前状态向量和控制量输出状态导数内部实现前面写的带风扰位置和姿态方程。控制器函数smc_controller.m核心文件输入期望值与当前状态输出U1到U4四个控制量内部按位置外环、姿态内环顺序计算。风扰函数wind_model.m根据当前时间生成常值风、阵风或随机风扰动输出等效力和力矩。绘图函数plot_results.m把位置、姿态、控制量曲线一次性画成多个子图。这种结构最大的好处是接口清晰想换风扰场景只改wind_model想换参考轨迹只改main里的期望值控制器代码基本不用动。4.2 核心参数配置仿真参数我按一个常见的室内小型四旋翼量级设置具体数值如下表所示。这些值不针对特定机型只是作为一个能跑通的基准组实际工程里要按真机标定结果替换。参数数值说明m1.2 kg无人机总质量g9.8 m/s²重力加速度Ix0.015 kg·m²滚转转动惯量Iy0.015 kg·m²俯仰转动惯量Iz0.025 kg·m²偏航转动惯量c₁ c₂ c₃3.0位置环反步系数c₄ c₅ c₆8.0姿态环反步系数k 位置环4.0滑模趋近律系数k 姿态环6.0滑模趋近律系数ε 位置环0.4滑模切换增益ε 姿态环0.8滑模切换增益Δ0.05饱和函数边界层宽度这套参数在我本地的Matlab环境里跑初始位置误差1米情况下不会发散也不会出现过大的控制量超限。控制量的物理单位是力N和力矩N·m注意和仿真时间步长匹配别在ODE45里把时间单位搞错了。4.3 风扰模型的三种典型形式风扰模型的实现质量直接决定仿真结果是否有参考价值。我最常用的三种扰动脉冲如下风扰形式数学描述主要考验常值风持续施加一个恒定水平力稳态精度是否出现静态偏差阵风F A·sin(2πft)幅值0.05~0.2倍重力动态抑制能力、响应速度和恢复时间随机风高斯白噪声加一阶低通滤波系统抗随机扰动的整体鲁棒性在wind_model函数里输出量是施加到质心上的等效风力以及由风力臂转化的小额扰动力矩。我习惯把扰动力矩单独分离出来因为实机上风压中心往往不在质心上力矩扰动比力扰动更考验控制器的姿态环能力。4.4 仿真运行流程主程序的运行流程可以概括成四步。第一步把物理参数和控制器参数全部加载到工作区并定义期望轨迹。第二步初始化状态向量一般取零初始偏差或者人为给一个初始位置偏移来测试收敛能力。第三步调用ODE45时间区间设为20秒并在每个积分步内调用控制器函数把当前时刻的状态和控制量传给动力学函数。第四步运行结束后调绘图函数生成位置跟踪曲线、姿态角曲线和控制量U1~U4曲线。写这套仿真时我特别强调一个细节仿真循环里控制量的计算要用当前的真实状态也就是带风扰之后的状态而不是期望状态。很多初学仿真的人会在这一步写错把期望值当反馈量传进去结果控制器形同虚设风一吹照样稳图看着也好看但那不是真实闭环是开环。5. 仿真结果对比分析与调参经验5.1 三种控制方案的无风扰对比为了公平起见我先把风扰关掉让三种方案在完全相同的参考轨迹和初始条件下飞一遍。此时经典PID、纯反步、反步滑模都能实现稳定跟踪但差异在动态响应上能看出来。经典PID在阶跃位置指令下会有明显超调大约13%左右调节时间在两秒上下。纯反步控制因为模型前馈给得好超调能压到5%以内收敛也更干脆。反步滑模在无风扰时和纯反步表现接近抖振因为用了饱和函数控制量曲线几乎看不出高频抖动这一点比较让人放心。这个阶段主要验证的是控制器本身的设计正确性。如果无风扰时都跟踪不好后面加风扰就完全没有意义。5.2 有风扰场景下的鲁棒性对比把风扰打开施加一组正弦阵风幅值大约取重力的0.1倍频率1Hz飞行任务为保持悬停并抵抗风扰。我记录了一次典型实验中的最大偏差、恢复时间和抖振情况整理成下表。控制器位置最大偏差姿态最大误差恢复时间抖振水平经典PID约0.45 m约7°约3.2 s无纯反步控制约0.22 m约3.5°约1.6 s无反步滑模控制约0.06 m约0.8°约0.4 s轻微这里需要说明一下表格数值是特定参数和特定风扰下的结果不会在所有场景下都一样但它反映的规律是稳定的反步滑模的偏差差不多是纯反步的1/4到1/3恢复时间也短得多。PID在这个工况下虽然没有发散但长时间风扰下位置偏移持续存在而且姿态角反复震荡飞起来的感觉就是“不稳”。5.3 调参经验先内环后外环先位置后姿态调这组参数时我摸索出的一个可靠顺序是先冻结外环只调内环姿态环参数把姿态环调到能快速无超调跟踪阶跃姿态角后再放开外环整位置环参数。姿态环的反步系数 c₄、c₅、c₆ 是整个系统的核心建议从 5~10 之间取值太小会响应迟钝太大容易激起高频抖振。滑模切换增益 ε 决定对抗外部扰动的强度但ε越大抖振越明显所以一般先给一个保守值比如位置环0.3、姿态环0.6看看效果再慢慢加。饱和函数边界层宽度Δ也有讲究Δ取0.01时抗扰精度高但控制量毛刺多Δ取0.1以上时曲线平滑但稳态精度下降我通常先取0.05再根据曲线形状微调。还有一点很关键仿真里可以把ODE45的误差容限调严一点比如RelTol1e-6避免数值误差把滑模面的高频切换给“平滑”掉了否则你会以为系统没抖振其实只是积分器帮你把抖振隐藏了一上真机就露馅。6. 实际工程中必须要避开的坑6.1 抖振不是纯仿真问题它会在真机上放大滑模控制最知名的痛点就是抖振。仿真里抖振表现为控制量曲线在滑模面附近来回跳真机上则表现为电机加减速频繁翻转、电流震荡、机体高频微振。很多人刚开始用滑模为了追求强鲁棒性把切换增益ε给得很大仿真里偏差确实压得很小但拿到真机上飞一架次电机温度直接拉满螺旋桨还会发出明显的“滋滋”异响。解决思路也不复杂第一切换项用饱和函数或边界层法替代理想符号函数这是最成熟的做法第二如果硬要用符号函数就得把执行器模型也放进仿真里加上电机一阶延迟和转速限制提前暴露抖振对执行器的冲击第三实在不行可以考虑二阶滑模它对抖振的抑制比普通一阶滑模好很多但代码复杂度也会上一个台阶。6.2 微分爆炸反步法递归求导的隐藏麻烦反步法的递归结构有一个工程上常被忽视的问题就是虚拟控制量的导数会越传越多。位置环给出的期望姿态角是时间函数姿态内环要用到它的导数 φ̈_d理论上你得对 θ_d、φ_d 的表达式连续求导两次。表达式里全是三角函数和加速度指令的复合项手推很容易出错写进代码更容易变成一团乱麻。我实际处理办法是在期望姿态角的导数计算中不采用手推解析表达式而是用带截止频率的滤波器对期望姿态角做平滑滤波后再求导或者干脆在控制器内部用一个简化的一阶差分。这个做法在仿真里可能带来几个毫秒的滞后但对稳定性几乎没影响却能大幅减少代码出错概率。对毕设和竞赛来说这个取舍非常划算。6.3 内环外环时间尺度必须分离四旋翼内外环控制有一个铁律内环带宽要明显高于外环一般要快三到五倍。反映到参数上就是姿态环的反步系数要明显大于位置环的系数。在我的参数表里位置环的c₁取3姿态环的c₄取8就是这个原因。如果你把位置环系数调得比姿态环还高会出现一个很有趣的现象位置控制器拼命想纠正位置偏差不断下发大幅度姿态角指令但姿态内环根本跟不上于是位置误差不但没减小反而和姿态滞后一起形成振荡。这种振荡从仿真曲线上看就是位置和姿态同时以相近频率“跳舞”很多人误以为是滑模增益不够结果越加参数越乱。所以调参时一定记住外环永远让着内环。6.4 风扰测试不要只测正弦波把风扰模型做成单频正弦是最常见的仿真偷懒方式。但真实环境的风是多频率、非平稳的单频正弦只能验证控制器对一个窄频带扰动的响应测试结果会偏乐观。我会至少跑三组工况常值风加阶跃突风、0.5~2Hz扫频阵风、以及随机风加低通滤波。扫频测试尤其重要能让控制器在低频到高频的扰动脉冲下表现出完整的鲁棒性频谱一旦某段频率出现共振或者放大趋势就能提前发现问题。另外风扰的等效作用点也别总是放在质心上。实际风压中心通常偏离质心风力会产生额外扰动力矩所以仿真里应该让力的作用点偏移机体坐标系一定距离这样才能考验姿态环真正的抗扰动能力。6.5 参考轨迹突变的影响很多人在仿真里只做从原点到期望点的阶跃跟踪这个测试其实比较“友好”。一旦你把期望轨迹改成连续转弯、高速拉升、或者突然由静止切换到爬升控制器要同时对付轨迹跟踪误差和风扰难度成倍增加。经验是在验证反步滑模方案时至少加一段速度连续的椭圆轨迹或者8字轨迹让位置环和姿态环都处于持续跟踪状态这样才能暴露动态跟踪过程中的耦合问题。我个人在拿到这套源码后最先做的不是直接跑完整工况而是先把风扰设为零调试出一组无扰动的优良参数然后把风扰幅度加到重力的0.05倍观察控制量曲线有没有明显的抖振毛刺再逐步加大到0.2倍看滑模增益需要提升多少才能顶住。整个过程里所有参数改动都记录在案包括改了哪个系数、曲线发生了什么变化这样才能在最后写报告或者做展示时把每个参数选择的理由讲清楚。这种“先无扰后有扰、先小扰后大扰”的推进顺序是我踩了不少坑之后总结出来的最稳妥做法也建议你手头有类似源码时先照这个思路过一遍再谈真正应用到实机的问题。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑