一台无人机起飞时突然侧翻、一架固定翼在爬升时进入螺旋、一个新手调PID时怎么调都振荡——这些事故背后,几乎都能归结到同一块短板:飞行控制理论的基础没打牢。很多人觉得“理论基础”只是考试要背的名词解释,但当你真正进入飞控开发、飞行器系统设计,甚至只是玩开源飞控想调明白参数时,就会发现坐标系、运动方程、姿态误差这些概念每天都在和你打交道。飞行控制属于典型的交叉学科,自动控制原理、空气动力学、导航制导与传感技术全部拧在一起,缺一个环节,整个系统就转不动。
这篇文章我想把第6章“飞行控制理论基础”拆开揉碎,从系统骨架、物理模型、控制律设计到仿真调试,完整梳理一套从理论到实操的路线。不管你是自动化专业的学生、刚转行做无人机开发的工程师,还是自己折腾飞控的极客,这篇文章都会给你一条清晰的进阶路径。我会尽量用实际的工程视角来讲,很多内容是你翻开课本看不到的,比如为什么PID在飞控里“万年不倒”、调参时为什么必须先内环后外环、四元数算姿态误差时“负号”写错会怎样翻机。准备好,我们从最基础的闭环控制开始。
1. 飞行控制到底在控制什么:一个系统的骨架
1.1 闭环控制是飞行控制的本能逻辑
飞行控制的本质,是让飞行器的实际运动状态去跟随期望状态。你希望它平飞,它就得保持高度和航向;你希望它滚转45度,它就得精确停在那个角度。这件事听起来简单,但现实中靠“开环”几乎做不到。原因有三点:第一,飞行器自身动力模型高度非线性,油门和升力之间的关系不是线性的,速度一变特性就变;第二,外部环境扰动无处不在,阵风、温度密度变化、气动参数偏差,都会让实际响应偏离计算值;第三,执行机构有延迟和饱和,舵机有死区,电机响应有滞后,这些误差会不断累积。
所以飞行控制系统必须是闭环的。典型的结构是“传感器感知状态-控制器计算指令-执行机构产生力矩/推力-飞行器改变运动状态-传感器再感知”这样一个循环。以小型多旋翼为例,IMU里的陀螺仪和加速度计给出角速度和姿态角,飞控主控芯片里的控制算法根据遥控指令或导航模块的期望值,算出一组PWM信号给电调,电机转速变化产生力矩差,飞行器姿态改变,IMU再次测量,整个环路以几百赫兹的频率持续运行。这个环路每秒转几百圈,任何一环出问题,系统就会发散。
可以用开车来类比:你眼睛看路是传感器,大脑判断方向盘该打多少是控制器,双手打方向盘是执行机构,车跑起来后路况反馈回眼睛,构成闭环。如果你闭着眼开车,哪怕只开10秒,大概率都会偏离车道。飞行器的状态变化更快、维度更多、耦合更强,所以飞行控制比“闭眼开车”难得多。
1.2 飞行控制器和地面控制器的三个关键区别
很多人学自动控制原理时,拿倒立摆、电机速度环练手,以为掌握了PID就懂了飞行控制。真正进入飞行器才发现,这套逻辑在“天上”和在地面上完全是两回事。
第一个区别是欠驱动特性。四旋翼只有4个电机,却能控制6个自由度(位置3个+姿态3个),这意味着它天生就是欠驱动系统。你改变油门不只是升力变化,还会因为升力向量倾斜而带来水平加速度;你压杆滚转不只是姿态变化,还要牵连偏航、牵连高度。地面机器人通常每个自由度都有对应执行器,控制器可以独立设计,飞行器做不到。
第二个区别是强耦合。飞控里最典型的耦合是横滚-偏航耦合和油门-高度耦合。副翼偏转产生滚转力矩时,由于左右机翼升力差,会产生侧向力并诱发偏航;提高油门时,拉力增大还会带来抬头力矩,飞机会先抬头再加速。控制时必须做解耦设计,比如通过方向舵协调转弯、通过升降舵配平补偿,或者靠闭环去自动消除耦合影响。
第三个区别是时变与非线性。固定翼的飞行包线从失速速度到最大速度可能跨越好几倍,动态压力随速度平方变化,控制器增益必须跟随动压调度,这叫增益调度;多旋翼在低速时气动效应弱,在高速前飞时阻力来自机身姿态和旋翼气流,模型差异巨大。地面控制器的被控对象参数一旦整定好通常变化不大,飞行器则相反,参数随着飞行状态时刻在漂。
理解了这三个区别,你就能明白为什么飞行控制理论单独成章,而不是简单套用经典控制教材里的那一套。
2. 物理基础绕不过去:坐标系与运动模型
2.1 三个坐标系和它们之间的“翻译”
飞行控制的一切运算,都建立在坐标系定义上。搞不清楚坐标系,后面所有的控制律设计都是空中楼阁。飞行器里最常用的坐标系有三个。
大地坐标系(NED系):North-East-Down,以北向东向南向下为正。坐标原点通常取地面某点或起飞点,用于描述飞行器的绝对位置和高度,GPS信号给的就是NED或经纬高。
机体坐标系(Body系):原点在飞行器质心,X轴指向机头,Y轴指向右翼,Z轴指向机身下方。IMU测量的角速度和加速度都是机体系下的物理量。
气流坐标系(Wind系):X轴指向气流来流方向,常用于空气动力学分析,升力、阻力通常定义在这个坐标系下。
不同坐标系之间的转换,核心是旋转矩阵。从机体系到大地系的姿态旋转矩阵,可以用欧拉角构造,也可以用四元数构造。欧拉角直观,三个角依次旋转就能拼出任意姿态,但存在万向节锁问题:当俯仰角达到正负90度时,横滚和偏航的旋转轴重合,丢失一个自由度。飞行器控制里几乎都会回避欧拉角,改用四元数。
四元数相当于在四维空间描述三维旋转,没有奇异点,只有归一化约束。我在实际项目中几乎全程用四元数做姿态解算和控制,只在显示和遥控指令输入时把四元数转成欧拉角给人看。新手最容易犯的错误是:把旋转顺序弄错,或者把“机体系转大地系”和“大地系转机体系”搞反。旋转矩阵不是对称的,转置才是逆,方向写反的结果就是控制器反馈完全反相,飞起来直接翻。
有一个工程小技巧:只要看到姿态更新代码里出现sin和cos的矩阵乘法,第一件事就检查这个矩阵的转置是不是等于逆。很多“翻机案”最后定位都不是控制参数问题,而是坐标系转置写错了。
2.2 六自由度运动方程:飞控的物理内核
飞行器的完整运动由六自由度方程描述,包括三个平动自由度和三个转动自由度。工程上一般把动力学方程拆成两部分:平动方程描述质心的线运动,受外力和重力支配;转动方程描述绕质心的角运动,受外力矩支配。
用牛顿-欧拉形式,惯导框架下的动力学看起来是这样:平动部分,质量乘以线加速度等于合外力(重力、空气动力、推力)在惯性系中的投影;转动部分,转动惯量矩阵乘以角加速度等于外力矩减去陀螺力矩项(角速度叉乘角动量)。陀螺力矩这一项特别容易让人困惑,但它是飞行器高速滚转时产生“旋进”的根本原因,没有它,模型就不完整。
完整的状态量有12个:位置3个、速度3个、姿态3个(四元数4个但约束1个)、角速度3个。这12个状态量之间的耦合通过旋转矩阵连接。例如,机体系下的速度要转成大地系速度才能更新位置;机体系下的角速度要经过四元数运动学方程才能更新姿态。
实际工程中,很少有人直接拿完整的十二维非线性模型去做控制器,那样设计难度极度复杂,计算量也扛不住。常见的做法是在设计点附近做线性化,得到状态空间模型后,用成熟的控制理论去设计。
2.3 从非线性模型到小扰动线性化:工程妥协的智慧
小扰动线性化是飞行控制理论里最经典也最实用的一招。思路是:在某个配平状态点(比如平飞、定直爬升)附近,把非线性运动方程用泰勒展开,忽略二阶以上的高阶小量,得到一组线性常微分方程。这相当于把系统在某点“局部线性化”,在这个小领域内,叠加原理成立,频域分析、根轨迹、状态反馈这些经典工具全部可以用。
以固定翼纵向运动为例,线性化后得到两个经典模态:短周期模态和长周期模态。短周期模态对应迎角和俯仰角速度的快速振荡,周期一两秒,阻尼通常靠平尾来提供;长周期模态是速度和俯仰角之间的缓慢振荡,周期十几秒甚至更长,涉及速度-高度-推力的缓慢交换。侧向运动线性化后则有滚转收敛模态、螺旋模态和荷兰滚模态,各自有各自的时间常数和阻尼特性。
很多学理论的人会问:既然真实系统是非线性的,线性化模型还靠谱吗?答案是:在工程实践上它极度靠谱,前提是你理解它的适用范围。线性模型不是用在全飞行包线,而是在设计点附近、通过增益调度来覆盖整个飞行范围。控制器把系统拉回平衡点附近的时间通常远小于参数漂移的时间,所以局部线性化模型足够支撑稳定性和性能设计。这也是为什么整个飞行控制理论体系,腂基于小扰动线性模型搭建起来的。
3. 控制律设计:从经典PID到状态空间的一步一步
3.1 设计飞控前先想清楚三个指标
拿到一个飞行器,别急着写PID,先定义控制目标。飞控设计通常围绕三个核心指标展开。
第一是稳定性。飞行器必须能抵抗扰动并最终回到希望状态。工程上常用幅值裕度和相角裕度来衡量,幅值裕度至少6dB以上,相角裕度至少45度以上,这是基本门槛。第二是动态响应。包括上升时间、超调量、调节时间。不同任务差异巨大:航拍无人机希望高度响应平缓,竞速机希望滚转响应极快,导弹则要求尽可能消除超调以避免脱靶。第三是稳态精度。在常值扰动下,高度或姿态能否回到指定值,这决定了要不要引入积分项。
这三个指标经常互相冲突:响应快意味着系统更激进,更容易震荡;积分项能消除稳态误差,但会恶化超调。所以每次改一个目标,就要重新权衡其他两个。这是飞控设计中最需要经验的地方。
3.2 PID为什么在飞控里经久不衰
从几十年前的模拟式自动驾驶仪到现代开源飞控,PID依然是姿态控制的核心算法。原因在于结构简单、物理意义明确、调参经验丰富、实时性好。最经典的飞控内环结构是角速度环+角度环的串级PID,这是我推荐所有新手先吃透的结构。
角度环在最外面,输入是期望姿态角(比如期望横滚角30度),输出是期望角速度。角速度环在内部,输入是期望角速度,输出是力矩指令,再映射成电机或舵机的偏转。内环为什么放角速度?因为角速度环响应快,能先把陀螺仪测到的角速度误差压下来,给角度环一个更“干净”的被控对象;外环的响应速度慢下来,本身相当于一个阻尼器,让姿态响应不过冲。
具体到数值计算,角度环的PID输出是期望角速度,角速度环的PID输出是力矩。力矩分配时,多旋翼就把期望力矩换算成四个电机的转速差,固定翼就换算成副翼、升降舵、方向舵的舵偏。这个链路在PX4和ArduPilot里都有现成实现,我建议读一遍源码,比任何教程都直观。
四元数的姿态误差计算是很多人的拦路虎。简单说,期望姿态四元数q_des与当前姿态四元数q_cur之间求差,用q_des的逆乘以q_cur或反过来乘,得到的误差四元数转成旋转矢量,再乘以比例增益,就是期望角速度。这里有一个关键细节:误差旋转矢量两侧的符号直接决定控制方向。我第一次做这个实现时,把左右乘写反了,仿真时一切正常,上了真机差点没把飞机炸了。所以强烈建议,写姿态误差计算时,先用仿真的姿态数据去验证方向,再上真机。
3.3 什么时候PID不够用:现代控制方法的登场
PID在小扰动、慢变参数、弱耦合场景下表现优异,可一旦遇到大机动、强耦合、参数剧烈时变,它的局限就暴露了:没有系统性的方法处理耦合,没有状态约束机制,增益调度设计繁琐。这时就需要现代控制理论上场。
状态反馈和LQR是飞控设计里最实用的现代方法。把线性化的状态空间模型拿出来,设计状态反馈增益K,让闭环系统的特征根放到期望位置。LQR的核心在于选加权矩阵Q和R:Q惩罚状态误差,R惩罚控制量,Q/R的比例决定了系统的“激进程度”。工程上选Q和R没有标准答案,我的经验是先设成对角线,状态惩罚按姿态、角速度和位置不同数量级设定,R按执行器行程归一化,然后在仿真里看响应和操纵量,迭代调整。LQR有一个天然优势——它能在设计约束下给出最“优”的反馈增益,而且天然考虑了耦合状态,不像PID那样要手动解耦。
H∞控制用来处理不确定性建模和外部扰动,对飞行器这种有强不确定性(气动系数误差、传感器噪声)的系统特别有价值。它通过设计控制器,使从扰动到输出的传递函数在频域上满足给定性能上界。代价是控制器阶数高、设计繁琐、实现时可能要降阶。多旋翼上用H∞的文章不少,但工程产品里真正大规模部署的还是少见,主要受限于控制器复杂度和调参成本。
近年来工业界和学术界关注较多的方向是增量非线性动态逆(INDI)。它不依赖完整精确的模型,只用角加速度反馈和当前执行器状态来求逆控制。优点是鲁棒性好、模型依赖度低,特别适合处理气动系数不准确的情况,固定翼和直升机项目里已经有不少实用案例。
我给你的选择建议是:起点项目用PID串级结构,跑通了再上LQR/状态反馈;如果飞行器气动特性明显非线性或模型不清晰,优先考虑INDI或基于增量控制的方案;学术研究需要不确定性分析和鲁棒性证明时,LPV或H∞比较合适。
4. 完整的实操流程:从建模到调参的一站式路线
4.1 建仿真模型:先跑通再谈控制
没有任何一架飞机值得你直接拿真机去调参。建仿真模型是整个飞控开发里性价比最高的一步。即便只是做个六自由度刚体模型加简化的力和力矩模型,也能帮你发现百分之七八十的控制设计问题。
仿真建模的核心要素是:刚体运动方程(十二维状态更新)、执行器模型(电机响应延迟、饱和限幅)、传感器模型(陀螺仪噪声、加速度计噪声、磁力计干扰)、环境模型(重力、大气密度、可选风场)。这四个模块缺一不可。很多人只建了刚体运动方程,忽略传感器延迟和噪声,仿真里表现很好的参数一上真机就炸,原因就在这里——控制器对真实世界延迟和噪声完全没有鲁棒性。
气动数据怎么来?多旋翼可以用叶素理论简化估算拉力系数和阻力系数,或者从风洞数据拟合;固定翼如果有翼型库和几何尺寸,可以用AVL或DATCOM估算气动导数;没有数据就先用无量纲系数近似,比如升力系数在配平点附近设为2.0,再在实机验证后修正。建模的准确性不用追求极致,但趋势必须对——增加油门仰角减小、压杆滚转速率上升,这些符号和量级如果都错了,后面全盘错。
用Simulink可以快速拖模型,用Python写全脚本也可以。我习惯用Python加numpy和matplotlib,因为调试方便、可复现、和论文数据对比容易。模型跑通后有一个简单验证技巧:在配平条件附近施加一个小扰动,看响应是否符合理论模态特征。比如固定翼给升降舵一个阶跃,短周期模态应该快速收敛,频率和阻尼和理论估算接近。
4.2 控制器参数设计的级联顺序
完成模型后,设计控制器参数不要从头一次到位。正确做法是从内往外一层层来:先整定角速度环,再整定角度环,最后整定位置/速度环。原因是每条外环都把内环当成它的“执行机构”,内环不整定好,外环看到的被控对象就是乱的,根本无法调准。
频带分离是关键原则:内环带宽要显著高于外环,一般差3-5倍。角速度环带宽比如5Hz,角度环就取1-2Hz,位置环取0.3-0.5Hz,这样各环之间不会发生谐振耦合。如果发现外环响应引发内环振荡,多半就是频带没有拉开。
参数初值怎么取?工程经验上先设比例项:角速度环P值按“控制力矩/转动惯量/期望角速度误差”粗算,通常在仿真里微调;角度环P值先取内环带宽的1/3-1/2;微分项从0开始逐步加;积分项最后加或不加,先用比例和微分把响应调稳。
一个小技巧:仿真阶段可以用阶跃响应直接观察超调和振荡次数,不用一次一次试。把期望姿态角从0打到30度,记录角速度响应曲线,如果在一个阻尼振荡内收敛,说明带宽和阻尼基本合理;如果来回振荡超过两三次,就降低P或增加D。整定顺序永远一样:先让内环好,再看外环。
4.3 从软件仿真到半实物到真机三个层次
控制器设计完成后,验证分为三个层次:
软件仿真(SITL):全部在电脑上跑,飞行器模型和控制算法都跑在PC里,验证逻辑正确性、参数趋势、飞行任务流程。这个阶段测的主要是“算法行不行”。
半实物仿真(HITL):把真实的飞控硬件接上仿真环境和传感器模拟器,运行真实的嵌入式代码。这个阶段能发现很多软件级问题:数据溢出、时序错误、初始化遗漏、PWM通道映射反了等等。
真机试飞:真正检验控制器和硬件。真机试飞必须遵循“小步快跑”原则:先做姿态阶跃测试,不做大机动;先不起飞全油门前先在地面检查电机转向和混控输出;每一次试飞记录日志,回来分析参数再决定下一轮。
每一次升级验证层次,都要把日志分析和参数审查做好,尤其是角速度和姿态的曲线,要对比理论预期。很多炸机都是因为跳过了中间验证直接上真机,这一步省不得。
4.4 一个示例:小型多旋翼姿态控制器的搭建流程
设一架小型四旋翼,质量1.5kg,轴距0.35m,转动惯量对角线约 I_xx=I_yy=0.02 kg·m²,I_zz=0.034 kg·m²。我们的目标是角速度环带宽约6Hz,角度环带宽约2Hz。
第一步,建立简化模型:电机升力F和力矩M近似为F=k_f * omega²,扭矩M=k_m * omega²。这里k_f、k_m通过推力台标定,或按电机规格书估算。四个电机的转速差产生横滚、俯仰、偏航力矩和总升力,混控矩阵要按“x型”布局算,这个矩阵写错飞机会直接乱转。
第二步,设计角速度环。角速度环的简化模型是一阶积分环节:角加速度=力矩/转动惯量。若执行器延迟约0.02s,则角速度环等效对象在一阶延迟后加一个积分。闭环后带宽6Hz,约合37.7rad/s。用理论近似:比例增益Kp≈带宽²乘以转动惯量除以执行器增益。这里Kp近似约I_xx * (2π6)²除以执行器增益系数;假设执行器增益为1(力矩百分比直接对应PWM映射),Kp约等于0.02 * 1421 ≈ 28.4。需要加一个微分项来提升阻尼,理想阻尼比取0.7,Kd≈2阻尼比带宽I_xx代入后约为20.737.7*0.02 ≈ 1.06。这些只是初值,仿真修正一下就好。
第三步,设计角度环。角度环以角速度环作为被控对象,把角速度环简化为一阶惯性环节,时间常数约1/带宽。取角度环带宽2Hz(12.6rad/s),则角度环比例增益约等于带宽(因为内环近似一阶),Kp_angle≈12.6。微分项可以给一点阻尼,积分项在仿真后检查是否需要对常值扰动消除再加。
把这一套参数写进代码跑仿真,观察阶跃响应。如果发现超调过大,就提高角速度环D或降低角度环P;如果响应太慢,就提高带宽,但注意执行器延迟限制了上限。整个过程迭代3-5轮,基本能得到一组可靠的初值。最后用这些初值到真机试飞时,一般都能直接飞稳。
5. 调试经验与常见问题避坑
5.1 试飞调试中我踩过的坑
调飞控这几年,我见过和踩过的最常见的问题,先列几个典型的。
第一个是坐标系绕晕。真机在调试台上转动IMU,飞控软件显示的姿态翻转方向相反,就是姿态解算里旋转方向写反了。排查方法是把手动姿态角打10度,看日志里的四元数变化是否符合期望方向。如果反向,把旋转矩阵或四元数误差公式里的乘序调整过来。相信我,这类问题比参数不对更隐蔽,也更危险。
第二个是积分饱和导致起飞翻转。无人机停在地面,飞控在解锁前已经累积了大量误差积分,一旦解锁起飞,积分项瞬间输出巨大控制量,飞机直接翻机。解决方法是设置积分限幅、解锁时清零积分、或者加“抗积分饱和”逻辑。开源飞控里通常有“解锁前不激活积分”的开关,别图省事关掉它。
第三个是陀螺仪噪声被微分项放大。很多新手的姿态振荡不是P太大,而是D太大。陀螺仪噪声经过微分项后高频成分被放大,输出高频抖振。解决方法是给陀螺仪信号加低通滤波,或者用陷波器滤除特定频率的共振噪声,然后把D限制在合理范围。判断方法是看日志中角速度指令是否高频抖动,如果是,优先降D而不是降P。
5.2 常见问题速查表
我把常见问题整理成一个速查表,调试时直接对照查:
| 现象 | 可能原因 | 排查/对策 |
|---|---|---|
| 悬停时高频抖振 | 角速度环D过大或传感器噪声大 | 降低D,检查陀螺仪滤波 |
| 姿态漂移且无法回正 | 积分项不足或传感器零偏 | 增加积分,标定陀螺仪零偏 |
| 起飞瞬间翻转 | 积分饱和、电机映射错、旋转方向错 | 解锁清零积分,检查混控矩阵 |
| 滚转响应反向 | 姿态误差方向写反或IMU安装方向错 | 检查旋转矩阵与IMU安装方向 |
| 油门加大时飞机低头 | 重心靠前或推力线低于重心 | 调整重心或推力线配平 |
| 爬升时航向偏转 | 横滚-偏航耦合未补偿 | 增加偏航阻尼,或调整舵面/电机混控 |
| 飞行动作剧烈后振荡长时间不停 | 频带分离不够或角度环带宽过高 | 降低外环带宽,拉大频带距离 |
| 高速前飞时姿态发散 | 动压变化导致增益不足 | 用动压做增益调度或增加反馈强度 |
这张表是我多年调试经验的浓缩,遇到现象对不上号时,先查最危险的方向性问题和混控问题,再考虑参数问题。
5.3 新手必知的几个调试原则
最后分享几个所有飞控调参都适用的原则,这些原则来自无数次试飞事故的教训。
第一,由内到外一次只改一个参数。角速度环没有收敛前不要去动角度环;改一个增益,记录一次日志,分析清楚再改下一个。同时改多个参数,出问题你根本不知道是谁造成的。
第二,小增量阶梯式试飞。第一阶段只在调试台上验证传感器方向和混控输出;第二阶段小油门低高度测试姿态稳定,任何异常立即切手动或急停;第三阶段才做大机动。每阶段至少记录三组日志,下载下来分析后再进下一阶。
第三,安全保护永远不能省。手动模式切换开关、急停开关、低电保护、失联返航这些安全逻辑必须完整,并且在地面演练过。真机试飞前检查桨叶、电池、电机温度,把这些动作养成肌肉记忆。紧急情况下能手动切回、能一键停机,才是飞控调试最底线的兜底。
第四,保守起调。没有任何经验时,把带宽和目标增益设得低一些,宁可响应慢也不要发散。调试是通过一次次小步迭代逼近设计值的,不是赌一把。如果你觉得“差不多能飞”,那一定还不够稳。
理论学习最终要落到调试桌和试飞场上。这套章节内容看起来都是公式和原理,但真正决定你能不能成为飞控工程师的,其实是你在坐标系里翻过车、在积分饱和里炸过机之后,还能回头把这些基础概念重新啃一遍的能力。我的体会是,飞控调试没有捷径,建模、仿真、半实物、试飞一条线走下来,每一步都不能省,每一个参数都要有依据。把这套流程变成习惯,你离真正掌握飞行控制,就没多远了。