제2부 고전 제어: 해석과 설계
2.5 PID 제어
제2부 고전 제어: 해석과 설계 · 설계의 핵심. 산업 제어 루프의 압도적 다수가 PID다. 세 항(비례·적분·미분)의 물리적 의미, 튜닝(Ziegler-Nichols 등), 그리고 실무에서 반드시 부딪치는 함정(도함수 킥·미분 잡음·적분 와인드업)까지 — 이 장이 책에서 가장 자주 손으로 쓸 도구다.
이 장을 마치면 PID 세 항이 폐루프에 무엇을 하는지 설명하고, 임계이득법·반응곡선법·수동으로 튜닝하며, 실물(제7부 7.2)에서 통하는 현실적인 PID를 코드로 쓸 수 있어야 한다.
2.5.1 왜 PID — 가장 많이 쓰는 제어기
산업 제어 루프의 90% 이상이 PID(또는 그 부분집합 P·PI)다. 이유:
- 모델이 거의 필요 없다: 정밀한 전달함수 없이도 세 조정 변수($K_p, K_i, K_d$)를 조정해 튜닝할 수 있다.
- 직관적: 각 항이 "현재·과거·미래 오차"라는 분명한 의미를 갖는다(2.5.2).
- 충분히 강력: 1·2차 플랜트 대부분을 잘 다룬다.
그렇다고 모든 문제를 해결하지는 않는다 — 한계는 2.5.9에서 정직하게 다룬다. 먼저 왜 통하는지부터.
2.5.2 세 항의 물리적 의미
오차 e(t) = r − y를 받아, 세 항을 더해 제어입력을 만든다:
$$u(t) = \underbrace{K_p \cdot e(t)}_{\text{P: 현재}} + \underbrace{K_i \int_0^t e\,d\tau}_{\text{I: 과거 누적}} + \underbrace{K_d \cdot \frac{de}{dt}}_{\text{D: 변화율(미래)}}$$
폐루프로 그리면 셋이 오차 $e$를 나눠 갖고 병렬로 더해져 $u$가 되는 구조다:
2.5.2.1 P (비례) — 현재 오차
$K_p\cdot e$. 지금 오차에 비례해 입력을 낸다(0.1.4.1). $K_p$↑ → 빠르고 정상상태 오차 감소, 하지만 오버슈트↑·안정 여유↓(2.4). 그리고 P만으로는 잔류 오차가 남는다(형 0, 1.3.6): 난방이 24 ℃에 못 미친 채 멈춘 그 현상.
2.5.2.2 I (적분) — 과거 오차의 누적
$K_i\cdot\int e$. 오차가 조금이라도 남아 쌓이는 한 입력을 계속 키워 정상상태 오차를 0으로 만든다. 개루프에 적분기($1/s$)를 더해 시스템 형을 높이기 때문이다(1.3.6). 대가: 적분기는 위상을 −90° 늦춰 안정 여유를 줄이고(2.4), 오버슈트·와인드업(2.5.6.3)을 부른다.
2.5.2.3 D (미분) — 미래 오차의 예측
$K_d\cdot(de/dt)$. 오차의 변화율을 보고 "이대로면 곧 어떻게 될지"를 예측해 미리 제동한다 → 감쇠를 더해 오버슈트를 줄이고 안정 여유를 높인다(위상 앞섬). 대가: 미분은 고주파 잡음을 증폭한다(1.2.3의 임프로퍼) → 반드시 필터가 필요하다(2.5.6.2).
한 줄: P는 속도, I는 정확도(오차 0), D는 안정(감쇠). 셋은 서로 상충해 — 튜닝은 이 셋의 균형을 맞추는 일이다.
2.5.3 공식과 형태들
라플라스로 옮기면 제어기 전달함수:
- $C(s) = K_p + K_i/s + K_d\cdot s$ (병렬형, parallel)
- $= K_p\cdot(1 + 1/(T_i\cdot s) + T_d\cdot s)$ (표준형, standard)
- $= K_p'\cdot(1 + 1/(T_i'\cdot s))\cdot(1 + T_d'\cdot s)$ (직렬형, series/interacting)
- 병렬형: 세 이득 $K_p, K_i, K_d$가 독립. ($K_i=K_p/T_i$, $K_d=K_p\cdot T_d$.)
- 표준형: $T_i$=적분시간, $T_d$=미분시간. 튜닝 규칙(Z-N)이 흔히 이 형태로 준다.
- 직렬형(series/interacting): 옛 아날로그 컨트롤러가 PI 단과 PD 단을 물리적으로 직렬로 이었던 구조 그대로 — $(\mathrm{PI})\cdot(\mathrm{PD})$처럼 곱셈이라 항끼리 상호작용(interacting)한다(병렬형·표준형은 덧셈이라 항이 독립). 직렬형을 전개하면
$$C(s) = K_p'(1+T_d'/T_i') + K_p'T_d'\cdot s + [K_p'/T_i']/s$$
이므로 표준형과 대응시키면 직렬 → 표준 변환은
$$K_p = K_p'\cdot(1 + T_d'/T_i'), \qquad T_i = T_i' + T_d', \qquad T_d = T_i'\cdot T_d' / (T_i' + T_d')$$
거꾸로 표준 → 직렬은 $x^2 - T_i\cdot x + T_i\cdot T_d = 0$을 풀어 두 근을 {Ti', Td'}로 배정한다(큰 근이 Ti') — 이 근이 실수이려면 판별식 $T_i^2 - 4\cdot T_i\cdot T_d \ge0$, 즉 $T_i \ge4\cdot T_d$가 필요하다. 그래서 직렬형은 표준형보다 표현력이 좁다: $T_i < 4T_d$인(미분이 적분시간에 비해 상대적으로 센) 표준형 PID는 직렬형으로 정확히 못 옮긴다 — 벤더 PID 블록(지멘스·로크웰 등)이 직렬형을 쓴다면, 이 조건부터 확인해야 "같은 PID인데 이득이 안 맞는다"는 함정을 피한다.
2.5.4 폐루프에 미치는 효과 — 튜닝 직관 표
각 이득을 독립적으로 키울 때 폐루프 계단응답의 대략적 경향(설계 출발 어림):
| 키우면 | 상승시간 | 오버슈트 | 정착시간 | 정상상태 오차 | 안정성 |
|---|---|---|---|---|---|
| Kp↑ | 감소 | 증가 | 작은 변화 | 감소 | 악화 |
| Ki↑ | 감소 | 증가 | 증가 | 제거 | 악화 |
| Kd↑ | 작은 변화 | 감소 | 감소 | 영향 없음 | 좋아짐(잡음 관리 시) |
⚠️ 이 표는 독립 변경의 거친 경향일 뿐, 항들은 상호작용한다. 한 항을 크게 바꾸면 다른 칸의 부호가 반전될 수 있다. 표는 방향 감각, 최종 확인은 시뮬레이션·실측(2.5.8).
2.5.5 튜닝 — 여러 길 (트레이드오프)
PID 값을 정하는 길은 여럿이다. 강요하지 않는다 — 장단을 펼친다.
2.5.5.1 ① Ziegler-Nichols 임계이득법 — 2.1의 임계이득 활용
I·D를 끄고 $K_p$만 키워 폐루프가 지속 진동(경계)하는 임계이득 $K_u$와 그 진동주기 $T_u$를 찾는다 — 바로 2.1.6·2.2.4의 임계이득·임계진동수다.
| 제어기 | Kp | Ti | Td |
|---|---|---|---|
| P | $0.5 K_u$ | — | — |
| PI | $0.45 K_u$ | $T_u/1.2$ | — |
| PID | $0.6 K_u$ | $0.5 T_u$ | $0.125 T_u$ |
예제(2.1.6): $L=K/[s(s+1)(s+2)]$는 $K_u=6$, $\omega_c=\sqrt2$ → $T_u=2\pi/\omega_c\approx4.44 \,\mathrm{s}$. Z-N PID:
- $K_p = 0.6\cdot 6 = 3.6$, $T_i = 0.5\cdot 4.44 = 2.22\,\mathrm{s}$, $T_d = 0.125\cdot 4.44 = 0.555\,\mathrm{s}$
- → $K_i = K_p/T_i \approx 1.62$, $K_d = K_p\cdot T_d \approx 2.0$
장점: 모델 없이 실험으로. 단점: 불안정 직전까지 이득을 높여야 하고(위험·불가한 플랜트 多), 결과가 공격적(오버슈트 ~25%)이라 보통 추가 보정이 필요하다.
2.5.5.2 ② Z-N 반응곡선법 — FOPDT 모델 활용
개루프 계단응답에서 $K, \tau, L$(FOPDT, 1.4.4.1)을 얻어 표로:
- PID: $K_p = 1.2\cdot\tau/(K\cdot L)$, $T_i = 2L$, $T_d = 0.5L$
장점: 불안정까지 이득을 높이지 않아도 됨(개루프 계단 1회). 단점: 지연 $L$이 지배적이면 부정확. 변형이 많다(Cohen-Coon 등) — 어느 규칙도 출발점일 뿐.
2.5.5.3 ③ 수동·휴리스틱 튜닝 (현장에서 흔히 사용)
1) Ki=Kd=0. Kp를 진동 직전까지 높여 응답을 빠르게.
2) 정상상태 오차가 남으면 Ki를 조금씩 키워 0으로 (너무 키우면 오버슈트·느려짐).
3) 오버슈트·진동이 크면 Kd를 더해 감쇠 (잡음 심해지면 미분필터·Kd↓).
4) 외란·계단 응답을 보며 1~3 반복.
장점: 직관적, 어떤 플랜트든. 단점: 경험 의존, 재현성 낮음. — 표(2.5.4)를 손에 들고 하면 빠르다.
2.5.5.4 ④ 모델 기반 (극배치·λ·IMC)
모델이 있으면 폐루프 극을 원하는 자리에 놓도록 이득을 역산한다(극배치, 4.3와 같은 계열). FOPDT엔 λ-튜닝(원하는 폐루프 시정수 λ 지정)·IMC가 간결하다. 장점: 체계적·재현 가능. 단점: 모델 정확도에 의존.
FOPDT $G(s) = K\cdot e^{-Ls}/(\tau s+1)$(1.4.4.1)에 대한 IMC 기반 PI 공식(지연을 1차 파데 근사해 유도, 표준형 2.5.3 기준):
$$K_p = \tau / [K\cdot(\lambda + L)], \qquad T_i = \tau \qquad (\to K_i = K_p/T_i)$$
$\lambda$(람다, 원하는 폐루프 시정수)가 설계자가 정하는 유일한 조정 변수다 — $\lambda$↓ = 더 빠르지만 여유(2.4) 감소, $\lambda$↑ = 느리지만 강인. 흔한 출발점은 $\lambda\approx L$(지연만큼만 빠르게, 공격적)~$\lambda\approx\tau$(보수적).
숫자 예(1.4.4.1의 그 FOPDT: $K=2, \tau=3 \,\mathrm{s}, L=1 \,\mathrm{s}$): $\lambda=1 \,\mathrm{s}$(=$L$, 공격적)로 설정하면
- $K_p = 3/[2\cdot(1+1)] = 0.75$, $T_i = 3\,\mathrm{s}$ → $K_i = 0.75/3 = 0.25$
$\lambda$를 $2 \,\mathrm{s}$로 늘리면 $K_p=3/[2\cdot3]=0.5$로 더 완만해진다 — λ를 키우는 것과 GM·PM 여유를 늘리는 것은 같은 방향이라는 점에서 2.4의 여유·트레이드오프 감각이 여기서도 그대로 통한다. 미분까지 쓰려면(PID) 지연을 2차 파데로 근사해 유도하거나 $T_d$를 별도 규칙(예: $T_d=L/2$)으로 더하는 변형이 흔하다 — 이 역시 출발점이며 검증이 필요하다.
누구에게: 빠른 현장 = ③ 수동, 모델 있음 = ④, 실험만 가능·위험 감수 가능 = ①, 개루프 안정·지연계 = ②. 어느 길이든 결과는 반드시 검증하고, 규칙값을 출발점 삼아 직접 미세조정하라.
2.5.6 현실의 함정 — 실무 PID
교과서 공식 $K_p+K_i/s+K_d s$를 그대로 구현하면 실물에서 사고가 난다. 실무 PID는 다음을 반드시 보완한다(제7부 7.2에 직결).
2.5.6.1 도함수 킥 → 오차 대신 측정값을 미분
설정점 $r$이 계단으로 바뀌면 de/dt에 임펄스 스파이크(도함수 킥)가 생겨 액추에이터에 충격을 가한다. 해결: D항을 $e$ 대신 −y(측정값)에 적용 — $r$은 보통 계단이고 $y$는 부드러우므로 킥이 사라진다. (d e/dt = dr/dt − dy/dt에서 dr/dt를 제외하는 것.)
2.5.6.2 미분 잡음 → 미분 필터
순수 미분 $K_d\cdot s$는 임프로퍼(1.2.3)라 고주파 잡음을 무한 증폭한다. 필터를 단 미분으로 바꾼다:
$$K_d\cdot s \quad\to\quad K_d\cdot s / (1 + s/N)$$ — $N \approx 8{\sim}20$, 필터 계수
$N$이 작을수록 잡음에 강하지만 미분 효과가 둔화된다 — 트레이드오프.
2.5.6.3 적분 와인드업 → 안티와인드업
액추에이터가 포화(전압·토크 한계)되면 실제 출력은 멈췄는데 적분기는 오차를 계속 쌓아 거대해진다. 포화에서 벗어날 때 그 누적이 거대한 오버슈트로 이어진다(와인드업). 대책:
- 조건부 적분(clamping): 포화 중이면 적분 누적을 멈춘다.
- 백계산(back-calculation): 포화로 잘린 양
(u − u_sat)을 이득 $1/Tt$로 적분기에 되먹여, 적분기가 포화 출력을 추종하게 한다($Tt \approx T_i$).
백계산 구조를 그리면:
포화가 걸리지 않으면 u = u_sat이라 되먹임 항이 0 — 평소에는 아무 영향이 없다가, 포화 때만 개입해 적분기를 "실제로 나가는 만큼"만 쌓이도록 제한한다.
2.5.6.4 설정점 가중·2자유도, 범프리스
- 설정점 가중(2-DOF): P·D항에 가중치 $b, c$를 둬($K_p(b\cdot r - y)$ 등) 추종 응답과 외란 응답을 따로 형성한다. 오버슈트를 줄이는 흔한 실무 기법.
- 범프리스 전환(bumpless): 수동↔자동, 게인 변경 시 출력이 튀지 않게 적분기를 초기화. 자동튜너·모드 전환에 필수.
심화: 설정점 가중은 단일 PID 루프 안에서 가장 단순한 2자유도다. 전치필터·피드포워드·종속(cascade)까지 포함한 제어 구조 일반은 7.7을 참고.
2.5.7 코드로 — 이산 PID (실무형)
위 함정을 다 반영한 이산 PID 한 사이클(제3부 3.3에서 이론, 제7부 7.2에서 ROS2화):
# 매 dt(고정 주기)마다 호출
def pid_step(r, y, st, Kp, Ki, Kd, N, dt, u_min, u_max, Tt):
e = r - y
P = Kp * e
# 미분: 측정값 y에 필터 적용 (도함수 킥 + 잡음 방지)
st.d = (st.d + N*Kd*(st.y_prev - y)) / (1 + N*dt) # 필터된 -Kd*dy/dt 근사
D = st.d
u_unsat = P + st.I + D
u = max(u_min, min(u_max, u_unsat)) # 포화
st.I += Ki*e*dt + (u - u_unsat)*(dt/Tt) # 적분 + 안티와인드업(백계산)
st.y_prev = y
return u, st
핵심: ① D는 $y$에 작용, ② 필터된 미분, ③ 포화 후 백계산으로 적분 보정. 이 세 가지가 "교과서 PID"와 "실물에서 사고 안 나는 PID"를 구분한다. (동작은 여러분 환경·플랜트에서 재현·튜닝해 확인 — 검증 필요.)
2.5.8 도구로 — 튜닝 실험
# pid_tune.py — PID 폐루프 계단응답 비교
import control as ct, numpy as np, matplotlib.pyplot as plt
G = ct.tf([1],[1,3,2,0]) # 플랜트 1/[s(s+1)(s+2)] (2.1·2.2)
for Kp,Ki,Kd in [(3.6,0,0),(3.6,1.62,0),(3.6,1.62,2.0)]: # P, PI, PID(Z-N)
C = ct.tf([Kd,Kp,Ki],[1,0]) # (Kd s² + Kp s + Ki)/s
T = ct.feedback(C*G, 1)
t,y = ct.step_response(T, T=np.linspace(0,20,1000))
plt.plot(t,y,label=f"Kp{Kp} Ki{Ki} Kd{Kd}")
plt.legend(); plt.grid(True); plt.show()
P→PI→PID로 가며 잔류 오차가 사라지고(I) 오버슈트가 줄어드는(D) 것을 눈으로 확인하라. Z-N 값은 공격적이니 거기서 직접 미세조정해 보라. (검증 필요.)
2.5.9 정직 — PID로 충분하지 않을 때
PID는 강력하지만 한계가 있다.
- 지연 지배계: $L$이 $\tau$보다 크면 PID로는 한계 — 스미스 예측기(Smith predictor)나 MPC가 낫다.
- 다변수·강결합(MIMO): 변수들이 얽히면 SISO PID 여러 개로는 서로 간섭. 상태공간(제4부)·MPC가 적합.
- 제약·최적성: 액추에이터·상태 제약을 명시적으로 다루려면 MPC(6.1).
- 불안정·과소구동: 도립진자처럼 본질적으로 불안정하거나 입력보다 상태가 많은 계는 상태피드백/LQR(4.3·4.5·7.4)이 표준 해법.
그리고 모든 튜닝 규칙은 출발점이다 — Z-N도 ~25% 오버슈트를 전제로 한 어림이다. 실제 성능은 시뮬레이션·실측으로 확인하고, 외란·포화·잡음까지 시험하라.
2.5.10 정리 — 그리고 다음 장
- PID = P(현재·속도) + I(과거·오차 0) + D(미래·감쇠). 세 항은 서로 상충하며, 튜닝은 균형 맞추기(2.5.2·2.5.4).
- 튜닝은 ① 임계이득(Z-N, 2.1 임계이득 활용) ② 반응곡선(FOPDT) ③ 수동 ④ 모델기반 — 상황에 맞게(2.5.5). 어느 길이든 검증 필수.
- 실무 PID는 도함수 킥(측정 미분)·미분 잡음(필터)·적분 와인드업(안티와인드업)을 반드시 보완한다(2.5.6·2.5.7) — 교과서와 현장의 차이.
- PID가 부족한 영역(지연·MIMO·제약·불안정)은 뒤 부에서(2.5.9).
다음 2.6에서는 PID와 같은 계열인 Lead·Lag 보상기를 주파수영역에서 설계한다 — 근궤적·Bode를 직접 형성해 여유·속응성을 맞추는 법. 제2부를 마무리한다.
2.5.11 연습·생각해 볼 것
- 항별 진단. 어떤 PI 제어 루프가 정상상태 오차는 0인데 오버슈트가 과하고 잘 진동한다. P·I·D 중 무엇을 어떻게 조절하겠나? 두 가지 처방과 각 부작용을 말하라. (2.5.2·2.5.4)
- Z-N 적용. 임계이득 실험에서 $K_u=8$, 지속 진동 주기 $T_u=2 \,\mathrm{s}$를 얻었다. Z-N PID의 $K_p, T_i, T_d$와 병렬형 $K_p, K_i, K_d$를 구하라. 이 값의 예상 오버슈트는 대략? (2.5.5.1)
- 반응곡선. FOPDT로 $K=2, \tau=4 \,\mathrm{s}, L=1 \,\mathrm{s}$를 식별했다(1.4). Z-N 반응곡선 PID 이득을 구하라. (2.5.5.2)
- 와인드업 시나리오. 큰 설정점 변화로 모터가 최대 전압에 포화됐다. 안티와인드업이 없으면 적분기와 출력에 무슨 일이 생기는지, 백계산이 이를 어떻게 막는지 설명하라. (2.5.6.3)
- 도함수 킥. 왜 D항을 $e$가 아니라
−y에 적용하면 설정점 계단에서 스파이크가 사라지는가?d e/dt를 전개해 설명하라. (2.5.6.1) - 한계 인식. 다음 각 상황에 PID가 적절한지, 아니면 무엇이 더 나은지 한 줄로: ⓐ 온수 탱크(1차+작은 지연), ⓑ 도립진자(불안정), ⓒ 5개 입출력이 얽힌 화학 반응기, ⓓ 액추에이터 제약이 엄격한 연료 분사. (2.5.9)
- (손으로)
pid_tune.py로 2번 또는 2.5.5.1 예제의 Z-N PID 응답을 그리고, 오버슈트가 크면 $K_p$를 0.8배·$K_d$를 키워 미세조정해 보라. 외란(계단)을 더했을 때 I항이 어떻게 오차를 0으로 수렴시키는지 관찰하라. (검증 필요)
막히면 "P 속도, I 오차0, D 감쇠"와 표(2.5.4)로 돌아가라 — 튜닝은 이 세 조정 변수의 상충 관계다.