先看代码
python
# PID控制器类(机器人/电机控制通用)
class PIDController:
def __init__(self, kp, ki, kd):
self.kp = kp # 比例
self.ki = ki # 积分
self.kd = kd # 微分
self.error_sum = 0
self.last_error = 0
# 计算输出
def calculate(self, target, current):
error = target - current
self.error_sum += error
error_diff = error - self.last_error
output = self.kp * error + self.ki * self.error_sum + self.kd * error_diff
self.last_error = error
return output
# ========== 测试PID ==========
if __name__ == "__main__":
# 创建PID控制器
pid = PIDController(kp=0.6, ki=0.1, kd=0.05)
target_pos = 100 # 目标位置
current_pos = 0 # 当前位置
print("目标位置:", target_pos)
for i in range(15):
output = pid.calculate(target_pos, current_pos)
current_pos += output
print(f"第{i+1}次调整 → 当前位置:{current_pos:.1f}")
拆解代码,对应 PID 三大项
| 代码行 | 对应 PID 项 | 作用 |
|---|---|---|
error = target - current |
误差计算 | 目标值 - 当前值,是 PID 的输入 |
self.error_sum += error |
积分项 (I) | 累积历史误差,消除静态偏差 |
error_diff = error - self.last_error |
微分项 (D) | 误差变化率,抑制超调、提前刹车 |
output = kp*error + ki*error_sum + kd*error_diff |
三项加权求和 | PID 核心输出,直接控制执行器(电机 / 阀门) |
self.last_error = error |
更新历史误差 | 为下一次微分计算做准备 |
✅ 核心原理 100% 通用
不管是:
- 机器人电机速度 / 位置控制
- 光刻机精密定位
- 无人机姿态稳定
- 工业温控 / 液位控制
- 自动驾驶车辆控制
核心逻辑都是:「误差驱动」→ 比例 (P) 快速响应 + 积分 (I) 消除静差 + 微分 (D) 抑制超调,公式结构完全一致。
⚠️ 只有「实现形式」的区别,原理不变
常见的变体只是写法不同,本质完全一样:
-
增量式 PID (嵌入式 / 电机控制常用)只计算输出的增量
Δu,而非绝对输出,避免积分饱和,公式是位置式的变形:delta_output = kp*(error-last_error) + ki*error + kd*(error-2*last_error+prev_last_error)👉 本质还是 P+I+D 三项,只是换了计算方式。
-
带限幅 / 抗积分饱和的 PID给积分项加限制、输出限幅,防止执行器饱和,只是在核心公式外做了保护,原理不变。
-
模糊 PID / 自适应 PID 只是用算法动态调整
kp/ki/kd三个参数,核心的三项计算逻辑完全没变。
可以把之前的 PID 代码改个参数,比如把kp调大、kd调小,看位置曲线的变化:
kp越大:响应越快,但容易超调ki越大:静差消除越快,但容易震荡kd越大:超调越小,但响应变慢
这就是 PID 调参的核心,也是控制工程师的基本功