← 강의 목록

Lecture 7. 피드백 제어 (PID)

오차를 보고 입력을 조정하는, 가장 널리 쓰이는 제어 방법. PID부터 차량 경로 추종(Pure Pursuit, Stanley)까지.

목차

  1. 개루프 vs 폐루프
  2. PID 제어기 — 각 항의 역할
  3. 과도응답 지표와 튜닝 규칙
  4. 인터랙티브: PID 질량-스프링
  5. 차량 경로 추종: Pure Pursuit
  6. 차량 경로 추종: Stanley
  7. 코드 · 더 깊이 공부하기

1. 개루프 vs 폐루프

개루프(Open-loop): 정해진 명령을 그대로 보냄. 외부 방해가 있으면 금방 어긋납니다.
폐루프(Closed-loop): 출력을 측정해 목표와의 오차 $e = r - y$를 계산해 제어량에 반영합니다.

r → 제어기 C 플랜트 G → y
그림 1. 폐루프 제어 구조. 출력 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) $$
튜닝 직감 — $K_p$↑ 빠른 응답·진동↑, $K_i$↑ 정상오차↓·오버슈트↑, $K_d$↑ 진동↓·잡음에 민감.

3. 과도응답 지표와 튜닝 규칙

제어기의 성능은 스텝 입력(갑자기 목표가 바뀌는 상황)에 대한 응답 곡선의 네 가지 수치로 표현합니다:

실전에서는 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 게인을 조절하며 응답을 비교해보세요.

실험 가이드:

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 PursuitStanley입니다. 둘 다 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. 더 깊이 공부하기