한양과학기술고등학교

에듀테크 프로젝트 대시보드

PID 제어기 (PID Controller)

PID 제어기 (PID Controller)

자동차 크루즈 컨트롤은 언덕을 만나도 속도를 100km/h로 유지한다. 에어컨은 방을 정확히 24℃로 맞춘다. 드론은 바람이 불어도 제자리에 뜬다. 이 모든 것의 뒤에는 PID 제어기가 있다. 원리는 단순하다 — 목표값(setpoint)과 현재값(measurement)의 차이인 오차 e = SP − PV 를 보고, 지금 얼마나(P) · 그동안 쌓인 만큼(I) · 변하는 추세(D) 세 가지를 더해 조절량을 정한다. 아래에서 Kp, Ki, Kd 를 직접 돌려 보며 그 감을 잡아 보자.

1. 크루즈 컨트롤 시뮬레이터

노란 선이 목표 속도(setpoint), 초록 선이 실제 속도(PV)다. 중간에 언덕(외란)이 들어오면 속도가 떨어지고, 제어기가 스로틀을 더 밟아 회복한다. P·I·D 각 항의 기여는 아래 막대로 실시간 표시된다.

목표 SP100
현재 PV0
오차 e0
스로틀 u0
P — 비례 (Kp·e)
0.0
I — 적분 (Ki·∫e)
0.0
D — 미분 (Kd·de/dt)
0.0
튜닝 프리셋:
정상상태 오차(steady-state error): P만 쓰면 오차가 0이 되는 순간 P항도 0이라 스로틀이 사라져 목표에 영원히 살짝 못 미친다. I항이 이 작은 오차를 시간에 걸쳐 누적해서 밀어붙여야 0에 닿는다.

2. P · I · D — 세 항이 하는 일

P — 비례 (현재)

Kp · e(t). 지금 오차가 클수록 세게 민다. 반응이 빠르지만, 오차가 작아지면 힘도 작아져 목표에 못 미치는 정상오차가 남는다. 너무 키우면 지나쳐서 진동한다.

I — 적분 (과거 누적)

Ki · ∫e dt. 작은 오차라도 계속 쌓아 서서히 힘을 키운다. 정상오차를 없앤다. 대신 반응이 느리고, 쌓인 값이 과해지면 오버슈트·와인드업을 일으킨다.

D — 미분 (미래 예측)

Kd · de/dt. 오차가 빠르게 줄고 있으면 브레이크를 걸어 오버슈트를 줄인다. 일종의 완충기(damper). 측정 잡음을 증폭하므로 값을 작게 쓰거나 필터를 건다.

제어 신호는 세 항의 단순 합: u(t) = Kp·e + Ki·∫e dt + Kd·de/dt. 자이글러–니콜스(Ziegler–Nichols) 같은 방법으로 초기값을 잡고, 보통 P → I → D 순서로 손으로 다듬는다.

3. 이득을 올리면 응답이 어떻게 변할까

키우는 이득상승 시간오버슈트정착 시간정상오차안정성
Kp ↑빨라짐늘어남조금 변함줄지만 남음나빠짐
Ki ↑빨라짐늘어남길어짐0으로 제거나빠짐
Kd ↑거의 그대로줄어듦짧아짐영향 없음좋아짐(잡음 주의)
표는 대략적인 경향이다. 세 이득은 서로 영향을 주고받아서 한 칸만 보고 튜닝할 수는 없다. 실제로는 시뮬레이터처럼 스텝 입력 응답을 보며 오버슈트와 정착 시간이 만족스러울 때까지 반복한다.

4. 제어 루프 (의사 코드)

# 매 제어 주기(dt)마다 한 번씩 호출된다 integral = 0 prev_error = 0 def pid_step(setpoint, measurement, dt): global integral, prev_error error = setpoint - measurement # e(t) integral += error * dt # ∫e dt (직사각형 누적) derivative = (error - prev_error) / dt # de/dt P = Kp * error I = Ki * integral D = Kd * derivative output = P + I + D # 액추에이터 한계로 클램프 + 적분 와인드업 방지 if output > U_MAX: output = U_MAX; integral -= error * dt if output < U_MIN: output = U_MIN; integral -= error * dt prev_error = error return output
적분 와인드업(integral windup): 출력이 최대치에 걸려 있는데도 오차가 계속 적분되면 integral 이 거대해진다. 나중에 방향이 바뀌어도 그 값이 빠지는 데 한참 걸려 큰 오버슈트가 난다. 그래서 포화 상태에서는 적분을 멈추거나 되돌린다(anti-windup).