4、高度与空速保持:TECS总能量控制系统详解
各位同学,欢迎来到第四章。今天咱们聊一个核心话题——如何同时管好油门和俯仰。
说实话,我刚接触飞控那会儿,觉得高度和速度控制是两码事。高度不够就拉杆,速度慢了就推油。结果呢?飞机像个醉汉,忽上忽下,空速也稳不住。后来我才明白,高度和空速其实是耦合的,你动俯仰,空速会变;你动油门,高度也会受影响。
ArduPilot 里解决这个问题的方案,叫 TECS——Total Energy Control System,总能量控制系统。这名字听着挺唬人,其实说白了,就是把飞机看成一个能量体,统一管理。
4.1 为什么需要TECS?
传统的 PID 控制,油门和俯仰是分开的。高度偏差大了,俯仰通道拼命拉杆;空速偏差大了,油门通道拼命加油。结果两个环路互相打架,飞机姿态乱晃。
我在项目中遇到过一架固定翼,巡航时高度掉了几十米,飞控立刻抬头拉杆。结果空速骤降,油门又猛推。飞机像坐过山车,电池耗得飞快。后来换成 TECS,问题迎刃而解。
为什么会这样?因为 TECS 的核心思想是:飞机的总能量 = 势能(高度) + 动能(空速)。油门控制总能量的增减,俯仰控制能量在势能和动能之间的分配。这样分工明确,互不干扰。
核心公式:
总能量 E = mgh + ½mv²
油门 → 控制 dE/dt(总能量变化率)
俯仰 → 控制势能与动能的分配比例
4.2 TECS 的架构拆解
咱们来看 TECS 的内部结构。我习惯把它分成三个模块:
- 能量计算模块:算出当前总能量和目标总能量的差值
- 能量分配模块:决定多少能量给高度,多少给空速
- 控制输出模块:把能量指令转换成油门和俯仰指令
你想想看,这就像一个管家。管家先看看家里有多少钱(总能量),再看看该花在房子上(高度)还是车上(空速)。最后决定是去赚钱(加油门)还是花钱(收油门)。
下面这张图是我手绘的 TECS 控制逻辑框架,你一看就明白:
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 参数,我有个三步法:
- 先调油门:把飞机飞到平飞状态,观察油门是否稳定。如果油门来回抖,减小
TECS_THR_DAMP。 - 再调俯仰:给一个高度变化指令,观察飞机是否平滑爬升/下降。如果俯仰震荡,减小
TECS_PITCH_DAMP。 - 最后调耦合:同时给高度和空速指令,观察两者是否都能稳住。如果高度稳了空速掉,适当增大
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 在实战中的更多细节,包括如何处理风干扰、如何应对动力失效等场景。