1. 项目背景与核心挑战
四旋翼飞行器作为典型的欠驱动系统,其动态特性高度依赖于质量与惯性矩阵参数的准确性。但在实际应用中,这些参数往往存在不确定性:负载变化会导致质量改变,电池消耗或外挂设备会影响惯性特性。传统PID控制器在面对参数变化时表现出的鲁棒性不足,常常需要手动重新调参。这促使我们探索自适应控制方案,使其能在线估计系统参数并实时调整控制策略。
这个项目要解决三个关键问题:一是如何在飞行过程中实时估计质量与惯性矩阵参数;二是如何处理四旋翼固有的欠驱动特性(4个输入控制6个自由度);三是如何实现位置与姿态的动态解耦控制。我们采用动态扩展反馈线性化结合自适应律的方案,最终在Matlab中实现了高精度的轨迹跟踪。
提示:欠驱动系统指控制输入维度小于系统自由度的情况,四旋翼的6个自由度(x,y,z位置和滚转/俯仰/偏航角)仅通过4个旋翼转速控制,这导致其控制具有本质上的非线性耦合特性。
2. 系统建模与问题表述
2.1 四旋翼动力学模型
建立机体坐标系{B}和惯性坐标系{I},采用欧拉角表示姿态。根据牛顿-欧拉方程推导出如下非线性动力学模型:
位置动力学:
$$ m\ddot{\boldsymbol{p}} = \boldsymbol{R}(\phi,\theta,\psi) \begin{bmatrix}0\0\T\end{bmatrix} - \begin{bmatrix}0\0\mg\end{bmatrix} + \boldsymbol{d}_p $$
姿态动力学:
$$ \boldsymbol{J}\dot{\boldsymbol{\omega}} + \boldsymbol{\omega} \times \boldsymbol{J}\boldsymbol{\omega} = \boldsymbol{\tau} + \boldsymbol{d}_a $$
其中:
- $m$为总质量,$\boldsymbol{J}$为惯性矩阵
- $\boldsymbol{p}=[x,y,z]^T$为位置向量
- $\boldsymbol{\omega}=[p,q,r]^T$为角速度(机体坐标系下)
- $T$为总推力,$\boldsymbol{\tau}=[\tau_\phi,\tau_\theta,\tau_\psi]^T$为力矩
- $\boldsymbol{d}_p,\boldsymbol{d}_a$为外界扰动
2.2 控制目标表述
设计控制器使得四旋翼能够:
- 实时估计$m$和$\boldsymbol{J}$的真值
- 跟踪给定的时变轨迹$\boldsymbol{p}_d(t)$
- 保持期望偏航角$\psi_d(t)$
- 对参数不确定性和外界扰动具有鲁棒性
3. 自适应控制器设计
3.1 参数自适应律设计
定义参数误差向量:
$$ \tilde{\boldsymbol{\theta}} = \boldsymbol{\theta} - \hat{\boldsymbol{\theta}} $$
其中$\boldsymbol{\theta} = [m, J_{xx}, J_{yy}, J_{zz}]^T$为真实参数。
采用Lyapunov稳定性理论推导自适应更新律:
$$ \dot{\hat{\boldsymbol{\theta}}} = \Gamma \boldsymbol{Y}^T \boldsymbol{s} $$
其中$\Gamma$为正定增益矩阵,$\boldsymbol{Y}$为回归矩阵,$\boldsymbol{s}$为滑模变量。
3.2 动态扩展反馈线性化
针对高度通道设计虚拟控制量:
$$ u_z = \ddot{z}d - k\dot{e}z - ke_z $$
其中$e_z = z - z_d$为高度误差。
通过动态扩展将系统转换为严格反馈形式,然后应用反步法设计控制律。对于姿态环,设计角加速度指令为:
$$ \boldsymbol{\omega}c = \boldsymbol{J}^{-1}(-\boldsymbol{\omega}\times\boldsymbol{J}\boldsymbol{\omega} + \boldsymbol{\tau} + \boldsymbol{\tau}_{fb}) $$
3.3 输入-输出解耦实现
采用微分平坦特性实现解耦控制。选择平坦输出为:
$$ \boldsymbol{\sigma} = [x, y, z, \psi]^T $$
通过Lie导数计算得到解耦控制律:
$$ \begin{bmatrix}T\ \tau_\phi\ \tau_\theta\ \tau_\psi\end{bmatrix} = \boldsymbol{M}^{-1}(\boldsymbol{\nu} - \boldsymbol{N}) $$
其中$\boldsymbol{M}$为可逆耦合矩阵,$\boldsymbol{\nu}$为新的虚拟输入。
4. Matlab实现关键代码解析
4.1 自适应估计模块实现
matlab复制function [theta_hat_dot] = adaption_law(Y, s, Gamma)
% 参数自适应更新律
theta_hat_dot = Gamma * Y' * s;
end
4.2 反馈线性化核心代码
matlab复制function [u, omega_c] = feedback_linearization(x, xd, Kp, Kv)
% 计算跟踪误差
e = x(1:3) - xd(1:3);
de = x(4:6) - xd(4:6);
% 设计虚拟控制量
nu = xd(7:9) - Kp.*e - Kv.*de;
% 反馈线性化转换
R = rotation_matrix(x(7:9));
u = [m*(nu(3)+g)/(R(3,3));
inv(J)*(cross(-J*x(10:12),x(10:12)) + tau_fb)];
omega_c = x(10:12) + integral_gain.*cross_err;
end
4.3 轨迹跟踪主循环
matlab复制for t = 0:dt:Tf
% 获取期望轨迹
[pd, dpd, ddpd] = desired_trajectory(t);
% 参数估计更新
Y = regressor(x, u);
theta_hat_dot = adaption_law(Y, s, Gamma);
theta_hat = integrate(theta_hat_dot);
% 计算控制指令
[u, omega_c] = feedback_linearization(x, [pd;dpd;ddpd], Kp, Kv);
% 系统动力学更新
xdot = quadrotor_dynamics(x, u, theta_hat);
x = integrate(xdot);
end
5. 仿真结果与分析
5.1 参数估计收敛性
设置初始参数误差±30%,仿真显示:
- 质量估计在2.5秒内收敛
- 惯性矩估计在4秒内收敛
- 稳态估计误差<2%
5.2 轨迹跟踪性能
测试螺旋上升轨迹跟踪:
- 位置跟踪误差RMS值:x/y<0.05m,z<0.03m
- 姿态跟踪误差:滚转/俯仰<0.8°,偏航<1.2°
- 抗扰动测试:施加1N阶跃风扰,恢复时间<1秒
5.3 与传统PID对比
| 指标 | 自适应控制 | PID控制 |
|---|---|---|
| 参数变化鲁棒性 | 优 | 差 |
| 跟踪精度 | 0.05m | 0.15m |
| 抗扰能力 | <1s恢复 | 振荡持续 |
6. 工程实现中的关键问题
6.1 参数可辨识性条件
为保证参数可辨识,需要:
- 激励充分:轨迹需包含足够丰富的频率成分
- 持续激励条件满足:
$$ \int_t^{t+T} Y^T(\tau)Y(\tau)d\tau \geq \alpha I $$ - 避免奇异姿态(如90°俯仰)
6.2 计算效率优化
实时实现时的优化策略:
- 采用固定步长Runge-Kutta积分
- 预先计算符号表达式生成C代码
- 使用并行计算更新不同通道控制律
6.3 实际飞行测试建议
- 参数估计阶段采用"激励轨迹"(如8字形)
- 初始阶段限制姿态角范围(±30°内)
- 自适应增益分阶段调整:
- 初始阶段:高增益快速收敛
- 稳态阶段:低增益抑制噪声
7. 扩展应用与改进方向
7.1 负载突变处理方案
当检测到负载突然变化(如投放货物):
matlab复制function detect_load_change(theta_hat, threshold)
if norm(theta_hat_dot) > threshold
reset_covariance(); % 重置估计协方差
increase_adaptation_gain(); % 临时提高增益
end
end
7.2 结合机器学习的方法
用NN补偿未建模动态:
matlab复制u_total = u_fbl + W' * sigma(x);
其中$\sigma(x)$为神经网络基函数,$W$在线更新。
7.3 硬件在环测试配置
建议测试流程:
- Gazebo仿真验证算法逻辑
- Pixhawk硬件在环测试
- 实际飞行分阶段验证:
- 先姿态环自适应
- 再位置环自适应
- 最后全自适应模式
8. 完整代码获取与使用说明
项目代码结构:
code复制/AdaptiveQuadrotorControl
│── /docs % 理论推导文档
│── /simulation % 仿真主程序
│ ├── main.m % 主脚本
│ ├── dynamics/ % 动力学模型
│ └── controller/ % 控制算法
│── /utils % 工具函数
│── README.md % 使用说明
使用步骤:
- 克隆仓库到本地
- 运行
simulation/main.m - 修改
config/parameters.m设置初始条件 - 在
trajectory/中添加自定义轨迹
注意:首��运行需安装Control Toolbox和Symbolic Math Toolbox。对于实时性要求高的应用,建议生成C代码部署。
