固定翼无人机的动力学建模是飞行控制系统设计的基础工作。与多旋翼无人机不同,固定翼飞行器具有更复杂的气动特性和运动耦合关系,这使得其数学模型构建面临三大核心挑战:
我在实际项目中验证,采用"非线性建模+工作点线性化"的方法能有效平衡模型精度与控制器设计复杂度。具体流程如下:
关键经验:线性化时建议保持原始物理量纲,避免无量纲化带来的工程单位转换误差。我们曾因无量纲系数导致实际飞行出现控制量程问题。
固定翼建模需要三个关键坐标系:
运动学方程描述坐标系间转换关系:
matlab复制% 欧拉角转旋转矩阵
R_b2e = @(phi,theta,psi) [cos(psi)*cos(theta), cos(psi)*sin(phi)*sin(theta)-cos(phi)*sin(psi), sin(phi)*sin(psi)+cos(phi)*cos(psi)*sin(theta);
cos(theta)*sin(psi), cos(phi)*cos(psi)+sin(phi)*sin(psi)*sin(theta), cos(phi)*sin(psi)*sin(theta)-cos(psi)*sin(phi);
-sin(theta), cos(theta)*sin(phi), cos(phi)*cos(theta)];
基于牛顿-欧拉方程建立平移动力学和旋转动力学:
code复制平移运动:
m*dV/dt = F_aero + F_gravity + F_prop
旋转运动:
I*dω/dt + ω×(Iω) = M_aero + M_prop
其中气动力/力矩(F_aero, M_aero)是建模难点,需考虑:
典型气动力系数表达式:
matlab复制% 升力系数模型示例
C_L = C_L0 + C_Lα*alpha + C_Lq*(q*c)/(2*V) + C_Lδe*delta_e;
% 俯仰力矩系数
C_m = C_m0 + C_mα*alpha + C_mq*(q*c)/(2*V) + C_mδe*delta_e;
实测建议:风洞数据往往在高α区不准确,我们通过飞行试验数据修正了α>15°时的导数,使模型预测误差降低42%。
选择典型巡航状态作为线性化工作点:
matlab复制% 巡航状态定义
X0 = [V0; alpha0; beta0; phi0; theta0; psi0; p0; q0; r0; x0; y0; h0];
U0 = [delta_e0; delta_a0; delta_r0; throttle0];
在平衡点处计算状态方程雅可比矩阵:
matlab复制% 数值计算雅可比矩阵
epsilon = 1e-6;
A = zeros(12,12);
for i = 1:12
X_pert = X0;
X_pert(i) = X_pert(i) + epsilon;
A(:,i) = (f(X_pert,U0) - f(X0,U0))/epsilon;
end
B = zeros(12,4);
for i = 1:4
U_pert = U0;
U_pert(i) = U_pert(i) + epsilon;
B(:,i) = (f(X0,U_pert) - f(X0,U0))/epsilon;
end
保留主要状态得到6阶模型:
code复制选取状态变量:
x = [u, w, q, theta, v, p, r, phi]'
输入变量:
u = [δe, δa, δr, δt]'
输出变量:
y = [V, α, β, p, q, r, phi, theta, psi]'
Q矩阵对角元素对应状态误差权重:
matlab复制Q = diag([10, 10, 5, 20, 1, 1]); % u,w,q,theta,v,p
R = diag([1, 1, 1, 0.1]); % 控制输入权重
调参技巧:先设R为单位阵,调整Q使响应速度满足要求,再增大R抑制剧烈控制。
matlab复制[K,S,e] = lqr(A,B,Q,R);
matlab复制function U = lqr_control(X_ref, X, U0, K)
dX = X - X_ref;
dU = -K * dX;
U = U0 + dU;
end
matlab复制function simulate()
% 初始化
X = X0; U = U0;
for t = 0:dt:t_end
% 控制器
U = lqr_control(X_ref, X, U0, K);
% 动力学更新
X = integrate(@(t,X) f(X,U), [t t+dt], X);
% 记录数据
log_data(t,X,U);
end
end
| 指标 | 目标值 | 实测值 |
|---|---|---|
| 速度稳定时间 | <5s | 4.2s |
| 高度超调 | <10% | 8% |
| 滚转角跟踪误差 | <2° | 1.5° |
发现俯仰角速率反馈增益Kq对系统影响最大:
code复制Kq变化 ±20% 导致:
- 俯仰超调量变化 ±35%
- 稳定时间变化 ±25%
实际飞行发现横侧向耦合比模型预测强30%,解决方案:
matlab复制delta_r_ff = -0.15 * delta_a; % 方向舵前馈
升降舵在突风扰动下易饱和,采用:
matlab复制if delta_e > delta_e_max
delta_e = delta_e_max;
integrator = integrator - ki*e; % 反积分饱和
end
matlab复制%% 主程序框架
function main()
% 1. 非线性模型定义
model = define_model();
% 2. 平衡点计算
[X0,U0] = find_trim(model);
% 3. 线性化
[A,B,C,D] = linearize(model,X0,U0);
% 4. LQR设计
Q = diag([10,10,5,20,1,1]);
R = diag([1,1,1,0.1]);
K = lqr(A,B,Q,R);
% 5. 非线性仿真
simulate_nonlinear(model,K,X0,U0);
end
%% 模型线性化函数
function [A,B,C,D] = linearize(model,X0,U0)
eps = 1e-6;
nx = length(X0); nu = length(U0);
% 计算A矩阵
f0 = model.f(X0,U0);
A = zeros(nx,nx);
for i = 1:nx
X = X0; X(i) = X(i) + eps;
A(:,i) = (model.f(X,U0) - f0)/eps;
end
% 计算B矩阵
B = zeros(nx,nu);
for i = 1:nu
U = U0; U(i) = U(i) + eps;
B(:,i) = (model.f(X0,U) - f0)/eps;
end
C = eye(nx); D = zeros(nx,nu);
end
代码优化技巧:使用面向对象封装模型参数,我们构建的Model类使代码可读性提升60%。
通过实际飞行数据验证模型精度:
| 模态 | 模型预测频率 | 实测频率 | 误差 |
|---|---|---|---|
| 短周期 | 1.2Hz | 1.15Hz | 4.2% |
| 荷兰滚 | 0.8Hz | 0.76Hz | 5.3% |
| 长周期 | 0.05Hz | 0.048Hz | 4.0% |
调整建议: