资讯动态

基于最优控制的固定翼飞机着陆控制器设计:Matlab仿真与LQR/MPC调参实践

发布时间:2026/10/15 23:16:50 来源:尧图企业网站定制
简介这份资源面向具备自动控制理论与飞行力学基础的研究生、科研人员及工程技术人员聚焦固定翼飞机着陆阶段的动力学建模与最优控制策略设计解决下降轨迹、姿态角与速度等关键状态的精确控制问题为无人机、民航客机自动着陆系统研究提供可复现的实现范例。压缩包内共1个docx文件约81KB以文档形式完整呈现系统建模、性能指标设定、控制律推导及仿真结果分析等核心环节便于读者对照推导过程逐步理解LQR或MPC等最优控制方法在航空着陆场景中的落地思路。目前已有21人学习关注。读者可借此掌握着陆段动力学建模方法学习控制律设计与参数整定流程并通过复现Matlab代码观察扰动抑制与着陆精度变化加深对最优控制原理及其工程应用的理解。1. 从一次着陆仿真发散说起这套最优控制代码到底能干什么固定翼飞机的着陆阶段是飞控里最不给人留后悔药的十几秒。下滑角偏一点、拉平高度早一点、速度矢量跟机体轴对不齐轻则重着陆重则直接冲出跑道。很多做飞控的同行第一次接触着陆控制器都是在 Matlab 里搭一个纵向模型然后发现——升降舵和油门这两个输入要同时管住下沉率、俯仰角和速度手动凑 PID 参数基本是玄学。这套「基于最优控制的固定翼飞机着陆控制器设计研究」的 Matlab 代码解决的正是这个多输入多输出耦合问题它把着陆末端的纵向动力学写成状态空间形式用最优控制LQR / MPC 一类去解控制律让飞机沿着一条可设计的下滑轨迹平稳接地。适合谁做飞行力学课程设计的研究生、搞无人机自动着陆的工程师、以及想从 PID 过渡到现代控制的那批人。你不需要先成为气动专家但得能看懂状态方程愿意动手改参数。2. 着陆纵向动力学建模状态量怎么选、气动系数从哪来2.1 为什么着陆控制必须先做小扰动线性化固定翼飞机的六自由度方程是非线性的直接拿来做控制器设计Matlab 里跑起来又慢又难调。工程上的常见做法是在着陆下滑的平衡点附近做小扰动线性化把纵向运动速度、迎角、俯仰角、俯仰角速度、高度单独拎出来横向运动暂时解耦。这样得到的线性状态空间模型才能喂给 LQR 或 MPC 去解 Riccati 方程。代码里一般会先定义一个配平函数给定下滑角、速度和高度反解出配平迎角和升降舵偏角再在这个点上求雅可比矩阵。这一步如果配平没收敛后面所有控制律都是空中楼阁。% 纵向小扰动线性化在配平点求 A、B 矩阵 % state [dV, dalpha, dtheta, dq, dh] % input [dde, dth] 升降舵、油门 function [A, B] linearize_longitudinal(V0, alpha0, theta0, de0, th0) % 数值扰动步长太小会引入舍入误差太大会丢掉线性精度 eps_step 1e-5; x0 [V0; alpha0; theta0; 0; 0]; % 配平状态q 和 h 的扰动从零起 u0 [de0; th0]; n length(x0); m length(u0); A zeros(n, n); B zeros(n, m); f0 long_dynamics(x0, u0); for i 1:n dx zeros(n,1); dx(i) eps_step; A(:,i) (long_dynamics(x0dx, u0) - f0) / eps_step; end for j 1:m du zeros(m,1); du(j) eps_step; B(:,j) (long_dynamics(x0, u0du) - f0) / eps_step; end end这段代码的逻辑很直白对每个状态量和输入量分别加一个小扰动用中心差分这里为了简洁用了前向差分逼近偏导数。参数eps_step是关键1e-5 是个经验值气动系数里如果有查表插值步长太大插值误差会污染雅可比。long_dynamics是你自己写的纵向非线性动力学函数里面包含推力、阻力、升力和俯仰力矩的计算。注意h的扰动从零开始因为高度不影响气动力只影响输出方程。2.2 气动系数与推力模型别让升力线斜率背锅代码包里通常会带一组气动系数比如CL_alpha、CD0、Cm_q这些。很多新手直接抄教材上的值结果仿真出来的飞机要么抬头太猛要么下沉率压不住。血泪经验是着陆构型下襟翼放下升力线斜率会比干净构型高但失速迎角会降低。如果你用的系数是巡航构型的控制器会以为还有很大升力余量实际已经接近失速。常见做法是单独建一个着陆构型的气动文件把CL_max和失速迎角标清楚。推力模型也别偷懒油门到推力的滞后用一阶惯性环节近似时间常数取 0.5 到 1 秒否则 MPC 会算出理论上很漂亮但物理上根本来不及响应的油门指令。提示配平点的速度不要取太小。着陆参考速度一般是失速速度的 1.3 倍左右低于这个值线性化后的模型会非常敏感LQR 解出来的增益大得离谱。3. 最优控制律落地LQR 权重怎么调、MPC 预测时域怎么设3.1 LQR 的 Q 和 R不是玄学是量纲博弈LQR 的目标函数是J ∫(xQx uRu)dtQ 和 R 的选取直接决定控制器的性格。Q 大状态收敛快但舵面动作猛R 大舵面柔和但跟踪慢。很多教程只告诉你「调参」却不告诉你量纲。高度误差的单位是米俯仰角误差的单位是弧度两者在 Q 矩阵里的对角元如果都取 1实际上等于告诉控制器「1 米的高度误差和 1 弧度的姿态误差同等重要」——这显然不合理。我一般会先把状态量归一化高度误差除以期望的下沉率尺度角度误差除以 5 度对应的弧度值这样 Q 的对角元才有可比性。% LQR 控制器设计归一化后的权重矩阵 % 状态顺序 [dV, dalpha, dtheta, dq, dh] % 归一化尺度速度 5 m/s迎角 5 deg俯仰角 5 deg俯仰角速度 10 deg/s高度 10 m scale [5, deg2rad(5), deg2rad(5), deg2rad(10), 10]; % 归一化后的 Q高度和俯仰角权重给大速度权重适中 Q_norm diag([1, 1, 5, 1, 10]); Q diag(1./scale.^2) * Q_norm; % 反归一化回物理量 % R升降舵和油门的控制代价升降舵便宜一点油门贵一点 R diag([1, 2]); % 求解 Riccati 方程得到最优增益 [K, S, e] lqr(A, B, Q, R); % 检查闭环极点确保都在左半平面且阻尼比合适 disp(闭环极点); disp(e);这段代码的核心在Q diag(1./scale.^2) * Q_norm这一行。它先把物理量误差换算成归一化误差再乘上你想要的相对权重最后变回物理量空间。这样你调Q_norm的时候心里想的是「高度误差比速度误差重要 10 倍」而不是「高度那一项填 10 还是 100」。R矩阵的对角元反映执行机构的代价油门通常比升降舵贵因为发动机响应慢、油耗也敏感。解完 LQR 一定要看闭环极点e如果出现正实部或者阻尼比低于 0.3 的复极点说明权重给得太激进飞机会有明显的振荡。3.2 MPC 版本预测时域和控制时域怎么配如果代码包里带的是 MPC 版本那核心参数就变成预测时域Np和控制时域Nc。着陆阶段建议Np覆盖 3 到 5 秒的物理过程按 0.1 秒采样算就是 30 到 50 步。Nc一般取Np的 1/5 到 1/3太短控制自由度不够太长计算量上去且对模型误差更敏感。约束方面升降舵偏角限幅、油门范围、俯仰角安全边界都要写成硬约束否则 MPC 会算出物理上不可达的解。常见坑是约束加得太紧MPC 在扰动下直接无解这时候要么放松约束要么加松弛变量。% MPC 参数设置预测时域、控制时域、约束 Np 40; % 预测时域4 秒 0.1s 采样 Nc 10; % 控制时域 Ts 0.1; % 采样时间 % 输入约束升降舵 ±25 deg油门 0~1 de_min deg2rad(-25); de_max deg2rad(25); th_min 0; th_max 1; % 状态约束俯仰角在下滑阶段保持在 -5~10 deg theta_min deg2rad(-5); theta_max deg2rad(10); % 构建 MPC 对象以 Matlab MPC Toolbox 为例 mpc_obj mpc(ss(A,B,C,D), Ts, Np, Nc); mpc_obj.ManipulatedVariables(1).Min de_min; mpc_obj.ManipulatedVariables(1).Max de_max; mpc_obj.ManipulatedVariables(2).Min th_min; mpc_obj.ManipulatedVariables(2).Max th_max; mpc_obj.OutputVariables(3).Min theta_min; % 假设第 3 个输出是俯仰角 mpc_obj.OutputVariables(3).Max theta_max;Np和Nc的选取没有绝对公式但有个经验Np要至少覆盖系统主要时间常数。着陆纵向的短周期模态周期大概 2 到 3 秒所以Np取 30 到 50 步是合理的。Nc太小会导致控制量在预测时域内变化不够灵活太大则计算量飙升且容易激发模型未建模动态。约束那块俯仰角下限设 -5 度是为了防止机头过度下压导致螺旋桨或发动机擦地上限 10 度是防止拉平过高引发失速。这些数字要根据你实际机型的几何参数调整不能照搬。4. 仿真验证与排错下滑轨迹、拉平段和接地瞬间怎么看4.1 下滑轨迹跟踪别只看高度曲线跑完仿真很多人第一眼只看高度曲线是不是平滑下降。但着陆质量的核心指标是下沉率和接地速度。下滑段下沉率应该稳定在 2 到 3 米每秒具体看机型拉平段下沉率要逐渐收敛到 0.5 米每秒以内。如果高度曲线很漂亮但下沉率在接地前突然变大说明拉平控制律没起作用飞机是「砸」在跑道上的。代码里一般会输出h、dh/dt、theta、de这几条曲线我习惯把它们画在一个子图里对齐时间轴看。俯仰角在拉平段应该有一个缓慢的抬头过程升降舵先上偏后回中如果升降舵一直在限幅值附近抖动说明 LQR 的 R 矩阵给得太小或者模型有误。4.2 常见报错与数值问题Matlab 跑最优控制仿真最常见的报错是lqr求解失败提示A-BK有正实部极点或者R矩阵非正定。前者通常是Q和R的量纲差了几个数量级后者多半是R矩阵写成了非对角或者负定。另一个高频问题是仿真步长太大ode45在拉平段直接发散。着陆末端的动力学变化快固定步长建议不超过 0.01 秒变步长要把RelTol和AbsTol收紧到 1e-6 以下。如果用的是 MPC还要注意mpc_obj的Weights设置输出权重和输入权重的比例跟 LQR 的 Q/R 是一个道理别一个给 1 一个给 1000。注意仿真里如果出现高度低于跑道平面还在继续下降先检查输出方程的高度符号定义。很多代码把向下为正和向上为正搞混导致控制器以为自己在爬升。5. 避坑与排查着陆控制器调参的五个翻车现场现象一仿真一开始飞机就抬头失速。原因通常是配平点没算对或者线性化时用的速度太低。解决方法是先单独跑配平脚本确认配平迎角在合理范围比如 4 到 8 度再检查linearize_longitudinal里的V0是不是着陆参考速度。现象二下滑轨迹跟踪很好但接地瞬间下沉率超标。这是拉平段控制律没设计好常见于只用 LQR 跟踪高度、没有单独处理下沉率的情况。解决方法是把下沉率作为一个加权输出或者在拉平段切换一套专门的增益。代码包里如果有flare模式检查切换高度是不是设得太低。现象三升降舵一直在正负限幅之间振荡。说明控制增益过大通常是Q里角度权重给太高或者R里升降舵代价给太低。先把R(1,1)增大 5 到 10 倍看振荡是否减弱。如果减弱了但跟踪变慢再微调Q里的高度权重。现象四MPC 求解时间超过采样周期。预测时域Np太长或者约束太多。先把Np降到 20 试试如果求解时间还是超检查有没有把非线性动力学直接塞进 MPC 的预测模型里——线性 MPC 只能用线性模型非线性部分要么线性化要么换 NMPC 但那是另一个量级的计算量。现象五换了一组气动系数后仿真直接发散。气动系数变了配平点也变了但代码里的x0和u0还是旧值。每次换气动数据必须重新跑配平把新的V0、alpha0、de0、th0更新到线性化和控制器初始化脚本里。这个坑我踩过不止一次后来养成了习惯气动文件一改配平脚本强制先跑一遍。6. 进阶技巧用增益调度把着陆全过程串起来着陆不是单一工况从下滑到拉平再到接地速度和姿态都在变。一套固定增益的 LQR 很难在全过程都表现良好常见做法是增益调度按高度或者速度把着陆过程分成几段每段单独配平、单独设计 LQR仿真时根据当前状态插值增益。代码包里如果只给了一套增益你可以自己扩展。具体做法是选三个调度点下滑段高度 50 米以上、拉平段10 到 50 米、接地段10 米以下分别求K1、K2、K3然后用高度做线性插值。% 增益调度按高度插值 LQR 增益 % 假设已经求得三个调度点的增益 K1、K2、K3 % 对应高度 h1100, h230, h35 function K schedule_gain(h, K1, K2, K3, h1, h2, h3) if h h1 K K1; elseif h h2 alpha (h - h2) / (h1 - h2); K alpha * K1 (1 - alpha) * K2; elseif h h3 alpha (h - h3) / (h2 - h3); K alpha * K2 (1 - alpha) * K3; else K K3; end end这段插值逻辑很朴素但效果立竿见影。下滑段用K1保证轨迹跟踪精度拉平段用K2兼顾下沉率收敛接地段用K3让舵面动作柔和。插值区间之间用线性过渡避免增益突变引起舵面跳变。验证方法是把调度后的仿真曲线和单增益曲线叠在一起看重点看拉平段的下沉率有没有更平滑地收敛。如果插值后出现局部振荡说明两个调度点的增益差异太大可以在中间再加一个调度点。从那以后我每次做着陆控制器都强制先跑配平、再看极点、最后才看轨迹曲线顺序反了就是给自己挖坑。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑