4. 位置环控制模型:PID控制器在位置环中的应用
聊到位置环,很多刚入行的朋友第一反应就是:「不就是个PID嘛,调调参数就好了。」
嗯,这话对了一半。PID确实是位置环的基石,但怎么用、用在哪、要不要加前馈,这里面的门道可不少。我做了十几年电机控制,踩过的坑比调过的参数还多。今天咱们就把位置环的PID控制模型掰开揉碎了讲清楚。
4.1 位置环的P控制:最朴素但最实用
先看最简单的比例控制。说白了就是:当前位置和目标位置差多少,我就给多大比例的力。
// 位置环P控制伪代码
float position_error = target_position - current_position;
float torque_output = Kp * position_error;
这个Kp就是比例系数。Kp越大,响应越快,但容易过冲甚至震荡。Kp太小,又像个老牛拉车,半天到不了位。
我在项目中遇到过一个典型的案例:做一款桌面机械臂,要求定位精度0.1mm。一开始我用了纯P控制,Kp调到30左右,响应速度还行,但稳态误差始终有0.3mm左右。为什么?因为纯P控制天生就有静差——当误差小到一定程度,输出的力矩刚好被摩擦力抵消,系统就停在那不动了。
核心结论:纯P控制适用于对精度要求不高、负载变化不大的场景。如果要求高精度定位,必须引入积分项或前馈。
4.2 位置环的PD控制:加一点阻尼,稳如老狗
纯P控制的问题在于:它只看「差了多少」,不看「跑得多快」。你想想看,如果位置误差很大,P控制器会猛推一把,结果电机冲过头了,再反向拉回来,来回震荡。
这时候就需要D项——微分控制。D项看的是误差的变化率,说白了就是「速度」。误差变化越快,D项给的阻尼力就越大。
// 位置环PD控制伪代码
float position_error = target_position - current_position;
float error_derivative = (position_error - last_position_error) / dt;
float torque_output = Kp * position_error + Kd * error_derivative;
我个人习惯在调试时先调好P,再慢慢加D。D加多了系统会变得「僵硬」,响应变慢,甚至高频噪声会被放大。我记得有一次调试高速贴片机,D加得太大,电机在目标位置附近高频抖动,声音都变了。后来把D降了一半,再配合低通滤波,才稳定下来。
避坑指南:我曾经在位置环里直接用编码器速度做微分项,结果噪声大得离谱。后来改用「位置误差的差分+一阶低通滤波」,效果好了很多。记住:微分项对噪声极其敏感,一定要做滤波处理。
4.3 前馈控制:让位置环「预判」你的预判
PID控制本质上是被动的——它等误差出现了才去纠正。但有些场景下,误差还没出现,我们就知道系统会怎么走。比如轨迹规划中,目标位置一直在变化,PID会一直追着跑,永远有滞后。
前馈控制就是解决这个问题的。它根据目标位置的预期变化,提前给一个补偿量。
// 位置环PID+前馈控制伪代码
float position_error = target_position - current_position;
float error_integral += position_error * dt;
float error_derivative = (position_error - last_position_error) / dt;
// 前馈项:根据目标速度计算
float feedforward = Kff * target_velocity;
float torque_output = Kp * position_error
+ Ki * error_integral
+ Kd * error_derivative
+ feedforward;
前馈系数Kff怎么定?理论上,如果系统模型准确,Kff应该等于系统的逆模型增益。但实际中,我一般先估算一个值,然后通过实验微调。
我建议在以下场景优先考虑前馈:
- 高速运动控制(如伺服冲压、高速分拣)
- 轨迹跟踪精度要求高(如CNC加工、机器人插补)
- 负载惯量变化大(如协作机器人抓取不同重物)
注意:前馈控制依赖模型精度。如果模型误差太大,前馈反而会引入扰动。我曾经在负载惯量估算错误的情况下加了前馈,结果系统在加减速时反而震荡得更厉害。所以前馈要「先建模,再补偿」,别盲目加。
4.4 位置环控制模型知识体系
下面这张图是我自己整理的,把位置环的几种控制策略和适用场景串了起来。你可以把它当作调试时的「导航图」。
4.5 实际调试中的参数整定思路
讲了这么多理论,最后分享一点实战经验。位置环的参数整定,我一般按这个顺序来:
- 先调P:从小到大加,直到系统出现轻微震荡,然后回调到震荡幅度的60%~70%。
- 再加D:从0开始慢慢加,观察阶跃响应的过冲和稳定时间。过冲太大就加D,响应太慢就减D。
- 最后考虑前馈:如果轨迹跟踪误差呈现「滞后」特征(误差方向与运动方向一致),说明需要加前馈。先估算Kff = 1/系统增益,再微调。
一个小技巧:我习惯在调试时同时观察位置误差和速度曲线。如果位置误差在加速阶段为正、减速阶段为负,说明前馈不足。反过来,如果误差符号与运动方向相反,说明前馈过大了。
位置环的控制,说难不难,说简单也不简单。关键是要理解每个环节的物理意义,而不是盲目调参。你想想看,当你真正理解了P、D、前馈各自在「对抗」什么物理量,调试起来就有方向了。
好了,这一章就到这里。下一章我们会深入位置环的离散化实现和采样周期的影响,到时候再聊。