
飞固定翼的人十有八九都经历过这种抓狂瞬间油门杆没动发动机转速自己一跳一跳明明想平飞高度却在 10 米范围内来回晃一拉杆爬升空速掉得比高度涨得还快一推杆下降飞机像坐过山车一样先俯冲再被猛拽回来。很多人第一反应是“PID 没调好”于是反复折腾俯仰增益、阻尼系数结果该抖还是抖该掉速还是掉速。尤其是用 Pixhawk 飞控飞固定翼的新手往往在姿态 PID 里浪费了大量时间却不知道真正的元凶是更上层那个“看不见的算法”——TECS全称 Total Energy Control System总能量控制系统。这篇教程完全从零开始不讲废话直接讲清楚 TECS 到底在算什么、Pixhawk 里它和 PID 是什么关系、参数怎么调才不抖不掉速。无论你是在 ArduPilot 还是在 PX4 固件下玩固定翼这套能量控制的思路都通用。我会把数学公式掰开揉碎用人话讲再用实测经验告诉你哪些参数先动、哪些参数千万别乱动最后附上日志排查的方法。保证你看完能少走我当年踩过的那些大坑。1. 为什么固定翼控制要换思路PID 的局限与能量视角1.1 大多数新手都掉进过的“PID 调参坑”我先说一段自己的黑历史。刚玩固定翼那会儿我用的也是 Pixhawk默认姿态 PID 飞起来凑合能控但只要切到定高或者自动巡航模式问题就全来了高度偏差一出现飞控疯狂拉杆拉到姿态保护限位后又猛地低头整个飞机像在“锯木头”。我当时以为是姿态环增益不够把 P 值一路往上加结果飞机开始高频俯仰抖动差点空中解体。后来才明白固定翼的高度、速度、俯仰姿态本质上是一个强耦合系统。你单纯用一个 PID 去稳住高度它必然通过大攻角或者大俯仰角去“硬掰”结果就是空速剧烈波动你用另一个 PID 去稳空速它又去抢油门结果高度跟着乱跳。两个控制回路互相打架飞机自然越飞越拧巴。固定翼不像多旋翼多旋翼的姿态、垂直速度解耦相对明显固定翼升力依赖空速速度一变升力就变高度跟着变反过来又影响速度。想靠几个独立 PID 各管一段等于让两个司机同时抢方向盘谁都不服谁。1.2 把飞机当成一个“能量包”来看换个思路就好理解得多。不管你往哪个方向飞飞机这块“铁疙瘩”总共只有两种能量因高度产生的势能和因速度产生的动能。油门改变的是这个“总能量包”的大小好比给手机充电升降舵改变的只是能量的“分配方式”是拿来爬高还是拿来加速好比手机里后台 App 谁用得多一点。飞机制造商和开源飞控社区早就看明白了这一点于是有了 TECS 这种基于能量状态的控制器。TECS 的核心思想就一句话用油门去控制总能量的增减用升降舵去控制动能和势能之间的分配比例。这样天然尊重了固定翼的物理特性——发动机输出的功率决定飞机总能量爬升或衰减的速度而升降舵只是把一部分能量“搬运”到高度或者速度上。所以你在用 Pixhawk 固件调固定翼时别再纠结“高度该归高度 PID 管、速度该归速度 PID 管”了TECS 才是这两个量背后真正的统筹者。2. TECS 的核心原理一个公式看懂它的灵魂2.1 比总能量与能量分配率要把能量控制变成算法第一步是给“能量”找个统一的度量单位。开过电动车的人知道电池电量既可能花在爬坡上也可能花在提速上为了比较方便工程师常把动能和势能变成同一个量纲。TECS 里最基础的一个概念叫比总能量简单说就是把速度折算成等效的高度再加实际高度[ E h \frac{V^2}{2g} ]其中 h 是高度V 是空速g 是重力加速度。因为固定翼的升力和发动机推力都依赖于空速所以这里用的是空速而不是地速。这个 E 也叫“能量高度”相当于把所有能量都折算成“还能再飞多高”。假如我当前 500 米高度、空速 30 m/s那我比能量相当于 500 30²/(2×9.8) ≈ 500 45.9 ≈ 545.9 米意思是我如果把速度全部换成爬升最多还能再爬约 45.9 米。有了总能量还得再看分配。TECS 里定义了能量分配率反映在稳住总能量的前提下动能和势能谁升谁降[ D \dot{h} - \frac{V \dot{V}}{g} ]当 D 为正说明高度在增长而速度在下降也就是能量正在从动能搬运到势能D 为负则相反。这样就把飞机的两个状态量压缩成了两个“能量坐标”一个管总额一个管差值。TECS 后面的所有计算都是围绕这两个坐标展开的。2.2 油门管总能量升降舵管能量分配现在把控制逻辑对上号。总能量的偏差交给油门来控制如果当前总能量低于期望总能量TECS 就会加大油门指令让发动机输出更多功率如果总能量盈余比如飞得又高又慢那就收油门。这样做很符合直觉只有发动机能往系统里“注入”能量。能量分配偏差则交给升降舵来控制如果高度比期望高但速度比期望低说明能量过多地变成了高度也就是势能占比太大TECS 会给出低头俯仰指令让飞机把一部分高度“还”给速度反之如果速度偏高但高度偏低就轻轻拉杆爬升。升降舵本身不改变总能量它只是通过改变气动力方向让飞机在动能和势能之间做搬运工。需要特别注意的是TECS 输出的并不是油门百分比和舵面角度本身而是期望的推力指令和期望的俯仰角。在 ArduPilot 里推力指令会进一步映射为油门的百分比期望俯仰角会交给底层的姿态控制器去执行。所以 TECS 不是什么黑魔法它上面还有姿态内环。如果底层姿态 PID 调得稀烂TECS 算得再准也没用这点后面调参时还会再强调。2.3 几个你必须理解的关键概念理解 TECS 时有几个术语会频繁出现在日志和参数说明里提前搞清楚能省很多时间。第一个是SEP比剩余功率英文全称 Specific Excess Power。它表示飞机当前单位重量下“多余”的功率其实就是总能量变化率。日志里如果 SEP 一直是正的说明飞机在稳定积累能量空速或者高度必然会上升SEP 为负则说明系统在“耗能”。TECS 对油门指令的计算本质上就是让期望推力对应的 SEP 尽快收敛到所需值。第二个是能量分配误差通常用日志里的 Errdot 等字段表示。正负代表当前动能势能分配失衡的方向。我以前看日志只看高度和空速两条曲线半天看不出问题后来直接看 EPS 和能量误差字段几秒钟就定位出“为何油门乱跳”的根源。这些字段在 Mission Planner 的 STATUS 页面和 PX4 的 Flight Review 里都能找到。第三个是速度-高度权重对应参数里的 SPDWEIGHT。它不是一个开关而是一个连续权重决定当总能量固定时系统更愿意把能量分配给速度还是高度。默认值在 1.0 附近表示比较均衡大于 1 倾向于优先保速度小于 1 倾向于优先保高度。理解了这个后面调参数时你就可以根据自己的飞行需求去“定制”飞机的脾气。3. Pixhawk 里 TECS 到底是怎么跑起来的3.1 ArduPilot 与 PX4 中 TECS 的位置Pixhawk 本质上是一个硬件平台真正的“飞控大脑”是它上面跑的固件。目前主流开源固定翼固件里ArduPilot 和 PX4 都集成了自己的 TECS 实现思路源于 NASA 早期提出的总能量控制理论又在工程上做了不少适配。两套代码的入口不同但控制层级都是一样的最外层是导航/制导层给 TECS 发期望高度和期望空速中间是 TECS解算出期望俯仰角和期望推力最内层是姿态与油门伺服控制最终驱动舵机和电调。我常跟新手说TECS 是个“夹心层”。你调 TECS 时如果把底层姿态环当作不存在看着参数调了半天也是隔靴搔痒。反过来底层姿态环调得干净利索TECS 的收敛速度能明显变好。所以遇到飞行品质问题先分清是底层问题还是顶层问题再去碰对应参数。3.2 TECS 在控制链路中的输入输出一次典型的自动飞行任务里TECS 接收的量包括期望高度、期望空速、当前高度、当前空速以及来自导航层的爬升率/下沉率限制。高度来源可以是气压计或者 GNSS 辅助高度空速来自空速管如果飞机没装空速管只能用 GPS 地速近似——但这里我必须提醒一句没有空速管时 TECS 的性能会明显下降。因为飞机在逆风顺风时地速和空速相差很大用 GPS 地速当空速等于让 TECS 在不同风况下算出来的能量状态失真。TECS 内部会先滤波、再做能量状态估计然后经过一系列控制律计算输出两个关键值demanded pitch期望俯仰角demanded throttle期望油门百分比。在 Mission Planner 的飞行数据页面里你其实可以直接看到 TECS 输出的这两个量一个写着 DEMPITCH一个写着 DEMTHR。如果实际俯仰角和实际油门始终跟不上期望值那就说明问题在下游的姿态环路不要在 TECS 参数上白费力气。3.3 核心参数速查表与分析正因为 TECS 在中间层工作它的调参参数数量并不多但每一个都影响“成败”。我把 ArduPilot 固定翼里最常用的 TECS 参数整理成了表供你飞行前对照检查。以下数值以 ArduPilot 4.x 常见的默认参考值为例具体请以你所用固件版本的实际默认值为准。参数名默认参考值作用调参方向TECS_TIME_CONST5.0高度控制时间常数决定响应快慢越大越平缓越小越激进过小引发震荡TECS_SPDWEIGHT1.0速度与高度权重1 保速度1 保高度一般 0.7~2 之间调整TECS_PTCH_DAMP0.1俯仰阻尼抑制能量分配环的振荡过小容易俯仰抖动过大反应迟钝TECS_PITCH_MAX15最大俯仰角限制按机型特性和飞行场景调整千万别乱设过小TECS_THR_MIN0最小油门百分比滑翔机可以设为 0动力机需要留一点怠速TECS_THR_MAX100最大油门百分比动力不足时需开到 100过大可能油门冲击TECS_SINK_MAX2.0最大下沉率限制防止下降阶段俯冲过快TECS_SINK_MIN-2.0最大爬升率限制防止爬升阶段拉杆过猛PX4 里同样前缀也是 TECS_参数名字段也高度相似比如TECS_SPDWEIGHT、TECS_TIME_CONST、TECS_PITCH_MAX等。你只要抓住 TIME_CONST、SPDWEIGHT、PTCH_DAMP、油门限幅这四类就抓住了调参的主线。剩下那些导数阻尼、垂直加速度限制等默认值一般都能用属于飞机出了异常再做“外科手术式微调”时才碰的量。4. 保姆级调参实战从默认参数到稳如老狗4.1 调 TECS 之前必须完成的前置条件很多人一上来就翻 TECS 参数表这里我要泼一盆冷水在开始调 TECS 之前你的飞机必须满足几个硬性条件否则后面的工作全白做。第一姿态控制器的常规 PID 已经整定完成。ArduPilot 固定翼的姿态环参数主要集中在 PTCH2SRV_、RLL2SRV_这几组还有更底层的速率环参数。怎么判断是否达标手动模式下做几个爬升、下滑、横滚动作回中后飞机能干净利落地恢复配平姿态没有明显超调和振荡就算过关。如果手动横滚回中有来回摇动TECS 里的俯仰期望再稳也救不回来。第二空速管必须校准且读数可信。我在没有空速管的小翼展机型上试过 TECS地面风速稍大一点高度和速度权重就开始“打架”巡航时油门曲线像心电图。如果你实在不想加空速管至少也要在无风天飞行并且理解此时的性能上限。第三电调校准和动力怠速确保合理。固定翼巡航时油门工作点通常不高如果电调未校准油门最低点和期望推力映射对不上TECS 输出的“期望推力 50%”可能实际只给了 30% 的转速整个能量闭环就偏了。4.2 第一次飞行只动三个参数第一次带着 TECS 参数升空我建议你保持绝对克制只动三个参数。第一个是TECS_TIME_CONST从默认 5 起步不要一上来就改成 2 追求“跟手”。第二个是TECS_SPDWEIGHT大多数常规固定翼从 1.0 开始等你摸清飞机的性格再决定向哪个方向偏。第三个是TECS_PITCH_MAX根据你的机型和舵面强度设置一个合理的最大值普通航模 15 度左右够用特技机可以适当放开到 20~25 度但千万不要设到 45 度否则强风或阵风扰动下飞控可能给出一个“神仙”俯仰角翼载荷小的飞机直接失速。第一次飞行的任务只有一个在较高的安全高度切入定高模式ALT_HOLD或者自动任务观察 20 秒。看什么看四个东西一是俯仰角曲线是否平滑二是油门曲线是否连续三是高度是否围绕目标高度收敛四是空速是否稳定。只要没有剧烈的振荡今天的飞行就算成功。即使高度有一点周期性的超调波动也不要急着改参数把飞行日志存下来回地面看数据再动。4.3 进阶调优速度权重与时间常数的博弈当你跑过几次默认参数飞行后就可以根据飞机的“性格”做针对性调整了。这里有两个最常见的使用场景。如果你用的是一架动力相对充足、但翼载荷大、速度范围窄的飞机比如飞翼或者像真机你会发现在巡航时 TECS 很容易“掉高度换速度”或者“掉速度换高度”。此时把TECS_SPDWEIGHT从 1.0 往 1.2~1.5 方向调让算法更看重空速油门和俯仰的配合会明显更协同不容易出现失速前兆。反过来如果你飞的是滑翔机或者动力不足的老式航模空中能量比较宝贵那就把 SPDWEIGHT 调小到 0.7~0.8优先保住高度在热气流里能获得更自然的飘飞体验。时间常数TECS_TIME_CONST和 SPDWEIGHT 是一对博弈关系。增大时间常数TECS 会更“平和”适合风大的日子因为不会对高度扰动反应过度减小时间常数高度跟踪更跟手但能量环对噪声和风切变的敏感度上升油门和俯仰容易出现高频修正。我自己实测下来在 3~4 级风里把 TIME_CONST 从 5 调到 6~7油门输出抖动明显减少。而在无风的小场地上飞 F3A 类飞机我会把 TIME_CONST 降到 4高度保持更紧凑。TECS_PTCH_DAMP是很多新手忽略的“防抖参数”。如果日志里期望俯仰角波动很频繁而实际执行也算跟手说明能量分配环在振荡这时候不要动 TIME_CONST先加 PTCH_DAMP。我在一架后推飞翼上遇到过巡航时 0.3 Hz 左右的低幅俯仰振荡把 PTCH_DAMP 从 0.1 加到 0.18振荡直接消失。记住它压的是“俯仰指令的噪声”不要加太大否则气动响应会被拖慢。5. 常见问题排查与日志分析实录5.1 现象油门忽大忽小像心跳图这是 TECS 调参里最典型的问题。油门忽大忽小通常不是 TECS 单点造成的要分情况看。如果油门抖动频率不高但幅度很大多半是能量误差计算里混入了噪声优先检查空速管是否堵塞、气压计是否受到机翼振动干扰如果日志里 SEP 和期望推力都在抖再看 TIME_CONST 是不是设太小把时间常数调大 1~2 秒往往就能压住如果只是油门变化很剧烈但 SEP 曲线正常问题出在推力映射到油门的环节检查油门限幅是否太窄、最低油门是否设得过高导致一个小推力误差就引起很大的油门百分比变化。5.2 现象爬升掉速、下降增速飞机一进入自动爬升空速掉得厉害高度还没上去多少一下降速度又开始失控地冲。这种“能量分配失衡”的核心是 TECS 认为当前能量足够把太多能量拿去换高度或者反而把高度换成了速度。先从 SPDWEIGHT 入手如果爬升掉速严重说明算法给了高度过高的优先级先把 SPDWEIGHT 加到 1.2 以上试飞如果下降阶段增速严重通常和 SINK_MAX 限制过松有关把TECS_SINK_MAX从 2.0 往 1.5 左右收紧限制最大下沉率同时给 TECS 更多时间通过收油和带杆来减速。还有一种隐蔽情况动力系统推力响应太慢。油机或者大桨距电机从怠速到全油门需要一两秒TECS 按瞬态推力模型计算能量但实际推力滞后导致爬升初期掉速。这种情况下我会把TECS_THR_MAX适当放开同时检查电调刹车设置保证油门响应不过度延迟。注意如果你用的是 ArduPilot还可以看推力转速估计是否准确电机-电调-螺旋桨的推力曲线最好用实测数据标定。5.3 现象俯仰震荡与掉高如果是连续的俯仰振荡先分清楚是姿态内环的问题还是 TECS 的问题。判断方法很简单切回手动模式手动推拉杆几下如果回中后仍出现振荡那基本是姿态 PID 的事和 TECS 无关。如果手动模式很干净一切到定高或自动模式就振优先检查TECS_PTCH_DAMP是否太小把阻尼从 0.1 往 0.15~0.2 方向加同时确认TECS_TIME_CONST是否被调得太小比如有人图响应快改成 2能量环会像神经质一样不断修正高度进而引起俯仰高频动作。还有一种掉高现象很迷惑人飞机没有俯仰振荡但每次转弯都会掉 10~20 米高度。这其实不一定是 TECS 参数问题多半是转弯时的协调性问题。固定翼在倾斜转弯时升力垂直分量减小TECS 理应先预测到能量损失通过提前加油门来补偿。如果你发现转弯掉高明显检查转弯过程中副翼、方向舵是否协调协调转弯能让 TECS 的能量估计更准确而不是单纯加大 PITCH_MAX 去“硬拉”。5.4 如何用日志定位问题纸上谈兵再多也不如亲手看一次日志。ArduPilot 用户可以用 Mission Planner 的“Flight Data”界面在 STATUS 页面调出 TECS 相关字段TECS.EH是期望能量高度TECS.EHdot是期望能量高度变化率TECS.SEP是比剩余功率TECS.Err和TECS.Errdot分别是总能量误差和误差变化率TECS.DEMPITCH、TECS.DEMTHR是 TECS 输出的期望俯仰和期望油门。PX4 用户则用 Flight Review 打开 ULog查看tecs_status消息里的totalEnergyError、energyDistributionError等字段。我把排查流程简化成一个“三段式”问题定位法第一步对比DEMPITCH和实际俯仰角如果两者偏差大问题在姿态内环第二步对比DEMTHR和实际油门如果两者偏差大问题在动力映射第三步如果 TECS 的输入期望高度、期望空速本身就忽上忽下那问题来自更上层的制导逻辑比如航线转弯切换参数。按这个顺序走你基本不会在错误层级白折腾。我自己后来遇到任何奇怪现象都强迫自己先看这三个差别再决定动哪个分区省下的时间远超调参本身。6. 写在最后一点个人体会最后分享一个我踩过两次的坑。有一阵子我调一架大展弦比滑翔机始终觉得 TECS 高度收敛太肉于是把TECS_TIME_CONST一路从 5 降到了 2.5。结果呢无风天飞起来确实利索一到阵风天油门和俯仰就像两个喝多了的人在抢方向盘来回剧烈修正。后来我把时间常数调回 5同时把空速权重加到 1.3飞机的表现立刻“绅士”了很多。这件事让我印象极深——TECS 的魅力从来不是把响应调得有多激近而是让飞控学会“有分寸地用力”。另外送新手一个实操小技巧每次只改一个参数飞行记录至少 3 分钟回地面后导出日志对比同一航段的油门和高度曲线。多积累几次参数改动和曲线变化的对应关系你很快就能建立起对 TECS 的“手感”。加油门不拉杆飞机自己就能找到属于自己的那条航迹。