第一章:执行器非线性特性——摩擦、间隙与迟滞
各位工程师朋友,咱们开始聊横向控制。很多人一上来就盯着PID参数调,觉得调好了就万事大吉。我早年也这么干过,结果呢?上了实车,方向盘回正时总差那么几度,或者低速时方向盘手感忽轻忽重。问题出在哪?说白了,就是执行器的非线性特性在捣鬼。
今天这一章,咱们就专门啃这块硬骨头。我会把摩擦、间隙、迟滞这三个“老油条”的特性掰开揉碎了讲。你想想看,如果连对手的脾气都没摸透,怎么打赢这场标定仗?
3.1 摩擦特性:无处不在的“阻力”
摩擦,说白了就是阻碍相对运动的力。在转向系统里,它无处不在。我个人习惯把摩擦分成三类来理解:
- 库仑摩擦:也叫干摩擦。大小恒定,方向永远和运动方向相反。就像你推一个箱子,推之前要克服一个“静摩擦力”,推起来之后摩擦力基本不变。
- 粘性摩擦:和速度成正比。速度越快,阻力越大。想象一下在蜂蜜里搅动勺子,搅得越快越费劲。
- Stribeck效应:这个有点意思。在低速区间,摩擦力会随着速度增加反而下降。为什么会这样?因为润滑油膜开始形成了,从“干磨”变成了“湿磨”。
核心观点: 摩擦是造成转向系统“死区”和“低速卡顿感”的元凶。标定时,我们通常需要建立“摩擦力-速度”的补偿曲线。
我在项目中遇到过一台车,低速回正时总是差2度回不到中位。排查了半天,发现是转向器内部的库仑摩擦偏大。后来我们在标定里加了一个“摩擦补偿前馈”,问题就解决了。嗯,这里要注意:补偿量不能太大,否则会引发震荡。
摩擦补偿的数学模型
实际工程中,我们常用一个简化的摩擦模型来标定:
// 伪代码:摩擦补偿计算
float frictionCompensation(float vel, float frictionStatic, float frictionCoulomb, float viscousCoeff) {
float comp = 0.0;
if (abs(vel) < VEL_THRESHOLD) {
// 低速区:考虑Stribeck效应
comp = frictionStatic * exp(-abs(vel) / VEL_STRIBECK);
} else {
// 中高速区:库仑+粘性
comp = frictionCoulomb + viscousCoeff * abs(vel);
}
// 方向判断
return sign(vel) * comp;
}
这段代码看着简单,但实际标定时有几个坑。我曾经因为VEL_THRESHOLD设得太小,导致低速时补偿频繁切换,方向盘出现抖动。后来我把阈值放宽到0.5 rad/s,才稳定下来。
避坑指南: 标定摩擦补偿时,一定要在实车上做“正反转”测试。我曾经发现正向和反向的摩擦力差了15%,原因是转向器装配不对称。这时候就需要分别标定正反向的摩擦参数。
3.2 间隙特性:齿轮与万向节的“空行程”
间隙,说白了就是“虚位”。你转动方向盘,但车轮没反应的那段角度,就是间隙。它主要来自两个地方:
- 齿轮间隙:齿轮啮合时,齿和齿之间必须有间隙,否则会卡死。但这个间隙大了,就会造成转向延迟。
- 万向节间隙:十字轴万向节在长期使用后,磨损会导致间隙增大。我记得有一台跑了10万公里的试验车,万向节间隙已经大到3度了。
你想想看,如果间隙有2度,你打方向时前2度都是“空转”,这车能好开吗?
间隙的标定方法
我个人习惯用“正反向扫描法”来标定间隙:
- 让执行器从正向缓慢转动,记录位置A。
- 反向转动,直到输出端开始移动,记录位置B。
- 间隙 = |A - B|。
下面是一个典型的间隙测试数据:
| 测试点 | 正向位置(deg) | 反向位置(deg) | 间隙(deg) |
|---|---|---|---|
| 1 | 10.0 | 8.2 | 1.8 |
| 2 | 20.0 | 18.1 | 1.9 |
| 3 | 30.0 | 28.3 | 1.7 |
从数据看,这个转向器的间隙大约在1.8度左右。标定时,我们需要在控制算法里加入一个“间隙补偿”:当检测到方向变化时,先快速补偿掉这个间隙量。
警告: 间隙补偿不能做得太激进。我曾经尝试一次性补偿2度,结果导致转向过冲,反而让驾驶员感觉更突兀。正确的做法是:分步补偿,比如先补偿70%,剩下的30%用斜坡慢慢补。
3.3 迟滞特性:系统的“记忆效应”
迟滞,说白了就是“输入和输出不是一一对应的”。你从A点转到B点,和从B点转回A点,走的不是同一条路。这就像你拉一根橡皮筋,拉长和回缩的力-位移曲线是不重合的。
在转向系统里,迟滞主要来自:
- 弹性元件的内摩擦:比如橡胶衬套、扭杆弹簧。
- 液压系统的阻尼:对于液压助力转向,油液的流动阻力会造成迟滞。
- 电机磁滞:EPS电机的铁芯磁滞效应。
迟滞最直接的感受就是:你打方向时觉得“黏糊糊”的,回正时又觉得“慢半拍”。
迟滞的建模与补偿
工程上常用“Preisach模型”或“Bouc-Wen模型”来描述迟滞。但说实话,在实车标定中,我们更常用查表法:
// 伪代码:迟滞补偿查表
float hysteresisCompensation(float currentPos, float lastPos, float lastComp) {
float delta = currentPos - lastPos;
float comp = 0.0;
if (abs(delta) < HYST_DEADBAND) {
// 小幅度变化:保持上次补偿值
comp = lastComp;
} else {
// 大幅度变化:查表获取补偿量
comp = lookupHysteresisTable(currentPos, sign(delta));
}
return comp;
}
这里有个关键点:HYST_DEADBAND的选取。我建议设为0.5度左右。太小了,系统会频繁切换补偿状态;太大了,又补偿不到位。
个人经验: 标定迟滞补偿时,一定要做“正弦扫描”测试。让方向盘以不同频率和幅度摆动,观察实际响应和理想响应的偏差。我曾经发现,在0.5Hz、5度幅度的工况下,迟滞偏差最大,达到了1.2度。针对这个工况优化补偿参数后,整车手感明显改善。
小结:三种非线性的“相爱相杀”
这三种特性不是孤立存在的。它们经常“联手作案”:
- 摩擦和间隙叠加,会造成“死区”更大。
- 迟滞和摩擦耦合,会让回正性能更差。
我个人的标定顺序是:先补偿间隙,再补偿摩擦,最后处理迟滞。为什么?因为间隙是“刚性”的,补偿起来最直接;摩擦是“速度相关”的,需要动态调整;迟滞最复杂,需要精细调参。
好了,这一章就到这里。下一章咱们聊聊如何搭建一个完整的执行器补偿框架。到时候我会分享一个我用了多年的“三阶段补偿法”,保证让你少走弯路。