第1章:补偿控制原理——前馈补偿与反馈补偿

各位工程师朋友,咱们今天聊聊转向执行器补偿的核心问题。说白了,就是怎么让方向盘指哪打哪,没有延迟、没有抖动、没有死区。

我刚开始做底盘标定时,遇到过一台车,低速时转向手感还行,一上高速就感觉方向盘“粘”在中间,微调时特别费劲。后来查来查去,发现是执行器的摩擦补偿没做好。嗯,这就是我们今天要讲的内容。

1.1 前馈补偿:提前预判,主动出击

前馈补偿,我的理解就是“先发制人”。系统还没出问题,我先给它一个修正量。

举个例子。你开车过弯,方向盘需要转一个角度。如果只靠反馈控制,那得等实际角度偏离目标了,控制器才开始调整。这就有延迟了。

前馈补偿的思路是:根据当前车速、方向盘转角速度、路面附着系数等信号,提前算出一个补偿力矩,直接加到执行器上。

核心公式(简化版):

T_feedforward = K_ff * (θ_dot) + C_ff * (v)

其中:

  • T_feedforward:前馈补偿力矩
  • K_ff:速度前馈增益
  • θ_dot:方向盘角速度
  • C_ff:阻尼前馈系数
  • v:车速

我在项目中遇到过一个问题:前馈增益调得太大,转向会变得“贼”,稍微一动方向盘,车就猛打方向。调小了又感觉转向响应慢。这其实是个平衡问题,需要结合实车手感来标定。

我的经验:前馈补偿的标定,建议先从低速工况开始。低速时轮胎力小,执行器响应快,容易观察补偿效果。等低速调顺了,再往高速延伸。

1.2 反馈补偿:实时纠偏,闭环修正

反馈补偿就更好理解了——看实际输出和期望值之间的差距,然后把这个差距补回来。

你想想看,前馈补偿再准,也难免有误差。比如轮胎磨损了、路面湿滑了、执行器老化导致响应变慢了。这些前馈算不到的东西,就得靠反馈来兜底。

最常见的反馈补偿就是PID控制。我习惯用PD结构,因为积分项在转向控制里容易引起积分饱和,反而坏事。

// 伪代码示例:PD反馈补偿
error = target_angle - actual_angle;
P_term = Kp * error;
D_term = Kd * (error - last_error) / dt;
T_feedback = P_term + D_term;
last_error = error;

注意:反馈补偿的采样频率很关键。我见过有人把采样频率设到100Hz,结果转向执行器根本跟不上,反而引起震荡。一般来说,50Hz到100Hz之间比较合适,具体要看执行器的带宽。

1.3 前馈与反馈的配合:双剑合璧

前馈和反馈不是二选一的关系,而是搭档。前馈负责“大头”,反馈负责“小头”。

我个人的标定习惯是:

  1. 先调好前馈,让系统在理想工况下基本能跟上目标
  2. 再调反馈,把前馈没覆盖到的误差吃掉
  3. 最后做极限工况验证,比如急转弯、冰雪路面

说白了,前馈把80%的活干了,反馈只干剩下的20%。这样反馈的负担轻,系统也更稳定。

1.4 死区补偿策略:别让方向盘“空转”

死区,就是执行器在某个小范围内,输入信号变了但输出没反应。这很烦人,尤其在高速微调时,你转了一点方向盘,车没反应,再转多一点,车又突然动了。

死区补偿的思路很简单:检测到输入在死区范围内时,额外加一个“突破力矩”,帮执行器越过死区。

死区补偿公式:

if (|input| < deadzone_threshold) {
    T_deadzone = sign(input) * DZ_compensation;
} else {
    T_deadzone = 0;
}

我曾经吃过一个亏:死区补偿给得太猛,结果方向盘在中间位置附近来回抖动,像“点头”一样。后来把补偿值设成随车速变化,低速时补偿大一点,高速时补偿小一点,问题就解决了。

避坑指南:死区阈值不要设得太小,否则执行器频繁进出死区,反而引起抖动。我一般设到执行器实际死区宽度的80%左右,留点余量。

1.5 摩擦补偿策略:LuGre模型与Karnopp模型

摩擦是转向执行器的老对手了。低速时摩擦大,转向手感重;高速时摩擦小,又容易感觉“飘”。

这里介绍两个经典模型。

LuGre模型

LuGre模型把摩擦分成两部分:静摩擦和动摩擦。它用一个“鬃毛”的比喻来解释——两个接触面之间有很多微小的鬃毛,受力时鬃毛会弯曲,产生摩擦力。

// LuGre模型简化实现
z_dot = v - (|v| / g(v)) * z;
g(v) = Fc + (Fs - Fc) * exp(-(v/vs)^2);
F_friction = σ0 * z + σ1 * z_dot + σ2 * v;

这个模型的好处是能模拟出低速时的“粘滑”现象。我调试EPS(电动助力转向)时用过它,效果不错,但参数比较多,标定起来有点费劲。

Karnopp模型

Karnopp模型就简单多了。它设定一个速度阈值,低于这个阈值就按静摩擦处理,高于阈值就按动摩擦处理。

if (|v| < v_threshold) {
    // 静摩擦区
    F_friction = F_static * sign(F_applied);
} else {
    // 动摩擦区
    F_friction = F_dynamic * sign(v);
}

我的建议:如果项目周期紧,用Karnopp模型就够了。LuGre模型虽然更精确,但参数标定工作量翻倍。我一般先上Karnopp,等系统稳定了再考虑升级到LuGre。

1.6 小结

这一章我们聊了补偿控制的几个核心思路:

  • 前馈补偿:提前算,主动给
  • 反馈补偿:看误差,实时补
  • 死区补偿:突破死区,别让方向盘“空转”
  • 摩擦补偿:LuGre模型精细但复杂,Karnopp模型简单实用

下一章我们会深入讲标定流程,包括怎么在实车上调这些参数。到时候我会分享一些具体的标定数据和曲线,咱们不见不散。