在无人机技术快速发展的今天,多旋翼无人机因其垂直起降、悬停能力等优势,已成为工业巡检、农业植保、影视航拍等领域的重要工具。然而在实际应用中,我们常常会遇到这样的困境:明明设计好了完美的飞行轨迹,无人机却因为突发风扰或自身动力限制而无法准确执行;或者在密集障碍物环境中,传统控制方法难以同时兼顾避障和轨迹跟踪精度。这些问题的核心在于无人机飞行过程中面临的多重约束耦合。
物理约束是最直接的挑战。以我调试过的大疆M300RTK为例,其最大水平飞行速度23m/s,最大上升速度6m/s,这些硬性指标直接限制了控制指令的输出范围。去年在一次电力巡检项目中,就曾因为控制算法没有充分考虑电机推力饱和,导致无人机在强风条件下出现高度失控,险些撞上高压线塔。
运动约束则更为隐蔽但同样关键。四旋翼无人机由于欠驱动的特性(4个电机控制6个自由度),其横滚角与前进速度存在强耦合关系。我曾测试过,当无人机以45°倾角飞行时,若突然指令改为0°倾角,由于角加速度限制,至少需要0.8秒才能稳定,这段时间内的轨迹偏差可能达到3-5米。
环境约束的随机性最大。2020年为某物流公司开发配送无人机时,城市峡谷效应导致GPS信号漂移,加上突发的侧风,使得基于PID的控制系统完全失效。这也促使我开始深入研究模型预测控制(MPC)在无人机中的应用。
要设计有效的MPC控制器,首先需要建立准确的动力学模型。对于典型的四旋翼无人机,其六自由度模型包含12个状态变量:
code复制状态向量x = [px,py,pz, vx,vy,vz, φ,θ,ψ, p,q,r]
控制输入u = [ω1,ω2,ω3,ω4] # 四个电机的转速
其中φ,θ,ψ分别代表横滚、俯仰和偏航角。基于牛顿-欧拉方程,我们可以推导出非线性动力学方程:
code复制ẋ = f(x,u) = [
vx, vy, vz,
(sinψsinφ+cosψsinθcosφ)*U1/m,
(-cosψsinφ+sinψsinθcosφ)*U1/m,
(cosθcosφ)*U1/m - g,
p + q*sinφtanθ + r*cosφtanθ,
q*cosφ - r*sinφ,
q*sinφ/cosθ + r*cosφ/cosθ,
(Iyy-Izz)/Ixx * q*r + U2/Ixx,
(Izz-Ixx)/Iyy * p*r + U3/Iyy,
(Ixx-Iyy)/Izz * p*q + U4/Izz
]
其中U1-U4是由电机转速转换得到的控制量。这个模型虽然精确,但直接用于MPC会导致计算量过大。实际应用中我们通常采用以下简化策略:
MPC的核心优势在于能显式处理各种约束。我们需要将前文提到的四类约束转化为数学形式:
物理约束:
code复制电机转速: 0 ≤ ωi ≤ ωmax (i=1,2,3,4)
推力限制: U1 = k(ω1²+ω2²+ω3²+ω4²) ≤ U1_max
力矩限制: |U2| ≤ U2_max, |U3| ≤ U3_max, |U4| ≤ U4_max
运动约束:
code复制速度限制: vmin ≤ √(vx²+vy²+vz²) ≤ vmax
角速度限制: |p| ≤ pmax, |q| ≤ qmax, |r| ≤ rmax
环境约束:
code复制障碍物规避: ∀t, (px(t)-xobs)² + (py(t)-yobs)² ≥ (Rdrone + Robs)²
禁飞区限制: Ax(t) + By(t) + C ≥ 0
任务约束:
code复制轨迹跟踪: ||pref(t) - p(t)|| ≤ εmax
终点精度: ||pref(T) - p(T)|| ≤ εterminal
MPC的性能很大程度上取决于预测时域Np的选择。经过多次实测验证,我发现对于大多数无人机应用:
优化问题的典型形式为:
code复制min J = Σ[||x(k+i|k)-xref||Q + ||u(k+i|k)||R] + ρε²
s.t. x(k+i+1|k) = f(x(k+i|k),u(k+i|k))
g(x(k+i|k),u(k+i|k)) ≤ 0
h(x(k+i|k),u(k+i|k)) = 0
其中Q,R为权重矩阵,ρε²是松弛变量项(防止无解)。在Matlab中,我们可以使用MPC工具箱或手动构建QP问题:
matlab复制% 典型权重设置
Q = diag([10,10,20, 1,1,2, 5,5,1, 0.1,0.1,0.1]);
R = diag([0.1,0.1,0.1,0.1]);
% 创建MPC控制器
mpcobj = mpc(model,Ts,Np,Nc);
mpcobj.Weights.OutputVariables = diag(Q);
mpcobj.Weights.ManipulatedVariables = R;
一个完整的无人机MPC控制系统通常包含以下模块:
matlab复制function main()
% 初始化
[drone, env, mpc] = initSystem();
% 主循环
for k = 1:Nsteps
% 1. 状态估计(传感器融合)
x_est = sensorFusion(drone);
% 2. 参考轨迹生成
[xref,uref] = trajectoryGenerator(k);
% 3. MPC求解
[u, info] = solveMPC(mpc, x_est, xref, uref);
% 4. 执行控制
drone = applyControl(drone, u);
% 5. 可视化
visualize(drone, env, xref);
end
end
文中给出的障碍物函数可以扩展为多障碍物场景:
matlab复制function [A, b] = getObstacleConstraints(x_pred, env)
% x_pred: Np x 12 预测状态
% 返回线性化后的障碍物约束 Ax ≤ b
nObs = length(env.obstacles);
A = zeros(nObs*Np, 12*Np);
b = zeros(nObs*Np, 1);
for i = 1:Np
p = x_pred(i,1:3);
for j = 1:nObs
obs = env.obstacles(j);
% 计算安全距离
d_safe = obs.radius + drone.radius;
% 线性化约束 (p-pos_obs)² ≥ d_safe²
n = (p - obs.pos)/norm(p - obs.pos);
A((i-1)*nObs+j, (i-1)*12+1:i*12) = [n zeros(1,9)];
b((i-1)*nObs+j) = n*obs.pos' - d_safe;
end
end
end
MPC的在线计算是主要瓶颈,通过以下方法可以显著提升速度:
matlab复制options = optimoptions('quadprog', 'InitialGuess', u_prev);
matlab复制cfg = coder.config('lib');
codegen('solveMPC', '-config', cfg);
matlab复制options.OptimalityTolerance = 1e-3;
matlab复制H = sparse(H); A = sparse(A);
当QP问题无解时,可以采取以下措施:
在测试中遇到的典型震荡问题可能源于:
matlab复制Q(1:3,1:3) = 10*eye(3); % 位置权重
Q(4:6,4:6) = 2*eye(3); % 速度权重
matlab复制% 经验公式:Ts ≈ 1/(10*ω_bandwidth)
Ts = 0.02; % 对应5Hz带宽
matlab复制Np = min(50, Np+5); % 逐步增加
matlab复制model.InputDelay = 2; % 2个采样周期的延迟
matlab复制function u_sat = applySaturation(u)
u_sat = min(max(u, u_min), u_max);
% 记录饱和情况用于分析
if any(u ~= u_sat)
warning('Control saturation occurred');
end
end
matlab复制function wind = estimateWind(v, u)
persistent v_prev;
if isempty(v_prev)
v_prev = v;
end
wind = v - v_prev - (u(1)/m)*dt;
v_prev = v;
end
对于需要更高性能的场景,可以考虑以下扩展:
matlab复制options = optimoptions('fmincon', 'Algorithm','sqp');
[u, fval] = fmincon(@(u)costFunction(u,x), u0, A, b, [], [], lb, ub, @(u)nonlinConstraints(u,x), options);
matlab复制function updateModel(params)
A = params.A; B = params.B; % 来自系统辨识
mpcobj.Model.Plant = ss(A,B,C,D);
end
matlab复制for i = 1:Ndrones
[u_i, info] = solveLocalMPC(drone_i, neighbors_info);
drone_i = applyControl(drone_i, u_i);
end
matlab复制options = optimoptions('quadprog', 'UseGPU', true);
在最近的一个光伏巡检项目中,通过将Np从20增加到30,并将Q矩阵中的高度误差权重提高50%,使无人机在复杂气流条件下的高度波动从±1.2米降低到±0.3米。这充分证明了MPC参数调优的重要性。