쿼드콥터 PID 제어 [가장 쉽게 설명하기]

Posted by Doony
2015. 8. 8. 23:24 아두이노 드론 프로젝트

약 2년 전, 처음 PID 제어에 대해 알아보려고 했던 시절이 생각납니다.

카페와 블로그와.. 백과사전을 찾아가면서도 대체 이게무슨 소린가........... 싶었거든요.

그랬던 제가!!! 어느새 PID의 기본 정도는 알게 되어 이렇게 글을 시작하네요!! (뿌듯뿌듯)

2 years ago, I remember when I searched PID for the first time.

Cafes.. Blogs.. I was not able to understand when I read lots of postings. 


이번 포스팅은 누구나 이해할 수 있게, 최대한 쉽게 PID 제어에 대해 설명해보려고 합니다. 

I will explain PID control as easy as possible so that everybody can understand.


쿼드콥터를 시작하는 사람들은 꼭 한번쯤 보게되는 PID 제어.

대체 PID 제어가 뭐길래 필요하다는 걸까요? 저희도 아라미르 드론을 만들기 위해서 꼭 거쳐가야 하는 과정 중 일부인데...

학교에서 배운 이론과 실습을 토대로 간략하게 설명을 해보도록 하겠습니다.

If you are trying to make your own Quadcopter, you might have heard about PID.

What is PID? Why do we need PID? 

Let me briefly explain about the theory of PID.



흔히 모터를 제어하는 데 있어서 PID 제어가 필요하다고 합니다. 대체 왜 필요한걸까요?
예를 들어 봅시다.


쿼드콥터가 하늘을 날고 있습니다. 그런데 어떤 외력이 작용해서, 자세가 흐트러졌어요.

자세가 기울어졌는데, 4개의 모터가 똑같은 속도로 날고 있으면 안되겠죠? 출력 차이를 이용해서 다시 자세를 바로잡아야 할텐데요.

PID 제어는 이 때 바로잡아주는 제어 기법 정도로 생각하시면 됩니다. 기울어졌다는 '오차' 혹은 ''에러' 를 인식해서 그 오차를 줄이기 위해 모터 출력량을 조절하는 게 바로 PID 제어가 쓰이는 곳입니다.


Generally we need PID control when using motors. Why?

Let's see this example.


Quadcopter is in the air. And somehow, it loses its position slightly.

Since the position is not balanced, 4 motors should not be in same speed. The speed of each motor should be different to get balanced.

PID is used at this moment for balancing. PID uses the 'error' to controls each motors and reduces the error.




그렇다면 PID가 대체 무슨 말일까요?

P = Proportional

I = Integration

D = Differential


약어인데요. 증폭기, 적분기, 미분기라고 보통 부르더라구요.

PID는, 원하는 위치, 속도, 혹은 가속도의 값과, 현재의 값이 얼마나 오차가 큰 지를 가지고 계산을 합니다.


증폭기 적분기 미분기 대체 무슨 소린지 모르겠다구요? 그럴만도요. 요즘엔 문이과 모두 미적분을 배운다지만, 제 세대만 해도 문과는 배우지 않았거든요. 하지만 저는 영광스러운? 이과 출신이므로.. 말로만 설명드리겠습니다.






오차가 정말 작다고 생각해보자구요. 오차가 너무 작으면 뭔가 계산하는데 큰 차이가 없을 것 같지 않나요?

그래서 그 오차를 훨씬 크게 증폭해서 보는 거에요. 현미경으로 들여다보는 느낌?? 그렇게 되면 작은 오차도 증폭을 통해 크게 인식하므로, 꼭 필요하겠네요! 이걸 P 제어라고 합니다.

Imagine that error is really really small. Don't you think that if error is too small, it will be too difficult to calculate something? That's why we bump it up proportionally. We call it P control.


시시각각으로 그 오차는 변할 겁니다. 쿼드콥터의 예로 들어보자면, 자세를 제어하기 위해 드론 자체가 비행하고 있는 각도가 변하겠죠? 이제 시간에 따라 오차가 얼마나 변했는지 그 양을 측정하게 되는데요.

이 때 사용하는 게 바로 D 제어입니다. 미분은 기울기라고 보시면 되는데, 현재 오차와, 특정 시간 전의 오차 값을 시간으로 나눈 값이 되겠습니다. 그냥 쉽게 생각하면, 과거의 값과 현재 값의 차이를 인식하여 제어에 사용한다라고 보시면 됩니다.


그↗런데 말입니다.  한 가지, 이상한 게 있습니다.

모터를 예로 들자면, 모터에는 dead zone이라는 것이 있습니다. 여러분들도 아시다시피 모터는 전압 조절을 통해 전력량을 조절하여 구동하는데요. 전압을 너무 작게 걸어주면, 모터가 돌아가지 않습니다. 쉽게 생각해보면 모터에도 마찰력이 있는 것인데요. 그 마찰력을 이겨서 모터가 돌아갈 수 있을 정도의 최소 전압은 꼭 걸어줘야 한다는 얘기입니다. 

오차를 PID 제어를 통해 전압량에 바로 연결지켜주는 게 제어의 원리입니다.

이 때 오차가 너무 작아서, 모터에 걸리는 전압도 너무 작게 되면 모터가 안돌아갈 수 있다는 거죠. 여전히 오차는 존재하는데도요. 그래서 I 제어를 사용합니다. 바로 적분기죠. 미분가 그래프의 기울기였다면, 적분은 그래프의 넓이입니다. 즉, 미분이 특정 시간 구간에서만 따졌다면, 적분은 특정 시간이 아니라 과거부터 지금까지 쭉 계속 넓이를 구해오고 있는 것이지요. 따라서 적분기를 사용하게 되면, 오차를 계속해서 넓이처럼 더해나간다고 생각해보시면 됩니다. 오차가 아무리 작아져도, 적분기에 의한 제어 오차는 작아질 수가 없기 때문에, 섬세한 제어가 가능하다는 얘기입니다.


가장 쉽게 설명하고 싶었는데 정말 어려워보이네요 제가 봐도.

저는 PID에 마스터한 사람이 아니기 때문에.. 가장 기초적인 부분만 설명을 드렸습니다.

(혹시나 틀린 부분이 있으면 언제든지 댓글로 달아주시면 감사하겠습니다!)



이제 공식을 볼까요?



네 이렇습니다.

u(t)는 PID 제어를 통해 나온 출력 전압과 관련된 수치라고 보시면 됩니다. 아두이노를 예로 들자면, analog Write 함수가 0부터 255까지의 수치를 입력받을 수 있는데 이는 바로 전압입니다. 0은 0V, 255는 5V가 되는 셈이지요.

따라서 PID 제어 값 역시 0부터 255 사이의 값으로 수렴하게 되면 좋기 때문에 위의 P, I, D 제어를 각각 사용하는 것입니다.

Kp는 증폭 게인, Ki는 적분 게인, Kd는 미분 게인입니다. e는 모두 에러, 즉 오차를 뜻합니다. 


한번에 모든 걸 설명하는 게 까다롭네요.

아두이노로 다음에는 코딩과 관련해서 글을 올려보도록 하겠습니다.


그리고 영어로 밑에 하나하나 다 달자니....... 제 영어 실력이 많이 부족함을 느낍니다. 도움이 절실해요 킁킁