新闻详情

新闻详情

首页 / 资讯中心 / 详情

ADRC自抗扰控制在多旋翼飞控中的实战调参与抗扰动实践

发布时间:2026/9/21 2:34:07来源:尧图网络
ADRC自抗扰控制在多旋翼飞控中的实战调参与抗扰动实践
做飞控这些年有一个问题始终绕不开飞机在天上飞扰动永远比你想象的要多。风场突变、桨叶损伤、重心偏移、负载抛投这些外部干扰叠加内部建模误差会让一个在仿真里调得很“完美”的控制器一上真机就露馅。我最初也是从经典PID开始角速度环、角度环一层层往上叠调到后来发现一个问题PID本质上靠误差驱动扰动来了以后先产生偏差再纠正天生就在“被动挨打”。后来我把目光投向了ADRC算法也就是自抗扰控制在多旋翼飞行器上做了接近两年的抗扰动控制实践。这篇就把我从原理到实飞的完整思路、调参过程、踩过的坑一次性说清楚给正在做飞控算法、或者想给无人机加“抗风”buff的同学一个参考。1. 为什么多旋翼飞控里抗扰动是一道绕不过去的坎1.1 多旋翼飞行器的扰动来源和影响先从工程直觉说起。多旋翼飞行器本质上是一个欠驱动、强耦合、非线性系统四个电机输入要控制六个自由度的输出姿态和位置之间还有复杂的运动学耦合。这种结构天生对扰动敏感而且扰动来源非常杂外部环境扰动阵风、湍流、风切变这是最常见也最难防的。低空飞行时地面效应和建筑周边的乱流会让飞机姿态出现高频抖动。机体自身变化电池电压下降导致的拉力变化、桨叶磨损或破损引起的拉力不对称、云台和载荷的摆动造成的重心偏移。任务过程扰动抛投物资瞬间的负载突变、机臂碰撞后的结构形变。这些扰动如果抑制不住最直接的后果就是姿态角波动、位置漂移画面模糊。严重的时候会引起震荡发散飞机直接翻机。我实测过一台轴距550mm的四旋翼在三四级阵风下如果姿态环PID参数调得偏软roll轴角度的波动能到±3度以上这个幅度根本没法做稳定拍摄。1.2 传统PID在抗扰动上的结构性短板不是说PID不能用实际上现在市面上大量商业飞控仍然以PID为主串级结构也足够成熟。但从控制理论的角度看PID有一个天生的缺陷它是误差驱动的。什么意思当外部扰动作用到飞机上PID必须先看到姿态角或角速度出现偏差然后才根据偏差的大小去调整输出。也就是说控制作用总是滞后于扰动作用。为了减小这个滞后只能把PID增益往上调但增益太高又会引发噪声放大、震荡甚至激发柔性模态。这就是经典的“性能与鲁棒性矛盾”。另一个短板是积分项。串级PID里的积分项是为了消除静差但遇到突加负载或者阵风这种时变扰动时积分器需要时间累积误差响应偏慢。而且积分饱和问题在飞控里很棘手处理不好反而会引起超调和震荡。1.3 ADRC的思路把扰动“看穿”再补偿ADRC的思路和PID完全不同。它不打算在扰动造成偏差之后再去补救而是想办法把扰动实时估计出来然后直接在前向通路上把它抵消掉。这就像开车遇到坑洼PID是等车轮陷进去以后再猛踩油门脱困而ADRC是提前看到坑、直接绕过去。我从实际效果角度说ADRC最吸引我的地方在于它是模型依赖最小的控制器。传统控制方案如反步法、滑模控制都非常依赖精确的动力学模型。而ADRC的核心思想是不管系统内部建模误差、耦合项、外部环境扰动是什么统一把它们看作“总扰动”然后用扩张状态观测器把这个总扰动实时观测出来再加到控制量里进行补偿。这样即使你对飞机转动惯量、电机响应特性了解得比较粗糙也能获得很好的控制效果。2. ADRC核心组件拆解与飞控实现要点2.1 跟踪微分器把目标值“盘”顺了再喂给控制器ADRC的第一部分是跟踪微分器TDTracking Differentiator它的作用是对期望输入进行过渡处理得到平滑的跟踪信号和近似微分信号。我们在飞控里做姿态控制时期望姿态角通常来自遥控器摇杆或者上层位置环的输出这些信号往往带有跳变。如果直接把阶跃性质的期望值丢给姿态环飞机会猛地一斜不仅姿态波动大还容易激发结构共振。TD的作用就是把这个方波般的信号“盘”成平滑曲线。我项目中用的TD是韩京清老师提出的离散形式基于最速控制综合函数fhan。它在每个控制周期里计算两个状态量跟踪信号和微分信号。关键参数是速度因子rr越大跟踪越快但也会放大噪声。实际调参时我会把TD安排在外环比如位置环或指令生成环节让r与飞机的物理响应能力匹配。四旋翼这种系统角度响应带宽通常不到10rad/sr设得太高没有意义反而会让电机满油门输出。具体离散代码可以写成以下形式float fhan(float v1, float v2, float r, float h) { float d r * h * h; float a0 h * v2; float y v1 a0; float a1 sqrtf(d * d 8.0f * r * fabsf(y)); float a2 0.0f; if (fabsf(y) d) { a2 v2 y / h; } else { a2 v2 0.5f * (a1 - d) * sign(y); } float f 0.0f; if (fabsf(a2) d) { f -r * a2 / d; } else { f -r * sign(a2); } return f; }每次迭代时这样更新状态量v1 h * v2; v2 h * fhan(v1 - target, v2, r, h);这里的h是控制周期四旋翼姿态环常见的是1kHz到500Hz也就是0.001秒到0.002秒。不用纠结于TD的理论深度它就是一个输入整形器让指令更平滑。2.2 扩张状态观测器整个ADRC的“灵魂”扩张状态观测器ESOExtended State Observer是ADRC里最关键的部分也是我最先花大量时间理解的部分。它的思路是把系统的总扰动扩张成新的状态变量然后通过状态观测器把它估计出来。为了讲清楚我以一个单通道的姿态角模型为例。假设roll轴的动力学方程为x1_dot x2 x2_dot f(x1, x2, w, t) b0 * u这里x1是姿态角x2是角速度f代表总扰动包含内外扰动b0是控制增益的估计值u是控制输入。ESO的目标不仅仅是观测出x1和x2还要把f扩张成第三个状态x3并实时估计出来。离散化实现时我采用fal函数非线性ESO。写成C语言大致是float fal(float e, float alpha, float delta) { if (fabsf(e) delta) { return e / powf(delta, 1.0f - alpha); } else { return powf(fabsf(e), alpha) * sign(e); } } // ESO核心更新 e z1 - y; z1 h * (z2 - beta1 * e); z2 h * (z3 - beta2 * fal(e, 0.5f, 0.01f) b0 * u); z3 h * (-beta3 * fal(e, 0.25f, 0.01f));这里z1、z2、z3分别是对角度、角速度、总扰动的估计值y是实际角度反馈。三组系数beta1、beta2、beta3需要按采样周期和对象机理来整定而非随便取。我在实际做的时候会把beta1取在100左右量级beta2在10000左右beta3在1000000左右单位跟采样频率有关后面会详细说。更重要的是理解ESO为什么能把扰动“观测”出来。观测器内部有一个对象的拷贝你给我一个控制量u我就按我的模型算出估计状态同时拿估计状态和真实传感器反馈的差值去修正内部状态。这个修正项就是误差反馈。当ESO收敛以后z1和z2基本复现真实状态z3就会收敛到总扰动值。2.3 控制律误差反馈加扰动补偿ADRC的控制律由两部分组成一部分是状态误差反馈另一部分是扰动补偿。我采用的是线性化的简化策略也就是常说的LADRC思路状态误差反馈部分直接用PD形式把非线性环节省掉靠ESO去扛非线性。控制律表达式为u (kp * (v1 - z1) kd * (v2 - z2) - z3) / b0这里的v1和v2就是TD生成的期望角度和期望角速度z1和z2是ESO估计的实际角度和角速度z3是估计总扰动。用z3除以b0然后从控制量里减掉就是前馈补偿的核心。回到参数上来。当ESO收敛且总扰动被补偿后系统就近似被“简化”成一个双积分对象误差反馈环节再把它控制好。由于ADRC采用的是极点配置思想闭环带宽可以做到很高而不会牺牲太多稳定性。实际中我可以在姿态环做到8-10 rad/s的闭环带宽同时阵风扰动下角度波动控制在±0.5度以内这在调好的PID串级上是很难同时做到的。3. 从零开始调通ADRC代码、参数与实操流程3.1 在飞控里接入ADRC需要准备什么我是基于自研的四旋翼飞控做实验的MCU用的是STM32H743传感器是BMI088加IST8310的组合姿态解算用EKF控制频率姿态环设在1kHz。固件是在PX4的架构基础上抽取了多旋翼姿态控制器做改造这样比较方便对比PID和ADRC的效果。如果你也想在自己的飞控里试ADRC准备工作并不复杂角度和角速度反馈这个直接来自姿态解算输出不需要额外传感器。控制量输出ADRC的姿态控制器最终输出的是期望角加速度级别的量需要映射到电机混控也就是要有一个“角加速度到油门分配”的中间层。合适的控制周期建议姿态环至少500Hz以上1kHz更佳。ESO的离散化精度在低频时会明显下降。飞控日志系统这个非常重要。调参阶段不能只看飞机飞得稳不稳要把ESO的z2、z3、控制量u、传感器原始角度全都记录出来离线分析。3.2 五步调参法从仿真到真机ADRC的参数看着多但理清关系后可控性很强。我把整个调参流程总结成五步每一步都有明确目标和验证方法。第一步定对象估算b0这一步最关键但也最容易忽略。b0是控制输入到加速度之间的增益估计值。对于四旋翼roll轴它大致等于总拉力对roll角加速度的传递比例。我一般是先把飞机绑在测试台上手动给一个小角度的阶跃指令记录不同油门下的角加速度响应再反推b0。这样做一次以后变量b0基本不用再动它是一个与机型、重量相关的参数不随飞行状态剧烈变化。粗略估算时可以用b0 ≈ (总拉力 * 力臂) / (绕roll轴的转动惯量)这个值量级通常在几十到几百之间取决于机架大小。第二步调观测器带宽让z能跟上真实状态我先单独验证ESO的收敛性。具体做法是飞机锁定在测试台上不给控制输出手动转动飞机观察z1是否紧跟传感器角度、z2是否紧跟角速度、z3是否在有外力施加时准确变化。如果z3噪声很大我会调小beta3并适当增加滤波而不是一味追求扰动估计的快速性。关于观测器参数这里推荐一种带宽参数化的方式设定观测器带宽wo然后按以下公式取增益beta1 3 * wo beta2 3 * wo^2 beta3 wo^3这样调参时只需要一个参数wo概念清楚很多也不容易迷失。我一般从wo 30 rad/s开始逐步往上加直到观察z3对扰动的估计速度足够快但噪声还没失控。第三步调控制器带宽让闭环响应跟上指令控制器反馈增益kp和kd也可以按带宽参数化kp wc^2 kd 2 * wcwc是期望闭环带宽。初始从wc 5 rad/s开始飞机应该能稳定。逐步提高wc直到跟踪性能满意或者开始出现高频抖动。多数机型在wc 8~12 rad/s区间表现不错这取决于执行器响应速度。第四步整定扰动补偿强度这个其实是在调b0的有效值如果b0估算不准确补偿会过冲或者欠冲。我在测试中发现把b0调大20%-30%抗扰动效果会有明显提升但过大会让ESO的扰动估计值和前馈补偿交互产生一个高频振荡源。第五步真机悬停和阵风测试从前面的测试台验证通过后我会选择一个无风的早晨做首次真机悬停。此时把wc暂时降到5确认飞机能悬住再逐步往上提。重点观察悬停时的电机转速音频是否均匀、加速度计的高频振动是否变大。只有这一步通过了才敢在外面有风的天去验证抗扰动效果。3.3 我实测的对比数据我用的测试条件是四旋翼总重2.1kg对角线轴距550mm阵风环境大约4-5m/s的侧风。同一套硬件上分别跑串级PID和ADRC记录悬停时的姿态角标准差。控制方案Roll角标准差度Pitch角标准差度最大角度偏差度电机调幅串级PID调优后1.020.953.8中等ADRCESO补偿0.480.441.5较低从数据上看ADRC的控制品质并不只是“好了一点点”而是数量级上的差距。特别是在突加负载实验里我在飞机悬停时迅速挂载一个300g的载荷串级PID出现了约1.2秒的明显高度下垂和姿态偏转才慢慢恢复ADRC大概在0.4秒内完成姿态修正下沉幅度不到PID的一半。这就是总扰动实时补偿带来的“提前量”。4. 常见问题与排查技巧实录4.1 观测器发散或震荡先检查数值稳定性这是新手最容易碰到的坑。症状包括解算的z3数值爆炸、控制量饱和、飞机高频抖动。我仔细排查过大部分原因是控制周期与观测器增益不匹配。离散化系统对带宽有奈奎斯特极限如果wo设到100以上控制频率只有500Hz那么观测器方程很容易不稳定。排查思路是先从低速开始跑仿真用同样的参数放到真机上对比逐步找边界。另外一定要注意ESO里的z3代表总扰动物理量纲是什么它最终是要折算到控制量的。四旋翼roll轴的扰动折算后等效于一个额外的角加速度。如果你在实现时忘记把z3乘上合适的换算系数就直接加到控制量里补偿方向反了会引起正反馈飞机一通电就会猛翻转。这个问题在代码审查时很难发现但在测试台上只要油门一推就能看到异常。所以我强烈建议先做b0符号校验。4.2 高频噪声被观测器放大加滤波但别加在反馈主路上ESO本质上是一个高增益观测器wo越高对高频噪声的放大越明显。飞控的陀螺仪数据本身已经经过低通滤波但在1kHz控制频率下依然会有高频噪声分量。如果发现z2角速度估计值比实际传感器值噪声还大说明观测器增益过高或输入信号不够干净。我的处理办法是ESO内部使用一个轻量的二阶低通滤波器处理z3同时让z1的反馈路径保持原样避免相位滞后影响扰动观测的及时性。这个滤波器截止频率设为wo的3倍以上作用只是压高频毛刺。要注意不要把滤波加在y输入之前那会增加整个环路的纯延迟抵消防扰动效果。4.3 参数整定耗时用“带宽法”把参数空间降维ADRC如果不用参数化方法参数空间会比PID大得多逐个试非常痛苦。我用的是前面提到的带宽法本质上把观测器和控制器的参数都统一到两个带宽参数上wo和wc。这样即便需要微调个别增益也只是在特定方向上加系数不会破坏整体稳定性。这个思路现在也写进了LADRC的论文里实际工程效率真的高很多。调试时我还会把日志里的z1 - y估计误差单独拉出来看。如果这个误差在阶跃响应之后很久都不能收敛到零附近说明观测器增益低了如果误差收敛很快但z3波动大说明wo太高了。用误差信号来诊断比盯着曲线瞎猜高效得多。4.4 执行器饱和与积分反算ADRC的补偿机制会把总扰动直接折算成控制量增量这在大风天或急加速时会比较激进可能导致电机转速触及上下限。这时候总扰动估计值z3会出现偏差因为实际系统在饱和状态下无法响应对应的控制量扰动观测等价关系被破坏。处理办法是执行器饱和检测一旦发现某个电机指令超出范围就把控制器输出做限幅处理同时暂停z3积分或对z3做按比例衰减修正。简单说就是给ESO一个“神经信号”告诉它现在输出已经到极限了你估计到的扰动有一部分是假的。我在实际使用中还发现电机混控饱和往往是单轴的比如大俯仰指令时前侧电机先饱和。这时候如果只对总控制量统一做限幅姿态响应会出现非线性。后来我在混控层对每个轴向单独做抗饱和ESO依然按未饱和时的控制量计算前馈补偿效果比统一限幅好很多。4.5 问题排查速查表现象可能原因处理建议起飞瞬间翻转b0符号错误或量级错误在测试台上校验b0确认补偿方向悬停高频抖动观测器带宽wo过高或角速度噪声大降低wo检查传感器滤波动力明显不足感b0偏大补偿过强减小b0约20%看是否缓解大风下姿态恢复慢观测器带宽偏低扰动估计滞后提高wo但注意噪声风险特定频率持续振荡控制带宽与结构模态耦合降低wc或增加陷波滤波器载荷抛投后高度掉很多高度环或位置环响应慢独立检查内环扰动补偿是否在位置通道生效如果你已经有一定飞控基础建议直接拿你熟悉的那架飞机做一次ADRC改造。不用一开始就图大而全先只改roll轴保留pitch和yaw轴用原来的PID跑通对比路径。等确认ADRC的优势在自己的机型上成立再逐步扩展到全姿态通道。我在这个项目里最深的一个体会是ADRC不是一个可以“一键替换”的黑盒子它的性能上限取决于你对模型参数的辨识能力、对传感器噪声特性的理解以及对离散化细节的把控。真正把ESO的扰动估计能力用起来之后你会明显感受到四旋翼抗扰动控制的瓶颈不在于控制器本身而在于对“扰动”二字的理解深度。最后再分享一个经验在任何天气下做首次真机测试前把z3通道记录成单独的日志字段如果过程中有风吹过飞行结束后看看z3有没有对应变化。如果你的观测器连风都感知不到那参数一定还有问题别急着上天。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

ARIS 工作流总览:从 idea 到 paper 的 13 条 pipeline 如何一次看全 2026/9/21 4:07:21

ARIS 工作流总览:从 idea 到 paper 的 13 条 pipeline 如何一次看全

ARIS 工作流总览:从 idea 到 paper 的 13 条 pipeline 如何一次看全 【免费下载链接】Auto-claude-code-research-in-sleep ARIS ⚔️ (Auto-Research-In-Sleep) — Lightweight Markdown-only skills for autonomous ML research: cross-model review loops, idea …

阅读更多 →
Roc 格式化器幂等性测试实战:从 issue 8851 快照看多行分发与字段访问的格式化处理 2026/9/21 4:04:21

Roc 格式化器幂等性测试实战:从 issue 8851 快照看多行分发与字段访问的格式化处理

Roc 格式化器幂等性测试实战:从 issue 8851 快照看多行分发与字段访问的格式化处理 【免费下载链接】roc A fast, friendly, functional language. 项目地址: https://gitcode.com/GitHub_Trending/ro/roc 导读:本文以 Roc 编译器仓库中的快照测试…

阅读更多 →
TypePHP编译器API参考:程序化调用PHP AOT编译器的完整指南 2026/9/21 4:04:21

TypePHP编译器API参考:程序化调用PHP AOT编译器的完整指南

TypePHP编译器API参考:程序化调用PHP AOT编译器的完整指南 【免费下载链接】typephp Compile PHP to Native Binaries 项目地址: https://gitcode.com/GitHub_Trending/ty/typephp TypePHP 是一款用 PHP 编写的原生 AOT 编译器(tpc)&a…

阅读更多 →
React Admin 实时数据提供者(Realtime Data Provider)接入完整指南:方法签名、内置适配器与自定义实现 2026/9/21 4:04:21

React Admin 实时数据提供者(Realtime Data Provider)接入完整指南:方法签名、内置适配器与自定义实现

前端UI组件 【免费下载链接】react-admin A frontend Framework for single-page applications on top of REST/GraphQL APIs, using TypeScript, React and Material Design 项目地址: https://gitcode.com/gh_mirrors/re/react-admin 点击查看 免费下载 本指南系…

阅读更多 →
VitePress 默认主题 Layout 指南:深入理解 doc、page、home 与自定义布局 2026/9/21 4:04:21

VitePress 默认主题 Layout 指南:深入理解 doc、page、home 与自定义布局

VitePress 默认主题 Layout 指南:深入理解 doc、page、home 与自定义布局 【免费下载链接】vitepress Vite & Vue powered static site generator. 项目地址: https://gitcode.com/gh_mirrors/vi/vitepress VitePress 通过 frontmatter 中的 layout 选项…

阅读更多 →
Weex 鸿蒙化实践:js-base64 纯 JS 编解码库在 WebSceneAPI 中的集成与使用指南 2026/9/21 4:04:21

Weex 鸿蒙化实践:js-base64 纯 JS 编解码库在 WebSceneAPI 中的集成与使用指南

移动开发跨平台前端UI组件OpenHarmony 【免费下载链接】weex A framework for building Mobile cross-platform UI 项目地址: https://gitcode.com/gh_mirrors/we/weex 点击查看 免费下载 导读 本文基于 WebSceneAPI 模块 内置的 js-base64 库(位于 co…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞