PID 제어: 현재, 과거, 미래의 오차
P는 현재 오차에, I는 쌓인 오차에, D는 오차의 변화 속도에 반응합니다. 각 항의 효과와 튜닝 순서.
u = Kp·e + Ki·∫e dt + Kd·de/dt
각 항의 역할
| 항 | 반응 대상 | 올리면 |
|---|---|---|
| P | 지금의 오차 | 빨라지지만 오버슈트, 진동 증가. 정상상태 오차 남음 |
| I | 쌓인 오차 | 정상상태 오차 제거, 너무 크면 느린 출렁임 |
| D | 오차 변화 속도 | 오버슈트 억제(브레이크), 노이즈 증폭 |
코드
float pid_step(pid_t *p, float target, float meas, float dt) {
float e = target - meas;
p->integ += p->ki * e * dt;
p->integ = clamp(p->integ, -p->imax, p->imax); // 안티 와인드업
float deriv = -(meas - p->prev_meas) / dt; // 측정값 미분 (목표 급변 시 튐 방지)
p->prev_meas = meas;
return clamp(p->kp * e + p->integ + p->kd * deriv, -p->umax, p->umax);
}
튜닝 순서 (현장식)
- I, D를 0으로 두고 P를 올리며 응답이 빨라지되 진동 직전까지
- P를 조금 낮추고 I를 올려 정상상태 오차 제거
- 오버슈트가 크면 D를 조금 추가 (D 앞에 저역통과 필터)
- 외란(손으로 밀기, 무게 추가)을 주고 회복을 확인
실험실의 PID 3D 시뮬레이션에서 게인을 바꾸며 각 항의 효과를 눈으로 확인해 보세요.