»
S
I
D
E
B
A
R
«
5. 피드백 컨트롤러(Feedback Controllers)
February 25th, 2014 by Wegra Lee

이 글은 한국의 소프트웨어 개발자에게 피드백 제어(Feedback Control)란 개념을 소개하고자 Phillip Janert의 글을 번역한 것이다.


1부 – 피드백이란
2부 – 피드백 원칙
3부 – 피드백이 필요한 이유
4부 – 피드백은 다르다
5부 – 피드백 컨트롤러
6부 – 피드백 컨트롤러 튜닝
7부 – 자가적응과 피드백은 다르다


지금까지는 설계 원칙 혹은 패러다임 관점에서 피드백을 소개했다. 한 마디로, 피드백은 불규칙하게 변화하는 환경에서 시스템이 정상궤도를 유지하게끔 도와준다. 그럼 이번 글에서는 이것이 실제로 의미하는 것이 무엇인지 더 자세히 살펴보기로 하자.

janert-feedback-loop2

그림의 피드백 루프를 보자. 제어 대상 시스템은 이번에도 캐시다. 컨트롤러는 목표 캐시 적중률을 유지하기 위해 캐시의 크기를 조절한다. (캐시 크기를 키우면 적중 횟수가 많아지고 자연히 적중률이 높아질 것이다.) 목표 캐시 적중률은 참조값 혹은 설정값(setpoint)이라 부르며 그림 가장 좌측의 입력으로 쓰인다. 컨트롤러의 입력값인 추적 오차는 설정값과 실제 적중률의 차이다.

추적 오차 = 설정값 – 실제값

(측정한 적중률은 -1을 곱한 후 참조값에 더한다. 이 값이 바로 설정값과 측정된 값의 차이인 추적 오차다.)

컨트롤러는 추적 오차를 입력받아 새로운 캐시 크기를 산출한다. 이 과정은 정확히 어떻게 이루어질까? 추적 오차가 음수면(실제 적중률이 목표한 적중률보다 높음) 캐시 크기가 줄어야 함을 기억해두고 계속 진행해보자.

이때 가장 최근의 측정 결과가 중요하다. 그 순간의 추적 오차가 캐시의 현재 크기를 목표 수준으로 조정하는 데 쓰인다. 즉, 제어 알고리즘은 다음과 같이 요약할 수 있다.

새로운 크기 = 이전 크기 + k * 추적 오차

추적 오차가 음수면(실제 적중률이 목표치보다 높음) 캐시 크기는 줄어들 것이다. 반대로 추적 오차가 양수면(실제 적중률이 목표치보다 낮음) 캐시 크기는 줄어들 것이다.

상수 k는 증감의 민감도를 결정한다. 적중률의 범위는 0.0 ~ 1.0 사이기 때문에 추적 오차 역시 0.0 ~ 1.0 사이의 실수(floating point number)여야 한다. 반면 캐시의 크기는 정수이며, 요청 트래픽에 따라 매우 큰 값이 될 수도 있다. k는 이러한 차이와 무관하게 어떠한 환경에서도 피드백 루프를 튜닝할 수 있는 값이어야 한다. 환경이 바뀐다고 새로운 컨트롤러를 쓰고 싶어하는 사람은 없기 때문이다.

적절한 컨트롤러 k를 구하려면 잠시 제어 알고리즘의 구조를 살펴볼 필요가 있다. 이 알고리즘은 적중률이 너무 높거나 너무 낮아도 항시 유효해야 한다. 이 공식에 따르면 수정치는 추적 오차에 비례한다. 끝으로, 추적 오차가 사라지면(실제 적중률이 목표 적중률과 일치함) 캐시 크기는 변하지 않아야 한다.

이쯤되면 대다수의 피드백 컨트롤러가 위와 같은 간단한 공식을 사용한다는 사실은 전혀 놀랍지 않다. 하지만 다른 속성을 고려해야 할 때도 있다. 가장 널리 쓰이는 소위 “세 단어(three-term)” 컨트롤러 혹은 PID (”proportional, integral, derivative”) 컨트롤러의 출력을 좌우하는 속성은 다음과 같다.

  • 현재 오차(현재)
  • 지금까지의 모든 오차의 누적합(과거)
  • 가장 최근 오차의 변화량(예측된 미래)

수학적으로는 누적합(cumulative sum)은 적분(integral), 최근 변화는 미분(derivative)으로 표현된다. 즉, PID 컨트롤러의 출력 공식은 다음과 같다.

janert-feedback-controller

여기서 컨트롤러 상수인 Kp, Ki, Kd는 모두 숫자 값이고, e(t)는 현재 오차다. 미분의 경우 무시될 때도 잦다(즉, Kd = 0). 여기에 Kp = 0으로 정하면 앞의 한 줄짜리 간단한 공식과 같아진다.

이를 컴퓨터로 구현하려면 시간의 흐름이 비연속적인 값으로 바꿔야 한다(다음 공식의 DT). 따라서 PID 컨트롤러의 구현은 다음과 같다.

sum += error
output = Kp * error + DT * ki * sum + kd * (error – prev) / DT
prev = error

이제 됐다! 이것이 그 유명한 PID 컨트롤러다! 바로 업계 90% 이상에서 활용한는 대표 컨트롤러다.

피드백 제어는 복잡한 구조를 단순한 컨트롤러로 대체한다. 이것이 피드백 시스템의 핵심이다. 피드백 시스템이 잘 작동하는 이유는 단순히 컨트롤러가 영리해서가 아니라, 정보를 루프 앞단으로 돌려보내 컨트롤러의 입력으로 재사용(feed back)하기 때문이다.

이제 컨트롤러 상수(Kp, Ki, Kd)를 정하는 방법을 알아볼 차례다. 그럼 다음 포스팅을 기대하기 바란다.


»  Substance: WordPress   »  Style: Ahren Ahimsa