简介:这份资源面向固定翼无人机飞控开发者与航空院校学生,聚焦着陆阶段的纵向控制问题,提供从动力学建模到Simulink仿真的完整工程实现。包内共8个文件,以4个m脚本、2个mdl与2个slx模型为主,压缩包约70KB,体积轻便却覆盖了纵向ABCD状态空间建模、着陆路径规划、高度跟踪与PID控制器设计等核心环节。其中脚本文件负责定义无人机下降过程中的速度、高度动态模型并计算安全着陆轨迹,Simulink模型则搭建了着陆控制与高度跟踪的图形化系统,便于调试与参数整定。已有2069人学习下载,适合希望理解PID在着陆纵向通道中应用、并借助仿真验证控制策略的读者参考,可据此复现建模流程、分析轨迹规划思路并优化控制器响应性能。
1. 固定翼着陆为什么总在最后三米翻车
固定翼无人机着陆,飞控圈里有个说法叫“最后三米玄学”——巡航段稳如老狗,一进拉平就各种飘、跳、砸。做过固定翼着陆纵向控制的人都知道,问题不在飞控硬件,而在纵向通道的拉平轨迹设计和速度-俯仰耦合没解干净。这套方案要解决的,就是固定翼从进场到触地的纵向控制问题:下滑道跟踪、拉平轨迹生成、俯仰姿态保持、油门-升降舵协调,四个环节串成一条完整的控制链。适合正在做飞控毕设、课程设计,或者要交付一套固定翼着陆控制方案的工程师参考。整套方案基于PID框架搭建,不依赖复杂非线性控制理论,用经典方法把着陆纵向通道做扎实。
2. 需求拆解与控制方案选型:从进场到触地的纵向通道怎么分
2.1 着陆纵向控制到底要控什么
固定翼着陆纵向控制的核心任务,是在纵向平面内让飞机沿预定下滑道下降,在拉平段平滑减小下降率,最终以可控的俯仰姿态和垂速触地。拆开来看,纵向通道要同时管三件事:高度(或下滑道偏差)、速度(通过油门)、俯仰姿态(通过升降舵)。这三者之间存在强耦合——拉杆抬头会减速,推油门加速会带来抬头力矩,速度变化又反过来影响升力进而影响高度。
通常的做法是把纵向通道拆成两个回路:外回路管高度/下滑道,输出俯仰角指令;内回路管俯仰角,输出升降舵偏度。速度通道独立走油门控制,用速度偏差驱动油门。这样解耦之后,每个回路的PID参数可以独立整定,不至于一改油门就把俯仰振荡带出来。
需求上还要明确几个边界条件:进场高度和速度、下滑道角度(通常3°到6°)、拉平起始高度(一般15m到30m)、触地垂速上限(通常要求小于1.5m/s)、触地俯仰角范围。这些参数不提前定好,后面PID整定就是盲调。
2.2 为什么选PID而不是LQR或MPC
PID在这个场景下的优势很直接:计算量小、参数物理意义明确、调试过程可解释。LQR需要精确的纵向线性模型,而固定翼在低速着陆段的气动参数非线性明显,模型误差一大,LQR的鲁棒性反而不如PID。MPC更不用说了,机载算力根本跑不动。
但PID也不是万能的。固定翼着陆纵向通道的PID整定有个血泪经验:俯仰角内环的微分项不能给太大,否则升降舵高频抖动,舵机很快就发热。通常的做法是内环用PD(比例+微分),外环用PI(比例+积分),速度通道用PI。积分项的作用是消除稳态误差,但积分限幅一定要做,不然拉平段积分饱和,触地前会突然掉高度。
2.3 控制模式划分与切换逻辑
整个着陆过程分四个模式:下滑道跟踪、拉平过渡、拉平保持、触地滑跑。下滑道跟踪段,外回路跟踪下滑道偏差,输出俯仰角指令;拉平过渡段,从下滑道跟踪平滑切换到拉平轨迹跟踪,切换点通常在拉平起始高度;拉平保持段,跟踪指数拉平轨迹,俯仰角指令逐渐减小;触地段,油门收怠速,俯仰角保持小角度抬头。
模式切换是着陆纵向控制最容易翻车的地方。切换瞬间如果指令跳变,飞机会猛抬头或猛低头。通常的做法是在切换点做指令渐变,用一阶滤波器把切换前后的指令平滑过渡,时间常数取0.5s到1s。
# 模式切换时的指令平滑处理 class CommandSmoother: def __init__(self, tau=0.8): self.tau = tau # 一阶滤波时间常数,单位秒 self.prev_cmd = 0.0 # 上一周期平滑后的指令 def update(self, raw_cmd, dt): # 一阶低通滤波,避免模式切换时指令跳变 alpha = dt / (self.tau + dt) smooth_cmd = alpha * raw_cmd + (1 - alpha) * self.prev_cmd self.prev_cmd = smooth_cmd return smooth_cmd这段代码的作用是在模式切换时对俯仰角指令做一阶低通滤波。tau越大,过渡越平滑但响应越慢;tau越小,响应快但可能引入抖动。着陆场景下通常取0.5到1.0秒,具体看飞机质量和进场速度。dt是飞控周期,固定翼飞控一般跑50Hz到100Hz,对应dt为0.02s到0.01s。
3. 纵向控制律设计与参数整定:外回路、内回路、速度通道
3.1 下滑道跟踪外回路设计
下滑道跟踪外回路的输入是下滑道偏差(实际高度与下滑道高度的差),输出是俯仰角指令。控制律用PI:
# 下滑道跟踪外回路PI控制器 class GlidePathController: def __init__(self, kp=0.08, ki=0.005, limit=15.0): self.kp = kp # 比例增益,单位:度/米 self.ki = ki # 积分增益,单位:度/(米·秒) self.limit = limit # 俯仰角指令限幅,单位:度 self.integral = 0.0 def update(self, height_error, dt): # 积分项累加并限幅,防止积分饱和 self.integral += height_error * dt self.integral = max(-self.limit/self.ki, min(self.limit/self.ki, self.integral)) # PI输出俯仰角指令 pitch_cmd = self.kp * height_error + self.ki * self.integral # 输出限幅,避免指令过大导致飞机猛抬头 pitch_cmd = max(-self.limit, min(self.limit, pitch_cmd)) return pitch_cmdkp的物理含义是:高度偏差1米对应多少度俯仰角指令。这个值不能太大,否则下滑道跟踪会振荡;也不能太小,否则跟踪不上下滑道。通常从0.05开始试,逐步加到0.1左右。ki用来消除稳态偏差,但给大了会在拉平段积分饱和,触地前掉高度。limit一般取10°到15°,限制最大俯仰角指令。
3.2 俯仰角内回路设计
内回路跟踪外回路给出的俯仰角指令,输出升降舵偏度。用PD控制:
# 俯仰角内回路PD控制器 class PitchController: def __init__(self, kp=1.2, kd=0.15, limit=25.0): self.kp = kp # 比例增益,单位:度舵面/度俯仰角 self.kd = kd # 微分增益,单位:度舵面/(度/秒) self.limit = limit # 升降舵偏度限幅,单位:度 self.prev_error = 0.0 def update(self, pitch_cmd, pitch_actual, dt): error = pitch_cmd - pitch_actual # 微分项用误差差分近似,注意dt不能太小否则噪声放大 d_error = (error - self.prev_error) / dt self.prev_error = error # PD输出升降舵偏度 elevator = self.kp * error + self.kd * d_error # 舵面限幅,保护舵机 elevator = max(-self.limit, min(self.limit, elevator)) return elevatorkp决定俯仰角跟踪的刚度,给大了会振荡,给小了跟踪慢。kd抑制超调,但固定翼的俯仰角速率信号通常有噪声,kd给大了舵面会抖。通常的做法是对俯仰角速率做低通滤波后再用,截止频率取5Hz到10Hz。limit根据舵机行程和飞机气动特性定,一般不超过25°。
3.3 速度通道油门控制
速度通道用PI控制油门,输入是速度偏差,输出是油门指令:
# 速度通道PI控制器 class SpeedController: def __init__(self, kp=0.5, ki=0.08, limit=1.0): self.kp = kp # 比例增益,单位:油门/(米/秒) self.ki = ki # 积分增益 self.limit = limit # 油门限幅,0到1 self.integral = 0.0 def update(self, speed_cmd, speed_actual, dt): error = speed_cmd - speed_actual self.integral += error * dt # 积分限幅,防止油门积分饱和 self.integral = max(-self.limit/self.ki, min(self.limit/self.ki, self.integral)) throttle = self.kp * error + self.ki * self.integral throttle = max(0.0, min(self.limit, throttle)) return throttle速度通道的响应不能太快,否则油门变化剧烈会影响俯仰通道。kp通常取0.3到0.8,ki取0.05到0.1。拉平段速度指令一般比进场速度略小,但也不能太小,否则失速裕度不够。
3.4 拉平轨迹生成与跟踪
拉平轨迹通常用指数曲线:h(t) = h0 * exp(-t/tau),其中h0是拉平起始高度,tau是时间常数。拉平起始高度一般取15m到30m,tau取2s到4s。拉平轨迹的下降率在触地时趋近于零,但实际触地垂速不可能为零,通常控制在0.5m/s到1.5m/s。
# 指数拉平轨迹生成 import math class FlareTrajectory: def __init__(self, h0=20.0, tau=3.0, h_flare=0.5): self.h0 = h0 # 拉平起始高度,单位:米 self.tau = tau # 时间常数,单位:秒 self.h_flare = h_flare # 触地判定高度,单位:米 self.t = 0.0 def update(self, dt): self.t += dt # 指数拉平轨迹:高度随时间指数衰减 h_cmd = self.h0 * math.exp(-self.t / self.tau) # 下降率指令:对高度求导 h_dot_cmd = -(self.h0 / self.tau) * math.exp(-self.t / self.tau) return h_cmd, h_dot_cmdh0和tau的选取直接影响触地垂速。h0越大、tau越小,拉平越陡,触地垂速越大。通常的做法是先定h0(根据飞机下沉特性),再调tau让触地垂速落在0.5到1.5m/s之间。拉平轨迹跟踪用高度偏差驱动俯仰角指令,和下滑道跟踪共用外回路PI,但参数要单独整定。
4. 避坑与常见问题排查:着陆纵向控制里最容易翻车的五个点
4.1 拉平段掉高度:积分饱和在作怪
现象:飞机进入拉平段后,高度先跟得很好,但触地前突然掉高度,垂速超标。
原因:下滑道跟踪段的积分项在拉平段还在累加,拉平段高度偏差符号变化后,积分项需要时间退出饱和,导致俯仰角指令响应滞后。
解决:在模式切换到拉平时,把外回路积分项清零或限幅到较小值。通常的做法是在拉平过渡段把积分增益暂时降为零,等拉平稳定后再恢复。
4.2 俯仰振荡:微分项噪声放大
现象:俯仰角跟踪过程中出现高频振荡,升降舵持续抖动,舵机发热明显。
原因:俯仰角速率信号噪声大,微分项把噪声放大了。固定翼的俯仰角速率通常来自陀螺仪,低频振动和传感器噪声都会串进来。
解决:对俯仰角速率做低通滤波,截止频率取5Hz到10Hz。如果还振,把微分增益降一半再试。实在不行就只用比例控制,牺牲一点动态性能换稳定性。
4.3 触地弹跳:拉平轨迹太陡或触地判定太早
现象:飞机触地后弹起来,然后再掉下去,严重时损坏起落架。
原因:拉平轨迹下降率在触地时还比较大,或者触地判定高度设高了,飞机还没真正接地就切了触地模式。
解决:增大拉平时间常数tau,让下降率在触地前充分衰减。触地判定高度通常取0.3m到0.5m,结合无线电高度表和加速度计综合判断。触地后油门立即收怠速,俯仰角保持小角度抬头,不要急着推杆。
4.4 速度通道和俯仰通道打架
现象:速度跟踪和高度跟踪互相干扰,推油门加速时飞机抬头,拉杆抬头时速度掉得快。
原因:固定翼的油门和升降舵之间存在气动耦合,速度变化会影响升力,俯仰变化会影响阻力。两个通道的PID参数如果都整得比较激进,就会互相激发振荡。
解决:速度通道的带宽要明显低于俯仰通道,通常速度通道的响应时间常数取俯仰通道的3到5倍。整定时先整俯仰通道,再整速度通道,最后联调。联调时如果发现耦合振荡,先把速度通道的kp降20%再试。
4.5 模式切换时指令跳变
现象:下滑道跟踪切拉平时,飞机猛抬头或猛低头,乘客(如果有)会很不舒服。
原因:两个模式的俯仰角指令在切换瞬间不连续,或者切换逻辑里没有做指令平滑。
解决:在切换点用一阶滤波器做指令渐变,时间常数取0.5s到1s。同时确保切换前后的指令值在切换点附近,不要差太多。如果差得多,说明两个模式的配平点不一致,需要先调配平。
5. 仿真验证与试飞验收:怎么证明这套纵向控制真的能用
5.1 仿真环境搭建与测试用例设计
仿真验证分三步:先做纵向通道的线性模型仿真,验证PID参数的基本响应;再做非线性六自由度仿真,验证模式切换和拉平轨迹;最后做蒙特卡洛仿真,拉偏初始高度、速度、风干扰,看触地垂速和俯仰角的分布。
测试用例至少覆盖:正常进场着陆、拉平起始高度偏高/偏低、进场速度偏大/偏小、下滑道角度偏大/偏小、触地前有阵风。每个用例跑20次以上,统计触地垂速的均值和标准差。触地垂速均值控制在1.0m/s以内,标准差不超过0.3m/s,基本就稳了。
5.2 试飞验收检查单
试飞验收按阶段来:先做高空下滑道跟踪试飞,不拉平,验证外回路和内回路的跟踪精度;再做拉平段试飞,从拉平起始高度开始,验证拉平轨迹跟踪和触地垂速;最后做全流程着陆试飞。
检查单上必须有的项:下滑道偏差最大值、俯仰角跟踪误差最大值、触地垂速、触地俯仰角、触地速度、模式切换瞬间的俯仰角跳变量。触地垂速超过1.5m/s就判不合格,模式切换俯仰角跳变超过3°也要查原因。
| 验收项 | 合格标准 | 测试方法 |
|---|---|---|
| 下滑道偏差 | 小于5m | 下滑道跟踪试飞 |
| 俯仰角跟踪误差 | 小于3° | 全流程试飞 |
| 触地垂速 | 小于1.5m/s | 拉平段试飞 |
| 触地俯仰角 | 5°到12° | 全流程试飞 |
| 模式切换跳变 | 小于3° | 全流程试飞 |
5.3 答辩时怎么讲清楚这套方案
答辩讲这套纵向控制,重点讲三件事:为什么选PID、模式怎么分、参数怎么整。为什么选PID,讲计算量和可解释性,别扯太多理论。模式怎么分,画一张状态机图,把四个模式和切换条件标清楚。参数怎么整,讲整定顺序和每个参数的作用,最好带一张参数表。
评委最容易问的问题是:拉平段积分饱和怎么处理?模式切换跳变怎么抑制?触地垂速怎么保证?这三个问题前面避坑章节都覆盖了,答辩前把这几段背熟。还有评委可能会问为什么不用LQR或MPC,回答就一句话:机载算力不够,PID够用。
从那以后我每次做着陆纵向控制,都强制走一遍仿真到试飞的完整验证流程,不敢跳步。希望帮到你。
本文还有配套的精品资源,点击获取