hyein's 로봇 알고리즘 연구소

고전 제어의 절대 강자 PID Control(제어) A to Z - 2 편 본문

Robotics Control Theory/Classical Control

고전 제어의 절대 강자 PID Control(제어) A to Z - 2 편

hyein14 2020. 12. 21. 00:57

안녕하세요. :) 오랜만에 다시 포스팅을 하네요. 요즘 PID Control(제어)로 블로그를 방문해주시는 분들이 늘고있네요. 티스토리 블로그라 다음 유입이 가장 많았었는데, 최근에는 구글, 네이버로 많이 들어오시네요. wow! 얼른 시리즈를 얼른 마무리 해야겠습니다. ^^!

 

1편에서는 PID 개념 소개와 지글러 니콜라스(Ziegler-Nichols) 방법으로 튜닝하는 방법에 대해 이야기 드렸습니다.

자, 2편에서는 고전제어의 관점에서 모델 기반으로 PID를 튜닝하는 방법에 대해 이야기 해보고자 합니다. 끝까지 읽어읽어보시면 pole과 zero의 추가의미와 PID텀의 각각의 의미수식적으로 더 깊게 이해 할수 있습니다.

 

혹시 PID Control(제어) A to Z 시리즈 전편을 못 보신분은 아래를 참조해주세요.

 

PID Control(제어) A to Z 시리즈

1. 1 편 - PID의 개념 및 heuristic 튜닝

 

고전 제어의 절대 강자 PID Control(제어) A to Z - 1 편

안녕하세요. :) 글을 올리다 보니 'hyein's 로봇 알고리즘 연구소'에 제어에 관한 글을 아직 한번도 올리지 않은 것 같아 이번 포스팅은 고전 제어의 절대 강자 PID제어에 대해 다뤄보려고합니다. 많

hyein-robotics.tistory.com

 

PID Contorl(제어) A to Z 2편은 다음과 같은 흐름으로 이야기를 하려고 합니다.

 

1. 고전제어 vs 현대제어

2. 플랜트(모델)을 알아보자 - 모터방정식

3. pole과 zero란?

 1) pole의 기본 특성

 2) pole 추가의 효과

 3) zero 추가의 효과

4. 제어기 설계

 

1. 고전 제어 vs 현대 제어

 먼저 시작하기에 앞서 고전제어와 현대 제어를 구분하는 방법에 대해 이야기를 해보죠. 둘의 차이는 중요한 개념이니 꼭 이해하고 넘어가시길 바랍니다. 고전제어와 현대제어는 칼만필터가 도입이 된 이후 나뉘게 됩니다. 칼만 필터는 시스템의 모델을 통해 계산한 값과 측정치의 값의 보상으로 진짜 상태를 추정하는 필터입니다. 여기서 시스템 모델의 상태(State)의 개념이 들어오게 되는데, 바로 이 상태(State) 방정식이 있냐 없냐가 둘을 나누는 기준입니다.

 

 고전제어는 주파수 관점(frequency domain)에서 인풋(input)과 아웃풋(output)의 전달함수(Transfer Function)을 바탕으로 제어기(controller)를 설계하는 제어 방식이고, 현대 제어는 시간 관점(time domain) 상태방정식(State Space equation)을 바탕으로 제어기를 설계하는 제어 방식입니다. 고전제어는 인풋과 아웃풋이 정해져있기 때문에 SISO(Single Input Single Output)을 다루기 수월하고, 현대제어는 여러 상태(State)로 구성된 상태 방정식(State Space equation)을 다루기때문에 MIMO(Multi Input Multi Output)을 다루기 수월합니다. 이번 시리즈에서는 고전제어의 관점에서 PID를 다룬다고 했으니 주파수 영역에서 전달함수(Transfer FUnction)으로 제어기를 설계한다고 볼 수 있겠죠?

 

2. 플랜트(모델)을 알아보자 - 모터 방정식

 

 PID 제어를 설계하기 전에 먼저 우리가 다루고자 하는 플랜트(모델)을 먼저 정해합니다. 플랜트의 모델을 구하는 분야를 'System Identification(ID)'라고 합니다. System Identification에는 여러가지 방법이 존재하지만, 이번 포스팅에서는 제어에 초점을 맞추기 위해 플랜트 모델을 구하는 방법에 대해서는 자세히 다루지 않겠습니다. 모델은 간단하게 모터 방정식으로 잡아보겠습니다. 모터는 질량 관성 모멘트(Moment of inertia), ${J}$와 Viscous Friciton, ${B}$를 가지고 있고, 외부 마찰은 없습니다. 그러면 모터의 운동방정식은 다음과 같이 되겠죠?

 

우리는 고전제어 영역에서 다루기때문에 이를 주파수영역으로 바꾸어 보겠습니다. 그럼 양변에 라플라스를 취하면 다음과 같이 됩니다.

인풋이 토크 ${T}$, 아웃풋 각도 ${\theta}$로 정의한다면 플랜트의 전달함수는 다음과 같습니다.

그럼, 우리가 제어하고자 하는 시스템의 블록 다이어 그램을 그리면 아래와 같습니다. C는 Controller를 의미하고, P는 Plant로 우리가 제어할 모델인 모터가 됩니다. 

 

편의를 위해 질량 관성모멘트 앞으로 ${J}$는 0.02, ${b}$는 0.1로 두겠습니다.  d는 외란(disturbance)입니다. 그리고 앞에서 고전제어에서 주된 관심은 인풋(Input)과 아웃풋(Output)이라고 했습니다. 그럼 인풋(Input)은 desired trajectory인 위치 명령이겠고, 아웃풋(Output)은 모터가 움직인 각도가 되겠죠? 원하는 인풋(Input)을 넣었을 때, 아웃풋(Output)이 안정성을 보장하면서 Input을 따라가도록 제어기(Controller)를 설계하면 됩니다.

 

고전제어에서 시스템의 특성을 파악하기 좋은 방법 중 하나는 바로 1) 루트 로커스(root locus) 2) 나이퀴스트(Nyquist)  방법입니다. 이 두 방법으로 시스템의 안정성을 파악하여 제어기를 설계할 수 있습니다. 우리는 루트 로커스(root locus) 방법을 사용하여 제어기를 설계해보겠습니다. 

 

루트 로커스(root locus)는 matlab이나 python의 python control 모듈에서 쉽게 확인할 수 있습니다. 리눅스 이용자라면 python control은 'pip install control' 명령어로 쉽게 설치 가능합니다. 저는 python control을 사용해서 루트 로커스(root locus)를 그리겠습니다.

 

3. Pole과 Zero란?

 

Open loop 시스템의 전달함수(transfer function)의 분자, 분모 모두 하기와 같이 인수분해를 통해 근을 갖는 형태로 묶을 수 있습니다. 그러면 분모를 0을 만드는 근(root)을 Pole, 분자를 0으로 만드는 근(root)을 Zero라고 부릅니다.

 

즉 Pole은 ${ s = -p_1, -p_2, \cdots , -p_n}$가 되고 Zero는 ${s = -z_1, -z_2, \cdots, -z_m}$이 됩니다. 시스템의 안정성을 판단하는 기준은 Pole의 위치인데, 시스템의 Pole들이 s plane의 왼쪽인 LHP(Left Half Plane)에 있을 때 즉, Pole의 실수부(=Real part)가 음수일 경우 시스템은 안정합니다. s plane은 x축은 실수부(=Real part), y축은 허수부(=Imaginary part)입니다. 예를 들어 Pole이 -5 + 2j의 시스템은 안정(stable)하고 2 + 2j의 시스템은 불안정(unstable)합니다.

 

 그러면 s domain상에 Pole과 Zero에 해당하는 점을 찍고, 게인 K에 따라 Closed loop pole의 궤적이 바뀌게 됩니다. 이 궤적을 그린 플랏을 루트 로커스(root locus)라고 부릅니다. 이 궤적에서 Pole은 Source의 역할을하고 Zero는 Sink의 역할을 합니다. 즉, K가 증가할 수록 루트 로커스(root locus)에서 Pole에 있던 점은 Source니까 뿜어져 나와 무한히 나가거나 혹은 Zero에 있는 점인 Sink로 들어갑니다.  우리가 제어기를 설계할 때 포인트는 루트 로커스의 궤적이 LHP(Left Half Plane)에 있도록(시스템이 안정하도록) 제어기를 설계하면 되겠지요?

 

루트 로커스를 바탕으로 제어기를 설계하기 위해서는 pole의 역할과 pole과 zero를 추가했을 경우 무슨일이 일어나는 지를 알아야합니다. 그래서 pole과 zero를 추가하면 무슨일이 일어나는 지 함께 살펴보도록 하겠습니다.

 

1) pole의 기본 특성

 

루트 로커스(=root locus)를 바탕으로 분석을 하기 위해 pole의 기본 특성 몇가지만 정리하고 넘어가겠습니다.

 

 ① LHP(=Left Half Plane)에 위치한 Pole은 stable!

 ② 원점으로 부터 LHP쪽으로 멀어질 수록 시스템의 반응 속도는 빠름(=많은 양의 전류가 필요함). expoential의 형태로 떨어짐

 ③ 허수부(=Imaginary Part)의 값이 클수록 진동이 심한 시스템

 

2) Pole의 추가

 

Pole의 추가는 루트 로커스(root locus) 궤적을 오른쪽으로 당기는 역할을 합니다. 궤적을 오른쪽으로 당긴다는 말은 원점으로 가까워 진다는 말이기 때문에 시스템의 반응 속도가 느려지고, 안정성(stability)가 떨어집니다. 그리고 너무 오른쪽으로 궤적이 움직인다면 unstable해질 수 있습니다.

 

Modern control 5th ,ogata

 

 

위 그림을 본다면 (a)에서 pole 하나일 때 K가 커지면서(K > 0) -∞ 으로 갔단 궤적이 (b)그림 처럼 pole이 추가됨에 따라 오른쪽으로 당겨왔음을 볼 수 있습니다. (c)처럼 pole이 두개가 추가되면, K가 커질 수록 나중에는 RHP(Right Half Plane)쪽으로 근이 나가버리죠? 즉, unstable해지게 됩니다. 

 

대표적으로 pole이 추가되는 경우는 I 게인이 추가될 때 일어 납니다. I 게인은 적분이기에 ${1/s}$로 나타납니다. 즉 원점에 pole이 추가됩니다. 위와 같은 효과대로라면 I 게인이 steady state error를 줄여주는 반면에 P게인만 있을 때보다 시스템의 반응 속도가 약간 느려지고 안정성이 살짝 낮아지는 것을 생각해볼 수 있습니다. 밑에서 제어기 설계를 할 때 한번 함께 정말 이와 같은 지 확인해보록 하겠습니다.

 

3) Zero의 추가

 

Zero의 추가는 루트 로커스(root locus)의 궤적을 왼쪽으로 당기는 역할을 합니다. 궤적을 왼쪽으로 당긴다는 말은 원점에서 멀어진다는 말이기 때문에 시스템의 반응속도가 올라가고, 안정성(stability)이 올라갑니다

 

pole의 효과 마지막 그림에서 보았듯이 pole 3개에서 zero를 하나씩 위치별로 넣어보겠습니다.

 

Modern control 5th ,ogata

 

zero의 추가로 (b) - (d) 모두 루트 로커스의 궤적이 왼쪽으로 당겨지는 것을 볼 수 있습니다. 즉 시스템의 transient한 응닺을 올려주고 시스템의 안정화를 더 높여주는 것을 볼 수 있습니다. 대표적으로 zero가 추가되는 경우는 D게인이 추가될 때 일어납니다. 이전 포스팅에서 이야기했듯이 D게인을 추가하여 안정성(stability)를 높인다는 이야기와 일맥상통합니다. ^^! 

 

4. 제어기 설계

이제는 루트 로커스(root locus)를 통해 P제어기, PI제어기, PD제어기, PID제어기를 설계해보고, step input을 가해 최종적인 응답을 확인해보겠습니다. 그리고 모터의 마찰이나 모델링되지 않은 변수들이 외란(disturbance)으로 작용할 수 있기 때문에 외란의 크기는 0.1로 두도록 하겠습니다.

 

1) P 제어기

본격적으로 우리가 정의한 Plant의 모터 모델에 제어기를 붙여보도록 하겠습니다. P제어기를 ${Kp}$라고 둔다면, 이 시스템의 Open loop의 전달함수는 다음과 같습니다.  P 제어기가 의미하는 물리적인 의미는 이전 포스팅에서 스프링이라고 했습니다. 자, 그럼 왜 스프링의 역할인지 P 게인이 커지면 어떻게 되는 지 한번 살펴보도록 하겠습니다.

 

 

${K_p}$값이 증가할때의 루트 로커스의 거동에 대해 알아보죠. Pole은 0, -5네요. pole은 Source의 역할을 해서 ${K_p}$값이 증가할 수록, 궤적은 pole에서 뿜어져 나와 다음과 같은 궤적을 보이게 됩니다.

 

 

시스템의 pole이 LHP에 위치해야 한다고 했으니 K > 0이상이면, 시스템의 pole이 LHP쪽에 있으니 안정적이네요. K가 커질수록 실수부가 무한으로 커지는 것을 볼 수있습니다. 즉, Imaginary 파트의 값이 커지게 되니 진동이 심해지겠죠? 진동이 생긴다는 말은 물리적은 의미로 스프링의 역할과 비슷하게되네요. ${K_p}$값은 3으로 선택하고, 최종적으로 Closed loop일 때의 step response를 통해 위의 내용을 확인해보도록 하겠습니다. 

 

 

안정적으로 수렴하면서, 스프링의 특징인 진동이 있네요. 그리고 외란으로 인한 steady state error가 생겼네요.

 

2) PI 제어기

 

자, 이제 PI제어기를 살펴 보도록 하겠습니다. PI제어기는 주로 모터 드라이버쪽 속도제어에서 많이 보는 제어기지요. I 게인(gain)은 이전 PID Control(제어) A to Z 1편에서는 잔류 에러를 줄일 수 있는 게인텀이라고 이야기 했었습니다. 하지만 누적 에러로 인해 발산할 가능성이 높아 시스템의 발산을 유발한다고 했습니다. 그럼 함께 이 내용들을 살펴보겠습니다.

적분(integral)은 라플라스를 취하면 ${1/s}$가 됩니다. 즉 원점에 pole을 하나 더 두게 되는 효과를 만듭니다.

Open loop의 전달함수(transfer function)은 다음과 같이 됩니다.

 

PI 제어기로 인해 pole에 0, zero에 ${-K_i \over K_p}$가 붙었네요. 그러면 Pole하나가 zero로 들어가고 두개의 pole은 뻗어나가는 모양을 생각할 수 있습니다. ${-K_i \over K_p}$는 0.5입니다. 루트 로커스(root locus)를 그리면 다음과 같습니다.

 

 

 

예상한 것과 같이 원점에 있던 pole하나가 zero로 들어가고, 두개의 pole은 뻗어 나가네요. P제어기와 마찬가지로 ${K_p}$값을 3으로 선택하고 Closed loop일 때의 step response를 통해 위의 내용을 확인해보도록 하겠습니다. 

 

 

외란으로 인해 생긴 steady state error를 I게인이 없애버리네요.

 

3) PD 제어기

 

이제는 많이 사용하는 PD제어기를 살펴 보도록 하겠습니다. D게인(gain)은 안정성(stability)를 높이는 게인텀이라고 이야기 했었습니다. 미분(derivative)은 라플라스를 취하면 ${s}$가 됩니다.  Open loop의 전달함수(transfer function)은 다음과 같이 됩니다. 

 

PD제어로 인해 zero인 ${-K_p/K_d}$가 추가됬네요. 즉, pole하나가 zero로 들어가고 하나의 pole은 뻗어나가는 모양을 생각할 수 있습니다. ${-K_p/K_d}$는 0.8 입니다. 루트 로커스(root locus)를 그리면 다음과 같습니다.

 

 

예상한 것과 같이 원점에 있던 pole하나가 zero로 들어가고, 나머지 pole은 뻗어 나가네요. P제어기와 마찬가지로 ${K_p}$값을 3으로 선택하고 Closed loop일 때의 step response를 통해 위의 내용을 확인해보도록 하겠습니다. 

 

 

P제어기에 있었던 overshoot이 많이 감쇄되고, 진동이 많이 줄은 것을 볼 수 있습니다. 댐퍼와 같은 D 게인의 효과를 볼 수 있네요. ^^

 

 

4) PID 제어기

 

자 마지막으로 PID제어기에 대해 살펴 보도록 하죠. Open loop의 전달함수(transfer function)은 다음과 같이 됩니다. 

 

PID 제어기는 zero 2개와 pole 0이 추가되네요. Kd는 0.5 Ki는 0.8입니다. 루트 로커스(root locus)를 보면 다음과 같습니다.

 

 

 P제어기와 마찬가지로 ${K_p}$값을 3으로 선택하고 Closed loop일 때의 step response를 통해 위의 내용을 확인해보도록 하겠습니다. 

 

 

 

PI제어기나 PD제어기를 사용했을 때보다 PID제어기는 steady state error가 줄면서도 오버슛과 진동이 많이 없어졌네요. 위의 값이 최적이 아니라서 게인을 어떻게 튜닝하느냐에 따라 성능이 더 향상되겠죠?

 

루트 로커스(root locus)를 통해 PID 제어기를 설계하는 방법에 대해 다들 잘 이해하셨나요? 혹시 언제 플랜트(plant)의 모델을 구하고,  pole과 zero의 효과를 고려해서 제어기를 설계하나 이런 생각이 드셨나요?  실제 위와 같이 모델을 기반으로 제어기를 설계한다고 하더라도 실제 고려하지 못한 모델링 error와 외부 외란으로 인해 시뮬레이션과 실제 제어 현상과는 많은 차이가 있을 수 있습니다.  그래서 시뮬레이션을 통해 값을 구했다 하더라도 어느 정도 베이스라인의 게인값은 제공해주지만 세부 튜닝은 필요합니다. 그래서 나온 방법이 PID 오토 튜닝(auto tuning)입니다. 마지막 시리즈인 PID Control(제어) A to Z 3편에서는 PID 오토 튜닝(auto tuning)에 대해 다루어 보도록 하겠습니다.

 

 

우측 상단에 블로그 구독 버튼이 있습니다. 구독하시면 새로운 포스팅이 올라오면 바로 알 수 있습니다. 유익한 로봇과 관련된 제어 및 알고리즘 글들을 많이 올려드리겠습니다!!

 

혹시 이번 포스팅을 보시면서 궁금한 점들이나 더 다뤄졌으면 하는 내용이 있다면 아래 댓글에 남겨주세요.

 

Comments