Lecture 7. 피드백 제어 (PID)
오차를 보고 입력을 조정하는, 가장 널리 쓰이는 제어 방법. PID부터 차량 경로 추종(Pure Pursuit, Stanley)까지.
목차
- 개루프 vs 폐루프
- PID 제어기 — 각 항의 역할
- 과도응답 지표와 튜닝 규칙
- 인터랙티브: PID 질량-스프링
- 차량 경로 추종: Pure Pursuit
- 차량 경로 추종: Stanley
- 코드 · 더 깊이 공부하기
1. 개루프 vs 폐루프
개루프(Open-loop): 정해진 명령을 그대로 보냄. 외부 방해가 있으면 금방 어긋납니다.
폐루프(Closed-loop): 출력을 측정해 목표와의 오차 $e = r - y$를 계산해 제어량에 반영합니다.
2. PID 제어기
오차 $e(t) = r(t) - y(t)$에 대해 다음 세 항의 합으로 입력을 만듭니다.
$$ u(t) = K_p\, e(t) + K_i \int_0^t e(\tau)\,d\tau + K_d\, \dot{e}(t) $$- P (비례): 현재 오차에 비례. 큰 오차일수록 강하게 반응.
- I (적분): 누적 오차. 정상상태 오차를 0으로 만듦.
- D (미분): 오차 변화율. 진동을 줄이는 댐핑 효과.
3. 과도응답 지표와 튜닝 규칙
제어기의 성능은 스텝 입력(갑자기 목표가 바뀌는 상황)에 대한 응답 곡선의 네 가지 수치로 표현합니다:
- 상승 시간 $t_r$ (Rise time) — 목표의 10%에서 90%까지 올라가는 데 걸리는 시간.
- 최대 오버슈트 $M_p$ (Overshoot) — 목표를 얼마나 넘어섰는가. 2차 시스템에서 감쇠비 $\zeta$로 결정: $M_p = e^{-\pi\zeta/\sqrt{1-\zeta^2}}$.
- 정착 시간 $t_s$ (Settling time) — 목표의 ±2% 이내로 들어와 머무는 시간.
- 정상상태 오차 $e_\infty$ (Steady-state error) — $t\to\infty$에서의 잔여 오차. 타입-1 이상 시스템에서 적분항이 0으로 만듭니다.
실전에서는 Ziegler-Nichols 한계이득법이 고전적인 출발점입니다. $K_i = K_d = 0$에서 $K_p$를 지속진동이 생기는 한계값 $K_u$로 높이고, 그때의 주기 $T_u$를 잰 뒤:
$$ K_p = 0.6 K_u, \quad K_i = 1.2 K_u / T_u, \quad K_d = 0.075 K_u T_u $$요즘은 이 값을 초기값으로만 쓰고, 시뮬레이션/현장에서 손으로 다듬거나 최적화로 바로 조율합니다.
4. 인터랙티브: PID 튜닝
🎮 인터랙티브: PID 튜닝 (질량-스프링)
목표 위치(빨강 점선)로 질량(파랑)을 움직입니다. PID 게인을 조절하며 응답을 비교해보세요.
실험 가이드:
- $K_p$만 사용 → 정상상태에 도달은 하지만 약간의 오차가 남거나 진동.
- $K_d$ 추가 → 진동이 줄어듭니다.
- $K_i$ 추가 → 작은 잔류 오차가 사라집니다.
7. 코드 예제 & 더 깊이 공부하기
class PID:
def __init__(self, kp, ki, kd, dt):
self.kp, self.ki, self.kd, self.dt = kp, ki, kd, dt
self.iE, self.prev = 0.0, 0.0
def step(self, ref, y):
e = ref - y
self.iE += e * self.dt
dE = (e - self.prev) / self.dt
self.prev = e
return self.kp*e + self.ki*self.iE + self.kd*dE
# 사용
pid = PID(kp=5, ki=1, kd=2, dt=0.02)
u = pid.step(ref=1.0, y=current_y)
5. 실전: 차량 경로 추종 제어
PID는 1차원에 좋지만, 자동차가 곡선 경로를 따라가려면 횡방향(좌우) 오차를 핸들 각도로 바꿔주는 전문 제어기가 필요합니다. 자율주행 분야의 양대 산맥은 Pure Pursuit과 Stanley입니다. 둘 다 PythonRobotics PathTracking에 짧게 구현되어 있습니다.
5.1 Pure Pursuit (순수 추적)
차량 앞 일정 거리 $L_d$ 떨어진 경로 위 점을 "당근"처럼 바라보고 그쪽으로 핸들을 꺾습니다.
$$ \delta = \arctan\!\left(\frac{2 L \sin\alpha}{L_d}\right) $$$L$은 축거, $\alpha$는 차량 진행 방향과 당근 방향 사이 각도입니다.
🎮 인터랙티브: Pure Pursuit으로 곡선 경로 추종
전방 주시 거리 $L_d$를 바꿔보세요. 너무 짧으면 진동, 너무 길면 코너 컷팅이 일어납니다.
5.2 Stanley Controller (Stanford 우승작)
2005년 DARPA Grand Challenge에서 Stanford의 Stanley가 우승할 때 쓴 알고리즘입니다. 앞바퀴 위치에서 측정한 경로 오차 $e$와 방향 오차 $\theta_e$를 합칩니다.
$$ \delta = \theta_e + \arctan\!\left(\frac{k\, e}{v}\right) $$$\theta_e$는 차량 방향과 경로 접선 방향의 차이, $k$는 게인, $v$는 속도. 속도가 빠를수록 횡오차 보정이 부드러워집니다.
🎮 인터랙티브: Stanley Controller
같은 경로를 Stanley 방식으로 따라갑니다. $k$와 속도를 조절해 보세요.
비교: Pure Pursuit은 부드럽지만 코너에서 안쪽으로 깎입니다(컷팅). Stanley는 횡오차에 직접 반응해 더 정확하지만 잡음에 민감합니다. 둘 다 PythonRobotics에 50줄 이내의 짧은 파이썬 코드로 구현돼 있습니다.
6. 더 깊이 공부하기
- Åström & Murray, Feedback Systems: An Introduction for Scientists and Engineers (2판, 2021) — 온라인 공개. 1~3장이 이 강의의 고급판입니다.
- Franklin, Powell, Emami-Naeini, Feedback Control of Dynamic Systems — 고전적인 학부 교과서.
- PythonRobotics PathTracking — Pure Pursuit, Stanley, LQR, MPC 버전까지 한 곳에 비교.
- Thrun et al., "Stanley: The robot that won the DARPA Grand Challenge", JFR 2006 — Stanley 원논문.
- Coulter, "Implementation of the Pure Pursuit Path Tracking Algorithm", CMU Tech Report 1992.