# 前馈2.0

Betaflight 4.1为我们带来了一项有关前馈的全面更新——前馈2.0。

请注意，开发版本中的`ff_spread`现已更改为`set ff_interpolate_sp = AVERAGED`。不再需要设置时间间隔。

### **什么是前馈？**

前馈（FF）是一个能够提高穿越机对于摇杆指令的动态响应性能的驱动因子。它与摇杆运动时的瞬时速度，也就是“变化率”成正比。摇杆移动的越快，我们就能获得越多的FF。在过弯时，FF可以协助P来使穿越机更快转弯。但与P不同的是，无论增加多少FF，前馈机制都不会引起自激震荡。

有了前馈的帮助，我们可以在避免将P推得过高而导致产生摆动的前提下，提高穿越机对摇杆指令的瞬态响应性。它还减少了输入与相应之间的延迟。延迟越低意味着误差越小，而误差越小越好。它非常适合竞速飞手、目视飞手和激进的花式飞行。这对于电影感飞法来说并不是很好。

前馈太高会导致：

* 翻滚开始时便发生超调，特别是当你打满姿态杆时
* 对遥控信号(RC)数据帧的夸张响应
* 当飞手感到寒冷或紧张时，摇晃会被放大
* 当遥控信号数据帧差异过大时电机信号出现尖峰，飞机发生短暂的震动
* 陀螺仪轨迹超越setpoint轨迹

由于遥控信号数据以“数据包”的形式输入飞控，我们实际上会得到一系列突兀的阶跃信号。由于阶跃信号的导数是数值无限高的冲激信号，这基本上是无用的。回望3.4.0，我们引入了“滤波器模式”来平滑RC信号，其对“输入信号”进行低通滤波便“圆滑”掉了阶跃信号的“棱角”；导数现在可以变成一个更宽分布的峰值值以供我们使用。然后，我们在这些值上使用了一个“导数式”低通来过滤掉峰值，将其“平滑”成每个输入信号帧的“块状”FF。将RC滤波设置为自动可使其能主动适应相对较明显的遥控信号的帧速率；设置为手动，可以根据需要微调其平滑度，但代价是产生了输入信号延迟。

目前，不稳定的RC数据帧速率是一个主要问题。对于FrSky用户来说，OpenTX 2.3可能会有所改善；而TBS正在引入一种“锁定150Hz”的模式来改善这一点。

4.1引入了几种`ff_2.0`技术来改进这些限制。

### **ff\_boost**<br>

这是一项出色的新功能，可显著减少快速移动杆位时的延迟。

大多数电机需要一定的时间来加速/减速。他们需要在姿态开始改变时更加努力旋转。FF和P都在姿态开始改变时缓慢上升，这是因为最初我们的手指移动缓慢，并且大多数飞手在他们的Rate中使用了很多的Expo。因此，直到现在，除非使用了非常高的FF增益(250+)，否则电机将不会被立刻推动。但是随着FF的增益逐渐调大，超调将变得越来越难以控制，尤其是SuperRate在摇杆行程末端被大量应用的情况下，FF在摇杆行程末端迅速变大，而我们却需要穿越机赶紧减速以避免过冲。

“ff\_boost”是一个与摇杆加速度成比例关系的PID参数。从技术上来说，它是setpoint信号的二阶导数。

作为二阶导数，`ff_boost`将在开始移动的早期阶段，即摇杆移动的瞬间，迅速达到峰值。当杆位处于行程中间部分时他会减小到0，因为在恒定的摇杆移动速率下，我们虽然会有很多FF但并不会有二阶加速度。当摇杆减速时，ff\_boost将最终变为负值。

其中的加速度组件正是我们所需要的部分，它有助于克服电机响应延迟：提前推动运动，减轻中间移动，并在最后主动减速电机。使用适当数量的FF和ff\_boost，响应敏捷的穿越机可以几乎完全无滞后地追踪遥控信号输入而不会出现过冲。

对于大多数穿越机来说，`set ff_boost = 15`是非常合适的。较大的值可以用于弱动力穿越机或者电机响应迟缓的穿越机。很少将此值提高到40以上。

增强的强度与PID中的FF量直接相关。可将ff\_boost视为调整FF应用于电机的“时间因子”。更多的ff\_boost将使FF更早增强。

能够记录黑盒日志的高级用户应该进行快速抽搐摇杆、快速左右冲刺的测试飞行，以查找FF信号的时间与数量。在理想情况下，当boost/FF搭配正确时，P应该只进行了很少的工作。

ff\_boost可以在未激活其他前馈2.0的功能的情况下独立使用。

### **ff\_interpolate\_sp**

这是从每个新RC信号数据帧中计算FF的“数字化”方式。与旧的“滤波器”方法相比，它提供了更清晰的前馈跟踪能力，并且延迟更少。

`set ff_interpolate_sp = ON`将在接收到新的RC信号数据帧时对其进行分析，计算其setpoint的变化，并立即生成一个FF步进信号。每个步进信号将在接收到下一帧数据前保持不变。

可以调整RC平滑导数或低通滤波器的截止频率来平滑掉FF在每个步进信号中产生的锐角。在默认情况下，它将在自动模式下自动调整其值，但如果需要，可以手动指定其值。对于稳定的50hz信号来说，50hz是一个比较合适的平滑值，但是50hz的信号并不是常见的信号；20hz可以充分平滑掉大部分轨迹；对于远航和电影式飞行来说这可能需要将其设置为10hz，因为在这种情况下你的连接质量会较低，会得到步长较大的的RC信号包，并且不太关心延迟。

被丢弃的RC数据包通常会导致FF突然降低至0。`set ff_interpolate_sp - AVERAGE`旨在帮助解决此特定问题。或者，降低RC平滑导数可以使输出更平滑一些，但代价是延迟增大。

### **ff\_max\_rate\_limit**

ff\_max\_rate\_limit用于衰减/防止FF在刚开始翻滚时引起的过冲。

当进行快速翻滚时，杆在达到其物理行程极限时将突然停止。随着Expo和SuperRate逐步应用于rate，Setpoint的增长率将在摇杆停止前达到最大值。在这时，穿越机本身正在进行快速转动，并且具有较大的角动量。Expo/SuperRate效果意味着FF的绝对值非常大。所有这一切，都发生在摇杆突然停止之前。

即使是有很多的D，也无法避免显著的超调。在以前的版本中，您可以使用Dmin并将D提高到足以补偿的值，但很难找到这其中的平衡。此外，转换阈值会突然触发，并且相反的一对电机必须使用全油门努力旋转，这反过来将导致其他轴上的摆动，并且使穿越机爬升。使用大量的D来控制它有其自身的危害，例如噪声和其他时候的响应性变差。

ff\_max\_rate\_limit预测性地来辨识摇杆是否达到其物理极限，并在预计这种将要发生时提前衰减FF。这种“向前看”能够在正确的时间先发制人降低FF，通常会完全消除可能会发生的过冲。

一个主要的好处是，它显著减少了对异侧电机的转动需求。快速翻滚将比以前更干净、更准确，并且在目视飞行时爬升的幅度要小很多。

默认值100- `set ff_max_rate_limit = 100`足够强大，大多数穿飞机在刚开始翻滚时力量不足；这是故意的，因为这样可以更好地避免在翻滚时再次驱动对侧电机旋转，并且这在FPV眼镜/HD视频中不会出现。将此值设置为115-1220将获得更加经典的“最佳阻尼”过冲/回弹图像，体感延迟稍低。但默认值100应该是最好的，即使是对于竞速飞行也是如此。

### **ff\_interpolate\_sp = AVERAGE**

由于FF是针对每个传入的RC数据包计算的，因此当新的数据包未按预期到达时，我们便会遇到一些问题。

通常这是由“丢弃数据包”，或者当TBS或R9接收机从150hz切换到较慢的50hz模式时所引起的，在任何时候发生这种情况时，FF通常会突然降至0；当下一个有效数据包进入时，会出现两倍幅值的步进信号。这些0/两倍幅值会导致FF轨迹十分混乱。

在AVERAGE模式下，插值算法将对每两个连续的前馈值取平均值，如果突然下降到0而随后又产生了大幅度上升，则会将其更改为一个较缓的下降，一个中位值，然后一个较缓的上升。总体而言，步长更小。

有一个小缺点：如果飞手快速打杆，然后突然保持摇杆完全静止，ff\_spread将使FF保持在设定时间前的一个高值上，而不是立即降低到0。这可能会导致延长值时间内的持续过冲。当摇杆达到物理极限时，在翻滚开始最容易看到这个现象，但也可能在其他时间发生此现象。

AVERAGED对于需要大量的RC平滑功能的对于远航/电影式飞法最有帮助。

对于竞速飞手和一般用途来说，RC链路的连接质量主要取决于你的天线有多好以及你计划飞行的距离。使用良好天线进行近距离的比赛，尤其是使用Futaba和某些RC步长一致性非常高的Spectrum遥控器，可能不需要使用这个功能。

有关技术细节和更多信息，请参阅[原始PR#8623](https://github.com/betaflight/betaflight/pull/8623)。
