2015년 9월 4일 금요일

자율제어를 위한 PID 제어 개념 및 개발 방법

이 글에서는 PID 제어에 대해서 정리한다. PID는 액추에이터, 자율주행 차량, 로봇, 센서값 보정 등에 필수적인 함수로 사용된다.

1. 개요
PID제어는 목표로한 물리량을 자연스럽게 수렴시키는 제어 방법이다. 우리는 PID제어를 본능적으로 사용하고 있다. 예를 들어, 차를 운전할 때, 차의 방향을 목표지점을 가늠하여, 좌우 회전을 적절히 하여, 원하는 목표까지 운전한다. 만약, 좌우회전을 너무 크게 한다면, 목표값보다 발산할 것이고, 너무 적게하면, 변화폭이 적어, 너무 늦게 목표값에 도달할 것이다. 다음 그림은 자율제어와 관련된 PID와 MPC (model-based predictive control) 방법을 보여준다.

PID제어는 자연스럽게 목표 물리량(속도, 방향, 온도 센서값 등)으로 수렴시킨다. 다음 영상은 이 내용을 보여준다. 


PID는 목표값과 현재값의 차이인 에러값을 줄여주는 방향으로, 현재값을 보정한다. 에러값은 PID값으로 변환된 후, 현재값을 보정하는 데 사용한다. PID각 항목은 다음과 같은 의미를 가진다.

P: Proportinal(비례) 
I: Integral(적분) 
D: Differential(미분) 

이 값들이 합해져서, 현재값을 보정하는 과정을 계속 반복해, 현재값이 목표로한 물리량으로 수렴하게 한다.
PID의 상세한 의미는 다음 영상을 참고한다. 


PID각 항목에 대한 계수값(Gain값)은 물리량을 만들어 내는 액추에이터 종류에 따라 적절히 설정해야 한다. 이 값을 적절히 설정해야, 자연스럽게, 빠르게 목표치까지 수렴하도록 할 수 있다. PID를 계산하는 소스코드는 다음과 같다. 보면, 알겠지만, 매우 간단한다.

double calculate_PID(double reference_input, double feedback_input)
{
   error = reference_input - feedback_input; // Compute the error
   error_sum = error_sum + error;         // Compute the error sum
   proportional_output = proportional_gain * error; // Compute the proportional output
   integral_output = integral_gain*error_sum; // Compute the integral output
   derivative_output = derivative_gain * (error - errorPrev); // Compute the derivative output

   // Compute the pre-saturated output
   presaturated_output = proportional_output + integral_output + derivative_output;
   return presaturated_output;
}

PID의 gain값을 설정하는 것에 따라서, 목표치까지 수렴하는 곡선 특성이 달라진다. 급하게 수렴할 수도 있고, 천천히 수렴할 수도 있다. 적절한 gain값을 계산하기 위해, 다음 수렴 곡선과 표 내용을 참고한다.



제어 동작 Kp 값 Ki 값 Kd 값
비례 제어 0.3~0.7 T/KL 0 0
PI 제어 0.35~0.6 T/KL 0.3~0.6 / KL 0
PID 제어 0.6~0.95 T/KL 0.6~0.7 / KL 0.3~0.45 T/K

gain값이 클때와 작을 때 수렴하는 곡선의 특성은 다음과 같다.


2. 개발
여기서는 아두이노로 액추에이터를 제어하는 방법을 정리한다. 우선, 아두이노로 모터를 PID 제어하는 방법을 아래 영상에서 확인해 보자.


아두이노 기반 PID제어 관련 소스는 다음 링크에서 확인할 수 있다. 라이브러리도 만들어져 있어, 간단히 함수만 사용하면 된다.

다이나믹셀을 제어하는 방법은 다음 영상에서 확인할 수 있다.


다이나믹셀 제어와 관련된 소스는 다음 링크를 참고한다.

3. 결론
PID는 자연스럽게 목표하는 위치, 속도, 방향, 온도 등 센서 값과 같은 물리량을 기계적으로 자동 제어하는 데 필수적인 알고리즘이다. 이를 이용하면, 기계가 목표 물리량까지 자연스럽게 수렴하는 자동 제어 장치를 만들 수 있다.

4. 레퍼런스
이 글은 아래 레퍼런스를 참고하였다.

댓글 2개:

  1. c++ PID function에 errorPrev는 어떻게 calculation 하는건가요? working code가 아니고 pseudo code 같은 느낌인데요.

    답글삭제
    답글
    1. working code입니다. PID는 다들 보통 경험치로 조정합니다.

      삭제