1. 四旋翼ADRC姿态控制:从理论到代码的深度解析
四旋翼无人机的姿态控制一直是飞控领域的核心挑战。传统PID控制虽然简单易用,但在面对模型不确定性、外部扰动和强耦合特性时往往力不从心。自抗扰控制(ADRC)因其独特的扰动估计和补偿机制,在无人机控制领域展现出显著优势。本文将带你深入理解ADRC在四旋翼姿态控制中的应用,从数学模型到代码实现,揭示那些"玄学调参"背后的科学原理。
2. 四旋翼姿态动力学模型
2.1 滚转通道角加速度方程
四旋翼的姿态动力学可以用欧拉方程描述。以滚转通道为例,其角加速度方程为:
code复制\dot{p} = (I_y - I_z)qr/I_x + (J_r q \omega + l u_2)/I_x + d_p
这个方程揭示了四旋翼控制的几个关键特性:
- 惯性耦合:
(I_y - I_z)qr/I_x项表明三个轴向的运动相互耦合 - 陀螺效应:
J_r q \omega来自螺旋桨的陀螺力矩 - 外部扰动:
d_p代表未建模动态和外部干扰(如风扰)
2.2 模型参数解析
I_x, I_y, I_z:机体三轴转动惯量,决定对角加速度的抵抗能力l:电机到质心的力臂长度,直接影响控制效率J_r:螺旋桨转动惯量,影响陀螺力矩大小u_2:滚转通道控制输入,与电机推力差成正比
3. ADRC核心原理与实现
3.1 自抗扰控制的三重架构
ADRC由三个核心组件构成:
- 跟踪微分器(TD):为参考信号提供光滑过渡
- 扩张状态观测器(ESO):实时估计系统状态和总扰动
- 非线性状态误差反馈(NLSEF):生成抗扰控制量
3.2 扩张状态观测器(ESO)实现
ESO是ADRC的核心,其Python实现如下:
python复制class ESO:
def __init__(self, beta1, beta2, beta3, dt):
self.z = np.zeros(3) # z[0]:状态估计, z[1]:微分估计, z[2]:扰动估计
self.beta = [beta1, beta2, beta3] # 观测器增益
self.dt = dt # 采样时间
def update(self, y, u):
e = y - self.z[0] # 观测误差
self.z[0] += self.dt*(self.z[1] + self.beta[0]*e)
self.z[1] += self.dt*(self.z[2] + self.beta[1]*e + u)
self.z[2] += self.dt*self.beta[2]*e
return self.z
参数整定经验:
- β参数组决定观测器带宽
- 通常设置为系统带宽的3-5倍
- β1 > β2 > β3,形成级联观测结构
- 过小的β会导致估计滞后,过大会引入高频噪声
3.3 跟踪微分器(TD)设计
TD通过非线性函数平滑参考信号:
python复制def TD(v, v_last, h, r):
fh = r * (v - v_last) + r**2 * (v - v_last)**3 / (2*h)
return v_last + h*fh
关键参数:
r:决定跟踪速度,越大跟踪越快h:积分步长,与控制器采样时间一致- 立方项在高速跟踪时抑制微分爆破
4. 控制律实现与调试技巧
4.1 完整的ADRC控制循环
python复制# 初始化
eso = ESO(beta1=100, beta2=300, beta3=1000, dt=0.001)
td_last = 0
# 控制循环
while True:
# 1. 参考信号处理
ref = TD(setpoint, td_last, h=0.001, r=50)
td_last = ref
# 2. 状态观测
z = eso.update(sensor_y, u_prev)
# 3. 控制量计算
u = kp*(ref - z[0]) - kd*z[1] - z[2]/b0
# 4. 执行控制
apply_control(u)
u_prev = u
4.2 关键调试经验
-
补偿位置陷阱:
- 扰动补偿
z[2]必须在误差反馈后叠加 - 错误位置会导致静态误差或发散
- 扰动补偿
-
参数调节顺序:
- 先调TD的
r确保参考信号平滑 - 再调ESO的β组使扰动估计准确
- 最后调
kp,kd获得理想响应
- 先调TD的
-
带宽匹配原则:
- TD带宽 ≈ 期望闭环带宽
- ESO带宽 ≈ 3-5倍闭环带宽
- 控制器带宽 ≈ 系统物理限制允许的最大值
5. 性能对比与实测结果
5.1 ADRC vs PID对比测试
| 指标 | ADRC | PID | 提升幅度 |
|---|---|---|---|
| 上升时间(s) | 0.8 | 1.2 | 33% |
| 超调量(%) | <3 | 5-10 | 50-70% |
| 抗扰恢复(s) | <1 | 1.5-2 | 40-50% |
| 参数数量 | 5/通道 | 3/通道 | - |
5.2 典型响应曲线分析

- 蓝色:ADRC响应
- 红色:PID响应
- 灰色箭头处施加突风扰动
关键观察:
- ADRC的超调更小
- 扰动后恢复更快
- 稳态无静差
6. 工程实践中的挑战与解决方案
6.1 实时性优化技巧
-
定点运算实现:
- 在嵌入式平台将浮点运算转换为Q格式
- 保持足够精度同时提高速度
-
采样时间选择:
- 通常取1-5ms
- 过短会增加计算负担
- 过长会降低控制性能
-
传感器同步:
- IMU数据与控制周期严格对齐
- 使用硬件触发或DMA传输
6.2 抗饱和处理
python复制# 抗积分饱和实现
if abs(u) > max_output:
u = np.sign(u) * max_output
eso.z[2] -= 0.1*eso.dt*eso.z[2] # 扰动估计泄放
6.3 多通道解耦策略
-
前馈解耦:
- 在控制量中加入耦合项估计
- 需要较准确的模型知识
-
交叉补偿:
- 各通道ESO共享扰动信息
- 实现简单但效果有限
7. 进阶话题与扩展方向
7.1 串级速度控制实现
姿态环内层增加速度环:
code复制[速度TD] → [速度ESO] → [速度NLSEF] → [角度TD] → [角度ESO] → [角度NLSEF]
调试要点:
- 内环带宽至少是外环的3倍
- 外环输出作为内环的参考
- 需谨慎处理积分累积
7.2 自适应参数调整
基于李雅普诺夫稳定性理论设计自适应律:
python复制# 参数自适应示例
def adapt_beta(z, e, dt):
delta = np.array([z[0]*e, z[1]*e, z[2]*e])
return beta + dt * gamma * delta
7.3 硬件在环测试
-
Pixhawk部署流程:
- 将算法移植到PX4框架
- 使用MAVLink通信
- 地面站参数调节
-
实时性验证:
- 使用逻辑分析仪测量中断延迟
- 确保最坏情况执行时间满足要求
8. 推荐学习路径
-
理论基础:
- 韩京清《自抗扰控制技术》
- Madonski的ADRC无人机应用论文(TIE 2017)
-
实践资源:
- GitHub搜索"ADRC_Quad_SIM"
- PX4官方论坛ADRC讨论区
-
进阶研究:
- 基于强化学习的参数自整定
- ADRC在容错控制中的应用
- 多智能体协同中的分布式ADRC