尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

第185篇 PID微分滤波——微分噪声放大的工程处理

第185篇 PID微分滤波——微分噪声放大的工程处理 上篇讲抗积分饱和时我提到D项是双刃剑。锋利的一面是减小超调、提高稳定性另一面——对高频噪声极度敏感——往往被教科书一笔带过。仿真里跑PID微分项干干净净因为仿真信号没有噪声。一到真实系统编码器量化噪声、IMU高频抖动、ADC采样波动全被微分项放大控制输出像发了疯一样抖。讲真很多新手第一次在实际系统上跑PID都会被微分噪声吓一跳——电机发出嘶嘶的高频声控制输出曲线像锯齿一样。这就是微分噪声放大的典型表现。今天把微分噪声放大的问题讲透——为什么放大、多严重、工程上怎么处理。面试高频考点特别是机器人、无人车岗位。微分为什么是噪声放大器先回忆一下微分项的公式D Kd * de/dt。本质是看误差的变化率。误差变化快微分输出大变化慢输出小。问题出在哪噪声信号的特点就是变化快。高频噪声叠加在有用信号上变化率远大于有用信号。微分项一算导数噪声的变化率被放大了有用信号反而被淹没。用数学来说更直观。信号 y sin(t) 0.01*sin(100t)后面那项是高频噪声幅值只有0.01看起来很小。求导后dy/dt cos(t) cos(100t)。噪声导数幅值从0.01变成了1——放大100倍频率越高放大越厉害。这就是微分项的致命缺陷。import numpy as np t np.linspace(0, 1, 1000) dt t[1] - t[0] noise 0.01 * np.sin(2*np.pi*100*t) noise_deriv np.diff(noise) / dt print(f放大倍数: {np.max(np.abs(noise_deriv))/np.max(np.abs(noise)):.0f}) # 输出约100倍——跟频率比一致实际系统中纯微分几乎不可用。编码器分辨率1000线转一圈输出1000个脉冲量化误差±0.5个脉冲。采样频率1kHz微分项一算量化误差被放大到不可接受。电机输出跟着抖站在旁边都能听到嘶嘶响。你用手摸电机轴能明显感觉到高频振动。工程上的三种处理方案方案一低通滤波器最常用。在微分之前先对信号做低通滤波把高频噪声滤掉。最常用的一阶低通滤波器class PIDWithFilter: def __init__(self, kp, ki, kd, filter_tau0.01): self.kp, self.ki, self.kd kp, ki, kd self.tau filter_tau self.integral 0.0 self.prev_error 0.0 self.filtered_d 0.0 def update(self, error, dt): self.integral error * dt raw_d (error - self.prev_error) / dt alpha dt / (self.tau dt) self.filtered_d alpha*raw_d (1-alpha)*self.filtered_d output self.kp*error self.ki*self.integral self.kd*self.filtered_d self.prev_error error return output滤波器的关键参数是tau时间常数。tau越大滤波越强噪声滤得越干净但相位延迟也越大——系统响应会变慢。经验法则tau选为采样周期的2-5倍或者对应截止频率选为系统带宽的3-5倍。之前面试一家做无人车的公司面试官问你的横向控制PID微分项加了滤波吗我说加了一阶低通。面试官追问tau怎么选的我说先按采样周期的3倍设然后跑实际路段看控制输出的抖动情况。还抖就加大tau响应太慢就减小tau。关键是找到噪声抑制和相位延迟之间的平衡点。面试官点了点头。方案二对测量值微分而非误差微分。标准PID对误差etarget-measured求导。但目标值突变时比如阶跃信号误差导数在跳变瞬间会出一个很大的脉冲导致控制输出瞬间打满。改成只对measured求导取负号就避免了这个问题。因为measured是物理量不会突变它的导数总是有限的。代码很简单把raw_d (error - self.prev_error) / dt改成raw_d -(measured - self.prev_measured) / dt。这个方案在机械臂轨迹跟踪里特别有用——轨迹指令一段一段的每段终点是阶跃。微分作用于误差的话每次换段都会抖一下。对测量值微分就完全没这个问题。方案三不完全微分Partial Derivative。把微分项的传递函数从Gd(s)Kds改成Gd(s)Kds/(1s*Tf)Tf是滤波系数。离散化后不完全微分的实现形式就是当前微分输出 上一时刻微分输出经过衰减 当前误差变化量经过加权。本质上就是一阶低通滤波加在微分通道上工业控制器里用得很多。参数Tf物理意义直观——直接对应微分项的截止频率。滤波器参数的工程选择tau或Tf的选择是门手艺。选太小噪声滤不干净选太大相位延迟太大。我的经验法则先对传感器信号做FFT找到主要噪声频率截止频率设在噪声频率的1/3到1/5。比如编码器噪声主要在500Hz以上截止频率设100-170Hz对应tau约1-1.6ms。还有一种更直接的方法调tau从小到大观察控制输出在高频段的能量变化。高频能量降到可接受水平时tau就合适了。之前面试一家做四旋翼的公司面试官问你PID的微分滤波截止频率怎么选的我说先看IMU噪声频谱陀螺仪的高频噪声主要在200Hz以上截止频率设在50Hz。面试官追问为什么不是100Hz我说四旋翼姿态控制带宽大概10-20Hz50Hz截止频率已经留了足够裕量。100Hz虽然相位延迟更小但200Hz附近噪声滤得不够干净。面试官说这个回答很实在。还有一个容易踩的坑滤波器参数不要写死在代码里。不同传感器的噪声特性不一样编码器、IMU、力矩传感器的噪声频率分布完全不同。好的做法是把滤波参数做成可配置的通过参数文件或ROS参数服务器来设置方便调试和切换。面试中怎么聊微分滤波面试官问微分噪声怎么处理标准答案是加低通滤波。想拿高分得说更深入微分增益随频率线性增长所以在微分通道加低通滤波限制高频增益。截止频率要高于系统带宽但低于噪声频率一般取噪声频率的1/3到1/5。面试官追问一阶不够用怎么办你可以说用二阶巴特沃斯滤波器衰减斜率从-20dB/dec变-40dB/dec。但二阶相位延迟更大设计要更小心。还有一种高级方案是卡尔曼滤波去噪同时保留有用信号但计算量大嵌入式不一定跑得动。微分噪声放大是PID从理论走向实践的又一个坑。教科书上的微分项是完美的但实际传感器信号都有噪声纯微分会把噪声放大到不可接受的程度。加低通滤波是最基本的工程处理参数选择需要根据实际噪声特性来定。总结一下今天的内容微分项对噪声敏感的根本原因是微分增益随频率线性增长解决方案是在微分通道加低通滤波器工程上最常用一阶低通滤波等价于不完全微分也可以用对测量值微分来避免目标值突变引起的脉冲。参数选择上截止频率要高于系统带宽但低于噪声频率一般取噪声频率的1/3到1/5。掌握这些面试里关于PID的工程问题你就基本能应付了。下一篇讲前馈控制——提升跟踪精度的补充手段。PID是反馈控制本质是出了错再纠正。但有些场景等到出错再纠正已经晚了——比如机器人高速行走时需要在脚落地前提前发力。前馈控制就是为了解决这类问题而生的。如果这篇文章对你有帮助欢迎点赞、在看、转发三连。 你的支持是我持续更新的最大动力。「机器人软件开发面试·从入门到精通」连载系列上一篇第184篇 PID抗积分饱和——积分windup的原因和解决方案下一篇预告第186篇 前馈控制——提升跟踪精度的补充手段有任何问题欢迎评论区留言我会尽量回复。
返回列表