1. 项目背景与核心挑战
固定翼无人机在航拍、测绘、巡检等领域应用广泛,其轨迹跟踪精度直接影响任务效果。传统PID控制面对复杂气流扰动时,往往出现超调大、收敛慢的问题。我们团队在农业植保项目中就遇到过这种情况——无人机在侧风条件下喷洒农药,轨迹偏差导致重喷漏喷,直接影响作业质量。
指数预定义时间控制(Prescribed-Time Control)是近年兴起的新型控制策略,它能在严格预设时间内完成收敛,不受初始状态影响。这项技术特别适合无人机起降、航点切换等对时间有严格要求的场景。但现有研究多集中在理论层面,实际工程应用面临两个关键难题:
- 如何在存在持续外界干扰(如阵风)时保证预设时间收敛?
- 怎样实现观测器与控制器的协同设计,避免参数耦合?
2. 控制系统架构设计
2.1 整体控制回路
我们采用双闭环结构:
code复制[轨迹指令] → [预定义时间控制器] → [无人机动力学] → [固定时间观测器] → [干扰补偿]
↑ ↓
└─────[状态反馈]───────┘
核心创新点在于:
- 前向通道采用改进的指数时变增益控制器
- 反馈通道嵌入新型固定时间干扰观测器(FxTDO)
- 两者通过Lyapunov函数严格证明稳定性
2.2 预定义时间控制器设计
传统时变增益控制律:
code复制u(t) = -k(t) * e(t)
k(t) = k0 / (T - t)^α
存在的问题:t→T时增益k(t)→∞,实际无法实现
我们的改进方案:
matlab复制% 时变增益计算(避免无穷大)
function k = time_varying_gain(t,T)
t_sat = min(t, 0.95*T); % 增益饱和处理
k = k0 / (T - t_sat)^α + k1; % 添加偏置项
end
关键参数选择原则:
- k0:根据最大允许控制量反推
- T:预设时间,通常取2~3倍系统自然周期
- α:0.5~1之间,过大易引发震荡
2.3 固定时间干扰观测器
采用二阶滑模观测器结构:
matlab复制% FxTDO核心算法
function d_hat = fxdo(x, u)
persistent z1 z2
e = x - z1;
z1_dot = z2 + l1*sig(e,0.5);
z2_dot = f(x) + g(x)*u + l2*sig(e,0.25);
d_hat = z2;
end
function y = sig(x,a)
y = abs(x)^a * sign(x);
end
参数整定经验:
- l1, l2:按干扰频率的2~3倍选取
- 幂次参数:0.25~0.75保证固定时间收敛
- 实测表明该观测器在5m/s突风下能在0.8s内准确估计干扰
3. Matlab实现关键代码
3.1 无人机模型建立
采用经典六自由度非线性模型:
matlab复制function dx = drone_model(t,x,u,d)
% 状态变量: [u v w p q r x y z phi theta psi]
V = norm(x(1:3));
rho = 1.225;
% 气动力计算
[CL,CD] = aero_coeff(x(10),x(11),V);
L = 0.5*rho*V^2*S*CL;
D = 0.5*rho*V^2*S*CD;
% 动力学方程
dx(1:3) = cross(x(4:6),x(1:3)) + [0;0;-g] + R(x(10),x(11))*(u(1)/m*[0;0;1]) - [D;0;0]/m + d;
dx(4:6) = J\(cross(x(4:6),J*x(4:6)) + u(2:4));
dx(7:9) = R(x(10),x(11))'*x(1:3);
dx(10:12) = E(x(10),x(11))*x(4:6);
end
注意:实际实现时需要处理欧拉角奇点问题,建议改用四元数表示姿态
3.2 控制器核心实现
matlab复制function u = controller(t,x,xd,T)
% 误差计算
e_pos = x(7:9) - xd(1:3);
e_vel = x(1:3) - xd(4:6);
% 时变增益计算
kp = 10/(T-t)^0.8 + 0.5;
kd = 8/(T-t)^0.6 + 0.3;
% 控制律
u_acc = -kp.*sig(e_pos,0.9) - kd.*sig(e_vel,0.95);
u(1) = m*norm(u_acc + [0;0;g]);
% 姿态控制部分省略...
end
3.3 联合仿真测试框架
matlab复制% 主仿真循环
for k = 1:N
t = k*dt;
% 获取当前状态
x = X(:,k);
% 生成干扰(模拟阵风)
d = wind_model(t);
% 观测器估计干扰
d_hat = fxdo(x, u_prev);
% 控制器计算
u = controller(t, x, xd, T);
% 应用控制量
X(:,k+1) = rk4(@(t,x)drone_model(t,x,u-d_hat,d), t, x, dt);
end
4. 实测效果与参数整定
4.1 典型测试场景
我们在Simulink中构建了三个验证场景:
-
阶跃响应测试
- 初始偏差:位置10m,速度2m/s
- 预设时间:T=5s
- 结果:4.92s达到稳态,无超调
-
正弦轨迹跟踪
- 参考轨迹:振幅15m,频率0.2Hz
- 加入3m/s随机风扰
- 跟踪误差:<0.3m(RMS)
-
航点切换测试
- 连续5个航点,间距50m
- 每个航段严格3s完成切换
- 时间误差:<0.05s
4.2 参数敏感性分析
通过蒙特卡洛实验得出关键影响参数:
| 参数 | 允许范围 | 最优值 | 影响规律 |
|---|---|---|---|
| k0 | 5~20 | 12 | 过大导致控制量饱和 |
| α | 0.5~1.2 | 0.8 | 影响收敛速度与平滑度 |
| l1 | 3~15 | 8 | 决定观测器收敛速度 |
| T | 1.5~3τ | 2.2τ | τ为系统自然周期 |
实操技巧:建议先用线性模型确定参数范围,再通过非线性仿真微调
5. 工程实现中的坑与经验
5.1 实际飞行测试发现的问题
-
计算延时问题
- 理论设计未考虑计算耗时
- 解决方案:在时变增益中引入延时补偿项
matlab复制k_comp = k0 / (T - t - 0.02)^α % 补偿20ms计算延迟 -
执行器饱和
- 大增益导致舵机达到限幅
- 改进方法:增加动态限幅模块
matlab复制u_sat = min(max(u, -umax), umax); -
传感器噪声放大
- 时变增益会放大测量噪声
- 应对措施:在误差计算前加二阶滤波器
matlab复制e_filt = tf([1],[0.02^2 2*0.7*0.02 1]) * e_raw;
5.2 与其他控制方法的对比
我们在同一无人机平台上对比了三种方法:
| 指标 | PID | LQR | 本方法 |
|---|---|---|---|
| 收敛时间(s) | 6.2 | 4.8 | 3.0(预设) |
| 超调量(%) | 15 | 8 | <1 |
| 抗扰能力(m) | 1.2 | 0.8 | 0.3 |
| 计算负荷(ms) | 0.5 | 1.2 | 2.1 |
虽然计算量增加约3倍,但在需要精确时间控制的场景(如编队飞行、自主起降)中优势明显。
6. 扩展应用与改进方向
当前系统在以下场景表现优异:
- 精确时间要求的航点切换
- 抗突发风扰的稳定飞行
- 多机协同的同步控制
下一步改进计划:
- 结合深度学习预测干扰
- 开发参数自适应调整算法
- 移植到PX4等开源飞控
实测中发现一个有趣现象:当预设时间T小于系统物理极限时,控制器会自动进入"尽力模式"而非发散,这种特性在应急规避场景很有价值。我们正在深入研究这种非线性行为的机理。