아두이노 드론과 PID 제어 :: 찬찬히 로봇 메이커
반응형

사실 드론의 하드웨어도 중요하지만(모든 로봇들이 그러하듯) 더욱 중요한 것은 제어법이라고 생각한다.

드론의 제어법을 구글에서 여러번 찾아보았다. 기본은 PID제어를 사용하였고 여기에 추가적으로 P제어를 두번한 PPID(?)제어라던가 D제어를 두번한 PIDD(?)제어를 사용한 사람도 있었다. PPAP제어도?...

우리는 여러 게시물을 찾아보고, 선배들에게도 물어본 결과 그냥 기본적인 PID제어를 사용하기로 하였다. 기본적으로는 PID를 사용하고, 상황에 따라서 다른 것을 추가한다고 한다.

일단 PID제어가 무엇인지 찾아보면,

P제어, I제어, D제어를 계산한 뒤, 그것을 합쳐서 출력을 주는 것을 말한다.

P제어는 Proportional control로써 한글말로 하면 비례제어이다. I제어는 Integral control로써 적분 제어이고, D제어는 Derivative control로써 미분 제어이다.

이것이 왜 필요한가 하면, 그냥 ON/OFF제어를 하면 원하는 값에 다가가기가 쉽지 않다.

예를 들면, 속도를 기준으로 제어를 한다고 했을 때, ON을 액셀을 최대로 밟는 것(또는 어느 기준으로 밟는 것도 상관 없다), OFF를 얙셀을 떼는 것으로 할 수 있다. 그러면 시속 100km로 달리고 싶다고 할 때, 100km까지는 액셀을 밟을 것이다. 그러다가 100이 넘어 101km가 되면 액셀을 뗄 것이다. 그러면 그 전까지 밟는 힘이 값자기 사라지지 않으므로 한 103km까지는 갈 것이다. 그러다가 힘이 떨어져서 100km를 지나쳐 97까지 떨어지고... 이것의 반복이다.

하지만 PID는 정확히 100km를 유지하려고 한다. 왜 이런지 식을 통해 알아보면,

일단 식은 아래와 같다.

PIDoutput =

Kp*e(t)+Ki*(integral)e(t)+Kd*(derivative)*e(t)

하나씩 보면

P제어는 오차 곱하기 Kp값이다. 이때 오차는 현재값과 목표값의 차이다. 위의 식에서는 그것을 error라고 해서 e(t)로 쓰여졌다. 다시 쓰면 ,

P제어 = (목표값-현재값) * Kp 이다.

사실 PID제어에서도 제일 중요한게 P제어이고, Kp값이라고 생각한다. Kp값만 잘 맞춰도 제어의 80퍼센트는 되기 때문이다. 그러면 정확히 어떻게 해야 드론을 제어할 수 있을까? 사실 정답은 잘 모르지만 우리가 한 방법을 소개한다(이 방법은 경험과 지식과 나의 생각이 합쳐져있다).

일단 현재값은 자이로센서가 받는 현재의 각도이다. x축을 기준으로 한다고 하자. 그래서 드론이 그냥 바닥에 놓여있다면 각도는 0도 일테고, 왼쪽으로 기울이면 음의 몇도, 오른쪽으로 기울이면 양의 몇도 이렇게 나올 것이다.

내가 수평을 유지하려고 한다면 목표값은 0이 될 것이다. 그러면 거기에 Kp값을 곱한 값이 P제어값이 될테고 그 값으로 pwm값으로 바꿔준다. 그러면 모터에 그만한 힘이 전해지면서 제어가 된다.(모터에 대한 제어는 다음 포스팅에 올릴 예정이다.)

그러면 Kp값은 어떻게 구하는가? 아마 대부분의 일반적인 사람들은 노가다로 구할 것이다. Kp값에 1을 대입해보고, 2를 대입해보고, 3을 대입해보고... 3정도가 맞는 것 같다라고 하면 거기서 0.1단위로 해보고... 아마 그런식으로 Kp값을 찾을 것이다.

아마 나머지는 매트랩이나 수학적인 계산으로 Kp값을 구할 것이다. 어떨 때 어느정도 힘을 줘야하므로 Kp값이 어느정도면 pwm이 몇정도가 나오고, 그러면 최대 힘의 몇퍼센트이므로 일부 저항 등을 제외하고 고려하면 몇정도가 적당한 값이겠구나 하고 구할 것이다.

나는 아직 아무것도 모르는 어린이이기 때문에 노가다로 구했다. 하지만 중요한 점은 PID 제어를 해보고 게인값을 한 번 구해본 사람과 처음 하는 사람은 확실히 다르다는 점이다. 아무래도 노가다로 구하는 방법은 해본 사람이 확실히 잘한다. 아마 드론에서 처음 PID제어를 하는 사람이라면, 그리고 노가다로 게인값을 구하는 사람이라면 정확한 값을 찾는데 몇 주정도 예상하는 것이 나을 것이다(사실 이게 제어의 전부이기도 하다).

일단 Kp값을 맞추면 드론이 어느정도 중심을 잡으려고 할 것이다. 아마 발산(드론이 오른쪽으로 갔다 왼쪽으로 갔다 하면서 점점 더 오차가 커질 때)하기 바로 전까지 맞추는 게 이상적이라고 생각한다. 그러면 Kp값은 맞춘 것이다. 그런 후에 D제어를 한다.

D제어는 미분제어로, D제어 =(오차의 시간에 대한 미분제어) * Kd 이다. 식으로 쓰면, D = ((e-e0)/t) * Kd(e0는 바로 전 오차, e는 현재 오차, t는 두 오차의 측정 시각 사이의 시간이다.)이다. 즉 위의 그래프에서 빨간색 선이 현재값이라고 하면, 빨간색 그래프의 어느 한 점에서의 기울기라고 할 수 있다.

'이 제어를 왜 할까'라고 생각을 한다면, 이 제어는 빠른 반응속도 때문에 사용한다고 답할 수 있다. 드론이 날라갈 때, 외력이 작용하지 않는다면 참으로 좋겠지만, 외력은 작용한다. 낮게 떠있을 때에는 바닥과 부딪친 바람이, 높게 떠있을 때에는 바람이 불며 드론에게 외력을 가한다. 그럴때마다, 드론은 빠르게 제 자리를 찾아야 하는데 그 역할을 D제어가 해준다.

쉽게 정리하면, P제어는 오차값이 커져야 힘을 많이 주게 된다. 하지만 D제어는 순간변화율(기울기)에 따라 힘을 주기 때문에 로봇이 순간적으로 변했을 때, 순간적으로 많은 힘을 주어 제 자리를 찾을 수 있게 도와준다.

Kd값을 찾는 방법은 Kp를 찾는 방법과 마찬가지로 시소테스트를 하면서 직접 드론에 외력을 주면서 찾는다. 드론이 왔다갔다하면서 수평을 맞출텐데, Kp값을 맞추고, Kd값을 맞추면 한 번이나 두 번 만에 수평으로 돌아와서 멈춰야한다.

P제어를 한 뒤, P제어값과 D제어값을 합쳐서 pwm에 반영한다.

마지막으로 I제어인데, 사실 인터넷에 찾아봤을 때에는 P제어를 한 뒤에 I제어를 하라고 나와있다. 하지만 나는 개인적으로 I제어가 큰 비중을 차지하지 않는다고 생각이 되어 PD제어를 위주로 하고 I제어를 나중에 하였다. I제어 = (오차들의 합) * Ki이다. 생각해보면 I제어가 있는 이유가, P제어는 오차값이 작을 때, 값이 너무 작아 목표값에 도달할 힘을 내지 못하게 된다. D제어 또한 변화율에 대한 힘이므로 힘이 거의 없을 것이다. 이렇게 기울어져있을 때, 그 작은 오차들을 적분값으로 합해서 힘을 주는 것이 I제어이다.

I제어가 완벽히 되면, P제어만 하면 목표값에 완벽히 도달을 못하고 약간 기울어져있을텐데, 그 기울어짐을 잡아줄 수 있다.

I제어까지 합쳐서 pwm에 반영하면, 완벽한 PID제어가 된다.

경험까지 덧붙여 설명하느라 길어졌지만 PID를 좀 더 정확히 설명하고 싶었다. 다음 포스팅에서는 BLDC의 제어법과 시소테스트, PID제어의 팁 등을 올릴 예정이다.

※혹시 틀린 것, 알려주고 싶은 내용, 궁금한 점은 댓글로 달아주세요 ^^.

반응형

+ Recent posts