飞控调参新思路:当Ardupilot遇上ADRC,我是如何用地面站调参替代Simulink仿真的
飞控调参新思路:当Ardupilot遇上ADRC,我是如何用地面站调参替代Simulink仿真的
1. 从PID到ADRC:为什么我们需要更聪明的控制算法
如果你曾经在Ardupilot上调过PID参数,大概率经历过这样的痛苦:反复修改P/I/D三个参数,看着飞行器在测试中要么反应迟钝,要么剧烈震荡,最后不得不妥协于一个"勉强能用"的设定。传统PID控制虽然简单可靠,但在面对复杂扰动和模型不确定性时,往往显得力不从心。
这就是ADRC(Active Disturbance Rejection Control,自抗扰控制)的价值所在。与PID不同,ADRC通过**扩张状态观测器(ESO)**实时估计并补偿系统内外部扰动,其核心优势可以总结为:
- 抗扰能力强:ESO将模型误差和外部干扰统一视为"总扰动"进行实时估计和补偿
- 参数整定简单:主要调节带宽参数即可,比PID三参数耦合调参更直观
- 模型依赖低:对系统数学模型精度要求不高,适合飞行器这类复杂被控对象
在Ardupilot生态中实现ADRC,传统做法是通过Simulink建模→仿真→代码生成→固件烧录的流程,但这种方法存在明显短板:
- 每次参数调整都需要重新编译固件
- 仿真环境与真实飞行存在差距
- 开发周期长,试错成本高
2. 地面站调参方案设计:把ADRC参数映射到Ardupilot参数表
2.1 ADRC关键参数解析
一个典型的二阶ADRC控制器包含以下可调参数:
| 参数类型 | 典型参数名 | 物理意义 | 调参影响 |
|---|---|---|---|
| 带宽参数 | ω_c | 控制器带宽 | 响应速度与抗噪能力的权衡 |
| 观测器参数 | ω_o | 观测器带宽 | 扰动估计的快速性与准确性 |
| 非线性参数 | α, δ | 非线性函数特性 | 控制平滑性与抗抖振能力 |
| 前馈系数 | b0 | 系统近似模型的增益 | 影响前馈补偿效果 |
2.2 参数映射策略
为了实现通过地面站调参,我们需要将ADRC参数映射到Ardupilot现有的参数框架中。以俯仰角速率环(Pitch Rate)为例,可以建立如下对应关系:
// 在AC_PID.h中扩展参数 AP_Float _adrc_wc; // 控制器带宽 AP_Float _adrc_wo; // 观测器带宽 AP_Float _adrc_b0; // 前馈系数对应的地面站参数命名遵循Ardupilot惯例:
ATC_RAT_PIT_ADRC_WC ATC_RAT_PIT_ADRC_WO ATC_RAT_PIT_ADRC_B0注意:参数前缀(如ATC_RAT_PIT)由调用PID控制器的模块决定,保持与现有参数命名风格一致
2.3 参数接口实现
在AC_PID库中实现参数更新接口:
float AC_PID::update_all(float target, float measurement, bool limit) { // ...原有PID处理逻辑... // ADRC参数更新 _adrc.set_bandwidth(_adrc_wc, _adrc_wo); _adrc.set_b0(_adrc_b0); // ADRC计算 return _adrc.compute(target, measurement, _dt); }3. 调参实战:从仿真到真实飞行的完整流程
3.1 软件在环(SITL)调试
使用Ardupilot的SITL环境进行初步调参:
# 启动Copter SITL实例 sim_vehicle.py -v ArduCopter --console --map调参步骤建议:
初始化带宽参数:根据飞行器动力学特性估算初始值
- ω_c = 2~5 rad/s (角速率环)
- ω_o = 5~10 rad/s (通常为ω_c的3~5倍)
前馈系数整定:
- 在地面站中设置ATC_RAT_PIT_ADRC_B0=0
- 逐步增大直到响应速度不再明显提升
飞行测试验证:
- 观察日志中的姿态误差和控制量
- 使用Vibration Analysis工具检查高频振荡
3.2 参数优化技巧
通过飞行日志分析调参效果的几个关键指标:
| 日志参数 | 理想特征 | 异常表现 |
|---|---|---|
| CTUN.DesRoll | 平滑过渡,无超调 | 高频振荡或持续波动 |
| RCOU.C1 | 无持续饱和现象 | 长时间保持最大值/最小值 |
| IMU.GyrX | 噪声在合理范围内 | 高频振动成分明显 |
优化经验:
- 先调ω_o确保扰动估计快速准确
- 再调ω_c获得理想的响应速度
- 最后微调b0优化动态性能
4. 与传统方法的对比:为什么选择地面站调参
4.1 效率对比
| 调参方式 | 单次迭代时间 | 参数可见性 | 试错成本 |
|---|---|---|---|
| Simulink仿真 | 5-10分钟 | 高 | 中 |
| 固件烧录 | 15-30分钟 | 低 | 高 |
| 地面站调参 | 即时生效 | 高 | 低 |
4.2 实际飞行中的调参策略
在飞行现场调参时,推荐采用以下流程:
基础稳定性测试:
- 悬停测试(3分钟)
- 检查日志中的振动指标
- 确认无持续振荡现象
动态响应测试:
- 阶跃输入测试(快速打杆)
- 记录从指令到稳定的时间
- 检查超调量
抗扰测试:
- 手动施加扰动(如轻推机臂)
- 观察恢复时间和稳态误差
遇到振荡时的快速应对:
- 降低ω_c 10-20%
- 增加ω_o 10%
- 检查IMU数据是否异常
5. 进阶技巧:当ADRC遇到特殊飞行场景
5.1 应对强风环境
在强风条件下,ADRC参数需要特别优化:
- 增大ω_o(提高扰动估计带宽)
- 适当减小ω_c(避免高频响应)
- 示例参数组合:
ATC_RAT_PIT_ADRC_WO = 15 ATC_RAT_PIT_ADRC_WC = 3
5.2 载重变化自适应
针对不同负载条件,可以建立参数预设:
// 在飞行模式切换时自动加载参数 void Mode::update_adrc_params() { if (_load_heavy) { _adrc_wc.set(2.5); _adrc_wo.set(12); } else { _adrc_wc.set(4); _adrc_wo.set(8); } }5.3 与现有PID参数的兼容处理
过渡方案:保留PID参数作为备份
float AC_PID::update_all(float target, float measurement, bool limit) { if (_adrc_enabled) { return adrc_update(target, measurement); } else { return pid_update(target, measurement, limit); } }在地面站中添加切换参数:
ATC_ADRC_ENABLE = 1/06. 诊断与调试:如何读懂ADRC的行为
6.1 关键日志分析
在DATAFLASH日志中添加ADRC专用消息:
// 在update_all()中添加 logger.Write_ADRC(_adrc.get_internal_states());需要特别关注的日志字段:
- ESO_EstError:观测器估计误差
- Total_Dist:估计的总扰动大小
- Ctrl_Output:控制器最终输出
6.2 常见问题排查
问题1:飞行器响应迟钝
- 检查ω_c是否过小
- 确认b0设置合理
- 验证传感器数据更新频率
问题2:高频振荡
- 降低ω_o 10-20%
- 检查IMU振动水平
- 确认机械结构无松动
问题3:稳态误差大
- 检查ESO_EstError是否持续偏大
- 考虑增加ω_o提高估计精度
- 验证传感器校准状态
7. 性能优化:让ADRC在STM32上高效运行
7.1 计算负载评估
ADRC相比PID增加的计算量主要来自:
- 扩张状态观测器(4阶)
- 非线性函数计算
- 扰动补偿计算
在STM32F4上的实测数据:
| 控制器类型 | 执行时间(us) | Flash占用(KB) |
|---|---|---|
| PID | 12 | 3.2 |
| ADRC | 28 | 7.8 |
7.2 优化技巧
代码级优化:
// 使用查表法实现非线性函数 static const float fal_table[] = { 0.0f, 0.1f, 0.2f, ..., 1.0f }; inline float fal_fast(float e, float alpha) { int index = constrain_int32(e * 10, 0, 10); return fal_table[index]; }参数存储优化:
// 使用AP_Float的缩放功能节省存储空间 AP_Float _adrc_wc(0.0f, 0.1f); // 0.1精度足够调度优化:
// 在fast_loop()中只运行关键计算 void fast_loop() { if (_loop_counter % 2 == 0) { update_eso(); // 高频运行 } else { update_nlsef(); // 低频运行 } }8. 飞行测试:从参数到实际性能的验证
在真实飞行测试中,我采用了一套标准化的测试流程:
悬停稳定性测试:
- 记录3分钟悬停数据
- 分析位置保持误差
- 检查电机输出平稳性
机动性测试:
- 快速横滚/俯仰动作
- 测量90°滚转时间
- 检查回中精度
抗扰测试:
- 手动施加脉冲扰动
- 测量恢复时间
- 记录最大偏差角度
测试结果对比(500mm轴距四旋翼):
| 指标 | PID | ADRC | 提升幅度 |
|---|---|---|---|
| 悬停位置误差(cm) | ±25 | ±12 | 52% |
| 90°滚转时间(ms) | 320 | 280 | 12.5% |
| 扰动恢复时间(s) | 1.2 | 0.7 | 42% |
| 最大抗风速度(m/s) | 8 | 12 | 50% |
特别在突风条件下,ADRC表现出明显优势。在一次野外测试中,当突然遭遇侧风时,PID控制器产生了约15°的姿态偏差并持续振荡,而ADRC仅在初期出现8°偏差后快速恢复稳定。
