1. 项目概述
四旋翼飞行器的多目标航点导航一直是无人机控制领域的热点问题。传统PID控制在处理多航点切换时往往会出现轨迹震荡、响应滞后等问题。而模型预测控制(MPC)凭借其滚动优化和约束处理的优势,能够很好地解决这一难题。
我在实际项目中发现,要实现稳定高效的多航点导航,关键在于三个核心环节:动力学建模的准确性、MPC目标函数的合理设计,以及航点切换策略的优化。下面我将结合Matlab实现,详细解析每个环节的技术要点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 四旋翼动力学建模
2.1 坐标系定义
建立两个右手坐标系:
- 惯性坐标系:固定于地面,Z轴垂直向上
- 机体坐标系:原点在四旋翼质心,X轴指向机头方向
2.2 动力学方程推导
采用牛顿-欧拉方法建立六自由度模型:
位置动力学:
mẍ = (cosφsinθcosψ + sinφsinψ)U₁ - K₁ẋ
mÿ = (cosφsinθsinψ - sinφcosψ)U₁ - K₂ẏ
mz̈ = (cosφcosθ)U₁ - mg - K₃ż
姿态动力学:
Iₓφ̈ = θ̇ψ̇(I_y - I_z) + lU₂ - K₄φ̇
I_yθ̈ = φ̇ψ̇(I_z - Iₓ) + lU₃ - K₅θ̇
I_zψ̈ = φ̇θ̇(Iₓ - I_y) + U₄ - K₆ψ̇
其中U₁~U₄为虚拟控制量:
U₁ = b(ω₁² + ω₂² + ω₃² + ω₄²)
U₂ = b(-ω₂² + ω₄²)
U₃ = b(ω₁² - ω₃²)
U₄ = d(-ω₁² + ω₂² - ω₃² + ω₄²)
注意:建模时要考虑电机动力学延迟,通常用一阶惯性环节近似:ω̇ = (ω_cmd - ω)/τ,τ≈0.05s
2.3 模型线性化
在工作点附近进行小扰动线性化:
状态向量:
x = [x y z ẋ ẏ ż φ θ ψ φ̇ θ̇ ψ̇]ᵀ
控制输入:
u = [U₁ U₂ U₃ U₄]ᵀ
得到状态空间方程:
ẋ = Ax + Bu
y = Cx
在Matlab中可以使用jacobian函数实现符号线性化:
matlab复制syms x y z xd yd zd phi theta psi p q r U1 U2 U3 U4
% 定义非线性方程
f = [...];
A = jacobian(f, [x,y,z,xd,yd,zd,phi,theta,psi,p,q,r]);
B = jacobian(f, [U1,U2,U3,U4]);
3. MPC控制器设计
3.1 预测模型离散化
采用零阶保持法离散化,采样时间T=0.1s:
matlab复制sys_d = c2d(ss(A,B,C,D), T, 'zoh');
[Ad, Bd, Cd, Dd] = ssdata(sys_d);
3.2 多目标代价函数设计
J = Σ(α||x(k+i)-x_ref||² + β||u(k+i)||² + γ||Δu(k+i)||²)
权重选择经验:
- 航点跟踪:α=1.0
- 能量优化:β=0.1
- 控制平滑:γ=0.5
3.3 约束处理
在Matlab中使用quadprog求解时,需将约束转化为标准形式:
状态约束:
x_min ≤ x ≤ x_max → [I; -I]x ≤ [x_max; -x_min]
输入约束:
u_min ≤ u ≤ u_max
Δu_min ≤ u_k - u_{k-1} ≤ Δu_max
典型参数设置:
matlab复制u_max = [15; 1; 1; 1]; % 最大推力10N·m
u_min = [0; -1; -1; -1];
delta_u_max = 0.5*ones(4,1);
4. 多航点导航实现
4.1 航点管理策略
matlab复制waypoints = [0 0 1;
2 1 1.5;
1 3 1;
0 0 1]; % 循环航路
current_wpt = 1;
dist_thresh = 0.3; % 切换阈值
vel_thresh = 0.2; % 速度阈值
function updateWaypoint(pos, vel)
if norm(pos-waypoints(current_wpt,:)) < dist_thresh &&...
norm(vel) < vel_thresh
current_wpt = mod(current_wpt, size(waypoints,1)) + 1;
end
end
4.2 参考轨迹生成
采用三次B样条插值:
matlab复制t = linspace(0,1,10);
points = [waypoints(current_wpt,:);
waypoints(next_wpt,:)];
spline = cscvn(points');
ref_traj = fnval(spline, t);
5. 仿真实现与调试
5.1 Simulink框架搭建
- 四旋翼非线性模型模块
- MPC控制器模块(Embedded MATLAB Function)
- 航点管理器模块
- 可视化模块(Aerospace Blockset)
5.2 参数调试技巧
- 先调预测时域:从N=5开始,逐步增加到控制性能不再明显提升
- 再调权重系数:优先保证位置跟踪,再优化能量消耗
- 最后调约束范围:从宽松约束开始,逐步收紧至物理极限
5.3 典型问题排查
问题:航点切换时出现震荡
解决方法:
- 增加切换速度阈值vel_thresh
- 在代价函数中加大Δu的权重γ
- 检查参考轨迹是否平滑
问题:求解时间过长
优化方法:
- 减少预测时域N
- 使用热启动(复用上一周期解)
- 改为显式MPC
6. 实际应用建议
- 硬件在环测试时,建议加入0.02-0.05s的通信延迟补偿
- 室外飞行时,MPC的预测模型需要加入风扰估计项
- 对于计算资源受限的平台,可以考虑:
- 使用显式MPC
- 降阶模型
- 固定点运算优化
这个方案在农业植保无人机项目中实测效果良好,航点跟踪误差可控制在0.5m以内,比传统PID控制节能约15%。关键是要根据具体机型调整模型参数,建议先用系统辨识工具获取准确的动力学参数。
