资讯动态

四旋翼无人机ADRC姿态控制器Simulink仿真:模型搭建与参数整定

发布时间:2026/10/27 18:16:01 来源:尧图企业网站定制
简介Matlab四旋翼无人机ADRC姿态控制器仿真资源包是一份面向无人机控制算法学习者、自动化专业学生及无人机爱好者的现成仿真方案重点解决四旋翼飞行器姿态稳定控制中模型建立、控制器设计与参数调节等问题。资源围绕滚转、俯仰、偏航三个姿态角详细给出无人机姿态模型、力矩方程和角运动方程并包含三个ADRC控制器均已调好参数可直接运行仿真也方便替换成PID、LQR等其他控制器进行对比。压缩包共11个文件大小313KB其中7个txt说明文档从不同角度解读建模与控制思路附带doc技术报告、html辅助页面以及2张jpg仿真截图形成较完整的学习闭环。已有73人学习适合入门ADRC姿态控制尤其适合需要快速验证控制算法或开展课程设计的场景。内容附有相关参考文献多个txt文档包含姿态模型推导、仿真过程解析和控制效果分析能帮助读者理解自抗扰控制原理并在此框架上进行二次开发。1. Matlab四旋翼无人机ADRC姿态控制器仿真为什么先复现这套比自学快得多Matlab四旋翼无人机ADRC姿态控制器仿真这份资源里面已经把姿态模型、力矩方程、角运动方程、三个姿态角全部搭好参数调过还附带参考文献。第一次把ADRC跑起来的人十有八九是被“扩张状态观测器”吸引的模型不准、外部风扰、电机差异全被它折成一个总扰动实时补偿掉听起来比PID高一个维度。但ADRC的坑也出在这里——方程本身不复杂麻烦的是参数怎么给、离散化怎么写、Simulink里哪里容易代数环。这套仿真正好把这些事前置解决了。毕设做飞控、学ADRC理论、或者想从“调PID调到超调”里解脱出来的工程师都适合先拿它跑通一遍再去动参数看响应变化。2. 姿态模型与ADRC核心环节先把方程吃透再改参数2.1 角运动方程、力矩方程与全量状态模型四旋翼姿态模型分两块运动学方程描述“欧拉角速率和机体角速度的关系”力矩方程描述“力矩怎么产生角加速度”。两者合起来才是被控对象。资源里是完整的三轴模型没有做小角度近似这意味着大姿态角下仿真结果仍然可信代价是欧拉角本身在俯仰±90°附近会出现奇异这个坑后面专门讲。运动学方程用Z-Y-X欧拉角顺序滚转φ、俯仰θ、偏航ψ机体角速度p、q、r% 欧拉角运动学注意 theta ±90° 时 tan(theta) 发散 dphi p q*tan(theta)*sin(phi) r*tan(theta)*cos(phi); dtheta q*cos(phi) - r*sin(phi); dpsi (q*sin(phi) r*cos(phi)) / cos(theta);而力矩方程就是刚体转动方程角加速度等于外力矩减去陀螺耦合项。写成状态导数函数是下面这样function dState quadRotorAttitude(state, M, J) % state: [phi; theta; psi; p; q; r] % M: [Mx; My; Mz] 三轴外力矩单位 N·m phi state(1); theta state(2); psi state(3); p state(4); q state(5); r state(6); dphi p q*tan(theta)*sin(phi) r*tan(theta)*cos(phi); dtheta q*cos(phi) - r*sin(phi); dpsi (q*sin(phi) r*cos(phi)) / cos(theta); dp (J(2)-J(3))/J(1) * q * r M(1)/J(1); dq (J(3)-J(1))/J(2) * p * r M(2)/J(2); dr (J(1)-J(2))/J(3) * p * q M(3)/J(3); dState [dphi; dtheta; dpsi; dp; dq; dr]; end代码逻辑前三条就是运动学方程的直译后三条把力矩除以转动惯量得到角加速度同时保留三项陀螺耦合项。悬停附近耦合项很小但大机动时它会让三个轴互相“串扰”ADRC的价值正在于ESO能把这种串扰当总扰动估计出来。参数方面资源里用了一组常见的四旋翼参数参数数值说明Ixx0.045 kg·m²滚转轴转动惯量Iyy0.045 kg·m²俯仰轴转动惯量Izz0.090 kg·m²偏航轴转动惯量通常更大l0.25 m电机到质心的力臂k1.2e-5 N/(rad/s)²电机升力系数c2.5e-7 N·m/(rad/s)²反扭矩系数这四个电机的升力先映射到三轴力矩和总升力再进入模型。力矩映射常见写法是滚转力矩由左右电机差动产生俯仰由前后电机差动产生偏航由四个电机反扭矩组合产生具体布局细节随附参考文献里有写。我在实际看这类仿真时通常第一件事就是确认这个映射矩阵和电机编号的对应关系不然后面改参数很容易对不上现象。2.2 扩张状态观测器总扰动是怎么被“观”出来的ADRC的核心不在控制律而在扩张状态观测器ESO。它把“模型里没写清楚的项”——转动惯量不准、气动系数误差、外界风扰、陀螺耦合——全部折成一个额外的状态变量z₃在线实时估计。三阶ESO的标准写法e z1 - y z1_dot z2 - β1 * fal(e, α1, δ) z2_dot z3 - β2 * fal(e, α2, δ) b0 * u z3_dot - β3 * fal(e, α3, δ)z1跟踪姿态角z2跟踪角速度z3就是“总扰动”的估计值。fal是带线性段的非线性函数目的是避免误差很小时增益过大导致抖振。注意z3的量纲受b0的影响如果输入u是力矩b0取1/I那么z3的单位就是rad/s²表示等效角加速度扰动。参数β按带宽法给一般取β13ωo、β23ωo²、β3ωo³ωo是观测器带宽整定工作就集中在选一个合适的ωo上。ESO之所以比PID多一层“自适应感”就是因为它把模型误差当状态来估计不做积分、不靠误差累积而是靠观测器动态去逼近真实扰动。仿真里很容易验证给偏航轴加一个常值干扰力矩z3会快速收敛到对应的等效角加速度然后把补偿量反向叠加到控制量里干扰就被压掉了。2.3 控制律与TD过渡过程、误差反馈和扰动补偿怎么配合姿态环控制律采用的是带宽参数化线性组合加扰动补偿的形式u0 kp * (r1 - z1) kd * (r2 - z2) u (u0 - z3) / b0其中r1、r2是参考角速度和期望角速度z1、z2是ESO对当前角、角速度的估计kpωc²、kd2ωcωc是期望的角环带宽。这样设计的好处是想快就调大ωc想稳就调小不必和PID那样三个参数反复拉扯。跟踪微分器TD是另一个加分项。期望姿态角从0°突变到30°时直接给阶跃会让初始误差极大控制器第一拍就会饱和输出超调几乎不可避免。TD的作用是把阶跃信号光滑成一个渐进过渡的轨迹同时给出它的微分信号。资源里三个通道都带了TD切换姿态指令时波形会明显温和很多。很多入门资料讲ADRC会强调“三件套缺一不可”实际用下来姿态控制这种场景TD确实推荐保留因为飞控指令本来就是方波式的切换信号。3. 在Simulink里把ADRC跑起来模块搭建、MATLAB Function与带宽法整定3.1 模型顶层布局与信号约定拿到这份仿真第一件事先看顶层结构。我的习惯是先把信号单位搞清楚Simulink模型里角度全部用弧度角速度用rad/s力矩用N·m。如果期望角输入模块用的是度得先乘pi/180再进比较点否则误差放大57倍ESO直接饱和。顶层信号流大概是期望姿态角生成器 → TD过渡过程 → 三通道ADRC控制器 → 控制分配矩阵 → 四旋翼姿态动力学 → 角速度/角度反馈回ESO。三个通道结构完全一样只有转动惯量和b0不同。滚转、俯仰共用Ixx、Iyyb0大约22左右偏航Izz更大b0在11左右。这部分模型里已经接好不需要动。手动跑一遍阶跃仿真三个通道的响应曲线都在合理范围内才说明环境、模块库、求解器配置都正常。3.2 把ESO用MATLAB Function写清楚ESO在Simulink里可以用内置模块搭但参数改起来麻烦。资源里用的是MATLAB Function我建议保持这种写法逻辑一眼能看穿改参数也方便。下面这段是滚转通道ESO的完整代码function [z1, z2, z3] ESO_roll(u, y, dt, b0, w0) % 三阶扩张状态观测器离散化版本 % u: 控制力矩 (N·m)y: 当前滚转角 (rad) % dt: 仿真步长b0: 控制增益约 1/Ixxw0: 观测器带宽 (rad/s) persistent est if isempty(est) est [0; 0; 0]; % z1, z2, z3 初值一般给 0 end e est(1) - y; % fal 函数取两组不同 alpha角度环和角速度环增益分开 fal1 fal(e, 0.5, 0.01); fal2 fal(e, 0.25, 0.01); fal3 fal(e, 0.125, 0.01); est(1) est(1) dt * (est(2) - 3*w0 * fal1); est(2) est(2) dt * (est(3) - 3*w0^2 * fal2 b0 * u); est(3) est(3) dt * (-w0^3 * fal3); z1 est(1); z2 est(2); z3 est(3); end function out fal(e, alpha, delta) if abs(e) delta out abs(e)^alpha * sign(e); else out e / delta^(1-alpha); end end逻辑说明persistent变量保证ESO状态在前后两个采样点之间持续不会每次调用都重置。e是估计角度和真实角度的误差fal1/2/3把它非线性地放大对应三种不同α值。z1、z2、z3的更新就是三阶ESO的离散化——欧拉法采样周期等于Simulink固定步长。最后输出的z1是滤波后的角度估计z2是角速度估计z3是总扰动。参数说明w0决定ESO响应速度。w0太小扰动估计得慢补偿滞后w0太大噪声被放大控制量毛刺感明显。资源里的模型滚转通道w0给到50rad/s左右和下面整定方法是对应的。delta是fal函数的线性段宽度主要影响小误差区的增益一般取0.01附近。3.3 控制律与扰动补偿的合成控制律同样是MATLAB Function输入是期望角度r1、期望角速度r2、ESO反馈量输出是控制力矩function M controller_roll(r1, r2, z1, z2, z3, wc, b0) % 线性误差反馈 总扰动补偿 % wc: 角环带宽是控制器里最主要的整定参数 kp wc^2; kd 2 * wc; u0 kp * (r1 - z1) kd * (r2 - z2); M (u0 - z3) / b0; % 减去扰动估计再除以 b0得到真实力矩指令 end这里最关键的是最后一行。u0是“期望角加速度误差校正”但被控对象的真实角加速度还受扰动影响。把扰动估计z3减掉以后再除以b0等效于告诉执行机构你要额外产出一份力矩专门对抗扰动。这一步如果漏了ADRC就退化成普通的PD控制器白瞎了ESO的估计能力。实际仿真中把z3的补偿断开加一个阶跃干扰力矩滚转角会出现明显的稳态误差接上补偿误差会被压到接近零。3.4 一套能跑起来的初值与带宽法整定顺序如果你拿到模型想重新整定不要上去就乱拧参数。我常用顺序是这样的先定仿真步长固定步长1ms求解器ode4根据期望的角环响应速度定wc先取10rad/s取w0 3~5倍wc先给50rad/sb0按1/I估算滚转、俯仰约22偏航约11加一个常值干扰力矩看z3的估计是否收敛到期望值最后调TD的r值影响过渡过程快慢但不会影响稳态精度。参数符号初值参考调整方向控制器带宽wc10 rad/s响应太慢就加大抖振就减小观测器带宽w050 rad/s扰动抑制不足加大噪声明显减小控制增益b01/I模型参数不准确时修正采样时间Ts0.001 s与实际飞控周期保持一致整定过程里最值得看的曲线是三条期望角、实际角、z3。期望角和实际角的误差决定wc合不合适z3的波形决定w0合不合适。如果z3波形毛刺多说明w0偏大如果z3在阶跃扰动后压不下去说明w0偏小或b0偏了。提示改b0要慎重。b0本质是“单位控制力矩能产生多大角加速度”的增益它如果和真实模型差太多ESO会把b0的误差也当成扰动去补偿这能工作但会让z3的物理含义变得混乱后续排错时很难判断是扰动大还是模型参数错。4. 常见问题排查奇异、微分爆炸、ESO高增益噪声与单位陷阱跑这类仿真最容易翻车的不是我上面写的理论部分而是下面这些小问题。每一条我都踩过按“现象→原因→解决”写出来。4.1 现象做大角度机动仿真直接发散模型检查却没问题把期望角从30°改成120°Simulink里波形直接变成一条竖线日志里报出NaN。一开始我以为是数值积分炸了把ode4换成ode45也没用。原因欧拉角运动学在θ接近±90°时tanθ和1/cosθ趋向无穷模型本身在这个姿态附近就是病态的。这不是代码错误是坐标表示方式的固有边界。解决如果验证的是姿态控制器在大角度下的表现把仿真范围限制在±60°以内或者干脆把运动学方程换乘四元数表示。资源里的模型默认是常规欧拉角版本做悬停和机动仿真完全够了但不要拿它做翻滚类特技验证。4.2 现象TD区块输出的微分信号毛刺巨大控制量高频抖振阶跃指令给下去实际角响应还可以但控制力矩曲线像是长了刺。把TD里的r从30调到100毛刺反而更严重。原因TD的快速因子r越大过渡过程越快但离散化后对噪声越敏感。仿真步长1ms时r太大会让微分信号对数值误差放大相当于用一个不存在的“突变”去驱动控制器。解决把r调回30同时检查TD内部的积分步长是否和主模型一致。如果TD用连续积分模块而外面是固定步长离散误差会被放大。我一般把TD也写成MATLAB Function和ESO一样用欧拉离散这样dt和控制器完全同步。4.3 现象ESO的z3幅度远远超过物理上可能的扰动给偏航通道加了0.1N·m的干扰力矩z3却估计到了10以上而且波形振荡。原因b0给错了。偏航轴的Izz是0.09b0应该是11左右如果沿用滚转轴的22ESO会把“控制量作用过强”误判为扰动反向变化估计出来的值自然失真。解决每个通道单独核对b0等于1/Ixx、1/Iyy、1/Izz。改完之后z3的量级就回到和真实扰动对应的水平了。这类问题最容易发生在把滚转通道参数直接复制给偏航通道的情况。4.4 现象期望角给的是30实际角收敛到30但误差曲线显示误差为1.7单位混用。期望角模块里填的30被当成了弧度控制器内部全是弧度运算实际收敛到30rad相当于1719°波形看着“收敛”其实早就转了好几圈。原因信号源模块和控制器之间的单位约定不一致又没有加转换模块。解决跑仿真前先整体检查一遍信号单位。我的做法是在总线信号命名里直接带单位后缀比如expect_roll_rad、ctrl_Mx_Nm模型里一目了然。这个习惯帮我避开了很多类似问题。4.5 现象模型在变步长模式下仿真速度极慢结果和固定步长还不一致把求解器改成变步长ode45仿真时间从几秒变成几分钟收敛结果也和之前不同。原因ESO和TD里含fal这样的强非线性项变步长求解器会频繁缩小步长来满足误差容限速度自然慢更重要的是MATLAB Function里的persistent变量假设采样周期恒定变步长模式下dt并不是固定值离散化精度直接受影响。解决把整个模型强制设置为固定步长步长1ms求解器用ode4。ADRC这类带非线性观测器的闭环控制仿真固定步长本来就是飞控代码的真实工作方式仿真和实物保持一致结果才有参考价值。5. 验证仿真模型的三个手法开环链路检查、扰动注入与线性化频响模型能跑通不代表模型是对的。我有三招基本能把问题定位缩小到具体环节。第一招是零输入开环检查。把ADRC控制器暂时断开直接给姿态动力学一个固定的力矩信号看对应轴的角速度是否按预期方向变化。滚转力矩正方向定了右滚转是否相应产生偏航力矩定了机头是否按正确方向转动。这一步能揪出控制分配矩阵的符号错误、电机编号映射错误——这类错误在闭环仿真里很难发现因为ADRC会自动补偿不管符号反没反它都能把误差拉回来只是控制量波形看起来很奇怪。第二招是扰动注入对比。在模型里加一个Step模块在某一时刻注入常值干扰力矩分别记录z3和姿态角的响应。好的ESO应该在几个周期内把z3收敛到接近真实扰动的等效值同时姿态角误差保持在很小的范围。我一般还会同时把z3的补偿路径断开再看一次两次响应对比下来ADRC到底有没有起作用、起了多大作用一目了然。第三招是在配平点做线性化看闭环频响。用Simulink的线性化分析工具在悬停配平点对模型做线性化得到从期望角到实际角的传递函数看它的幅值特性和带宽是否和设定的wc吻合。ADRC本质是非线性的线性化只在配平点附近严格有效但它能帮你快速判断闭环带宽是不是自己预期的那一档。如果线性化结果显示带宽明显高于wc说明ESO的补偿可能引入了额外相位超前如果低于wc说明实际响应比设计慢需要检查执行器饱和或者限幅环节。采用的验证顺序是开环、扰动、频响三步。以前我有一次拿到飞控仿真没做开环检查直接调闭环参数折腾了两天都没找出滚转控制量正弦振荡的根源后来发现只是控制分配矩阵里两个电机的符号反了闭环一跑就被ESO“修正”了但这修正本身又造成振荡。从那以后我每次拿到别人的ADRC模型都强制自己先走一遍开环链路和单位检查再谈调参。这套顺序帮我省了不少冤枉时间希望帮到你。本文还有配套的精品资源点击获取

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

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

免费获取报价 →
↑