본문 바로가기
SSM/쿼드콥터

[쿼드콥터] PID 제어

by 우툴 2016. 1. 13.
728x90

쿼드콥터의 PID 제어기 

 지금까지 누누히 말했던 제어기 부분에 대해서 설명을 하겠다.

<제어기에 대해서 궁금하신분은 여기를 누르세요> 

 쿼드콥터를 만들면서 쓴 제어기는 PID 제어인데 PID 제어기는 SISO(single input single output) 시스템이다. 하지만 쿼드콥터는 제어해야할 것은 Roll, Pitch,Yaw 의 각도로 3개다. 그러다 보니 어떻게 보면 제어해야할 대상이 3개인 것이다. 그러기에 3개의 제어기가 필요하다. 내가 만든 쿼드콥터에서는 Roll 축과 Pitch 축은 PID 제어 Yaw 축은 P 제어기만 사용하여서 제어를 하였다. 그 이유는 우리의 쿼드콥터가 지자기 센서가 없는 ARS 시스템이기 때문이다. (지자기 센서가 없기 때문에 Yaw 축에 대해서 각도에 기준이 될 값이 없다)

 PID 제어기 구현 방법

 이론적으로 PID에 대해서 알지만 사실상 코드로 어떻게 짜야 할지는 매우 막막한게 사실이다. 나도 정말로 정말로 어떻게 짜는지 몰라서 고생했다. 사실 이론상으론 P는 비례제어 I는 적분제어 D는 미분제어라는건 아마 조금만 찾아보면 다 알것이다. 근데 이걸 어떻게 코드에 짜느냐 이건 참 고난일 수 밖에없다. 이런 이유가 생기는 이유가 우리가 이론적으로 배우는 PID 제어는 아날로그 영역인거에 비해서 우리가 코드로 구현해야하는 부분은 디지털 영역이기 때문이다. 그렇기에 구현하는 방식같은 경우는 제어 주기를 주고 그 주기마다 스탭별로 나누어서 동작할 수 있게 구현해야한다. 

내가 구현한 방식은 위의 제어기와 같은 형식의 PID이다. 기존의 PID랑 살짝 다른 것이 외부 루프가 각도에 대해서 PI 제어를 하고 PI 제어를 해서 나온 각속도값을 가지고 사실상 P 제어를 해서 전체적으로 보면 이 각속도의 P제어가 D제어가되는 PID 제어를 한것이다. 그렇다면 제어기를 어떻게 구현 하는가 하면 아래와 같다.

 1. P 제어같은경우는 우리가 원하는 이득값을 곱해주면 된다. 

ex) rate_cmd = error(오차) * gain.Kp  

 2. I 제어같은경우는 시작서부터 현재까지의 적분값을 더하면 된다. 적분을 하는 방법은 제어주기를 곱해주면 된다.

ex) rate_cmd = total_intg ,   total_intg(전체 적분값) +=  step(제어주기)* error * gain.Ki

 3. D 제어같은경우는 원래라면 미분해서 더하면 된다.(미분은 제어주기를 나누어주면 된다.) 그러나 여기서는 rate(각속도) 자체가 미분값이기에 그냥 rate에 P제어를 해주면 된다.

ex) 원래 result = error *gain.Kd / step , 우리의 구현 방식 moment = rate_error * gain.Kd

 총 정리하자면 아래와 같다.

 error = anlge_cmd(명령할 각도) - sesor_angle(가속도 센서서 받아온 실제 각도) // 각도 오차

rate_cmd(명령할 각속도) = error * Kp + total_intg(전체 적분값)    // PI 제어

rate_error = rate_cmd - sesor_rate(자이로 센서서 받아온 실제 각속도) // 각속도 오차

moment = rate_error * Kd  // D 제어

total_intg = error * step * Ki // 전체 적분값 업데이트

위의 부분들은 전부 한 제어주기 안에서 이루어지는 것이다. 

이득을 어떻게 구하고 찾아가는지는 다음 글에서 적도록 하겠다.


controller.c


controller.h




728x90

댓글