4、高度与空速保持:TECS总能量控制系统详解

各位同学,欢迎来到第四章。今天咱们聊一个核心话题——如何同时管好油门和俯仰

说实话,我刚接触飞控那会儿,觉得高度和速度控制是两码事。高度不够就拉杆,速度慢了就推油。结果呢?飞机像个醉汉,忽上忽下,空速也稳不住。后来我才明白,高度和空速其实是耦合的,你动俯仰,空速会变;你动油门,高度也会受影响。

ArduPilot 里解决这个问题的方案,叫 TECS——Total Energy Control System,总能量控制系统。这名字听着挺唬人,其实说白了,就是把飞机看成一个能量体,统一管理。

4.1 为什么需要TECS?

传统的 PID 控制,油门和俯仰是分开的。高度偏差大了,俯仰通道拼命拉杆;空速偏差大了,油门通道拼命加油。结果两个环路互相打架,飞机姿态乱晃。

我在项目中遇到过一架固定翼,巡航时高度掉了几十米,飞控立刻抬头拉杆。结果空速骤降,油门又猛推。飞机像坐过山车,电池耗得飞快。后来换成 TECS,问题迎刃而解。

为什么会这样?因为 TECS 的核心思想是:飞机的总能量 = 势能(高度) + 动能(空速)。油门控制总能量的增减,俯仰控制能量在势能和动能之间的分配。这样分工明确,互不干扰。

核心公式:

总能量 E = mgh + ½mv²

油门 → 控制 dE/dt(总能量变化率)

俯仰 → 控制势能与动能的分配比例

4.2 TECS 的架构拆解

咱们来看 TECS 的内部结构。我习惯把它分成三个模块:

  • 能量计算模块:算出当前总能量和目标总能量的差值
  • 能量分配模块:决定多少能量给高度,多少给空速
  • 控制输出模块:把能量指令转换成油门和俯仰指令

你想想看,这就像一个管家。管家先看看家里有多少钱(总能量),再看看该花在房子上(高度)还是车上(空速)。最后决定是去赚钱(加油门)还是花钱(收油门)。

下面这张图是我手绘的 TECS 控制逻辑框架,你一看就明白:

TECS总能量控制系统框架图 目标高度 目标空速 当前高度 当前空速 能量计算模块 E_total = mgh + ½mv² ΔE = E_target - E_current 分配比例 = f(高度偏差, 空速偏差) 能量分配模块 油门 → 总能量变化率 俯仰 → 势能/动能分配 油门指令 俯仰指令 反馈闭环

4.3 油门通道:总能量管家

油门在 TECS 里负责什么?管总能量的增减

如果目标高度和当前高度差很多,或者目标空速和当前空速差很多,说明总能量不足。这时候油门该加就加。反过来,如果飞机能量过剩,油门该收就收。

ArduPilot 里有个关键参数:TECS_THR_DAMP。这个参数控制油门对能量偏差的响应速度。我建议新手别调太大,否则油门会像抽风一样来回抖。

个人经验:

我曾经在调试一架飞翼时,TECS_THR_DAMP 设成了 0.7,结果油门一直在 40% 到 80% 之间来回跳。后来降到 0.3,立马稳了。记住,油门是慢变量,别让它太敏感。

4.4 俯仰通道:能量分配师

俯仰管什么?管能量分配

举个例子:飞机需要爬升,但空速不能掉。这时候 TECS 会怎么做?它会先推油门增加总能量,然后稍微抬头,把一部分能量转化成势能。这样高度上去了,空速也没掉太多。

反过来,如果飞机需要减速但高度不变,TECS 会收油门减少总能量,同时低头,把势能转化成动能来维持空速。

这里有个关键参数:TECS_PITCH_DAMP。它控制俯仰对能量分配偏差的响应。我习惯把它设得比油门阻尼小一点,因为俯仰响应比油门快。

注意:

千万不要把 TECS_PITCH_DAMP 设成 0。我曾经试过一次,飞机在爬升时俯仰疯狂震荡,差点失控。俯仰阻尼必须有,哪怕很小。

4.5 代码层面的实现

咱们来看看 ArduPilot 里 TECS 的核心代码。我挑了一段关键逻辑:

// TECS 核心更新函数(简化版)
void TECS::update(void) {
    // 1. 计算当前总能量
    float E_total = 0.5 * airspeed * airspeed + GRAVITY * height;
    
    // 2. 计算目标总能量
    float E_target = 0.5 * target_airspeed * target_airspeed + GRAVITY * target_height;
    
    // 3. 总能量偏差
    float E_error = E_target - E_total;
    
    // 4. 油门输出(总能量控制)
    throttle_demand = throttle_trim + TECS_THR_DAMP * E_error;
    
    // 5. 能量分配偏差
    float SPE_error = (target_airspeed - airspeed) - (target_height - height);
    
    // 6. 俯仰输出(能量分配控制)
    pitch_demand = pitch_trim + TECS_PITCH_DAMP * SPE_error;
}

你看,逻辑其实很清晰。油门看总能量偏差,俯仰看能量分配偏差。各司其职,互不干扰。

4.6 调参实战指南

调 TECS 参数,我有个三步法:

  1. 先调油门:把飞机飞到平飞状态,观察油门是否稳定。如果油门来回抖,减小 TECS_THR_DAMP
  2. 再调俯仰:给一个高度变化指令,观察飞机是否平滑爬升/下降。如果俯仰震荡,减小 TECS_PITCH_DAMP
  3. 最后调耦合:同时给高度和空速指令,观察两者是否都能稳住。如果高度稳了空速掉,适当增大 TECS_PITCH_DAMP

我常用的初始参数表:

参数名 默认值 推荐范围 说明
TECS_THR_DAMP 0.5 0.3 - 0.7 油门阻尼,越大响应越快
TECS_PITCH_DAMP 0.4 0.2 - 0.6 俯仰阻尼,越大分配越积极
TECS_SPD_WEIGHT 1.0 0.5 - 2.0 空速权重,越大越优先保空速
TECS_TIME_CONST 5.0 3.0 - 8.0 时间常数,越大响应越慢

避坑指南:

我曾经在调试一架大翼展滑翔机时,把 TECS_TIME_CONST 设成了 2.0,结果飞机对高度变化反应过于激进,乘客(如果有的话)肯定晕机。后来改回 5.0,一切正常。记住,时间常数不是越小越好。

4.7 总结

TECS 的精髓,说白了就是一句话:油门管能量多少,俯仰管能量怎么花

你想想看,这就像你管钱。油门决定你赚多少花多少,俯仰决定钱是买房(高度)还是买车(空速)。两个角色分清楚,控制自然就稳了。

嗯,这一章的内容就到这儿。下一章咱们聊聊 TECS 在实战中的更多细节,包括如何处理风干扰、如何应对动力失效等场景。


专注资料整理