본문 바로가기
Developer/Drone DIY

드론 DIY | 드론 PID 제어 이론 1

by Doony 2016. 2. 11.


이번 편은 드론 자세 제어에 가장 많이 등장하는 PID 제어의 개념에 대한 포스팅 1편!!


처음 드론을 만드는 사람 입장에서는 제어라는 개념이 생소할 수도 있다. 거기에 PID.. 뭔지 모를 영어까지 나온다니 더 당황할만.

먼저, 제어가 뭔지 생각해보자.


제어가 뭘까? 드론을 자세 제어한다고 하는데, 대체 제어란게 뭘까.

쉽게 생각해보면 된다. 이 말 너무 많이하는 것 같은데 드론 자세제어는 별로 어려운 개념이 아니다..


쿼드콥터는 프로펠러에서 발생하는 추력을 바탕으로 이동하게 된다. 4개의 프로펠러가 있으니, 그 4개의 프로펠러에서 나오는 추력이 동일하면 제자리에서 붕 뜰까??? 절대 아니다. 애초에 지면 상태가 다소 기울었을 수도 있고, 4개의 추력이 절대 같을 수가 없기 때문이다.


http://www.internetmap.kr/entry/DJI-F450-based-Quadcopter



왜 같을수가 없을까?

프로펠러는 모터가 회전시킨다. 그리고 그 모터가 정확히 다 똑같을 수 있을까? 아니다. 물론 거의 비슷하기야 하겠지만 제조 과정이 같을 수가 없기 때문에 조금씩 차이가 날 수밖에 없다. 똑같은 공장에서 생산했다고 하더라도, 생산할 때의 온도가 아주 미묘하게 다를수도 있고, 구멍이 약간은 크게 뚫릴수도 있고. 공차라는 개념이 있는데, 이를테면 구멍을 1cm 크기로 자르는 제조공정이 있다고 하자. 정확히 1cm가 가능할까? 정확히 1cm라는건 누가 측정할 수 있을까?

때문에 1cm에 +-로 0.01cm 정도까지만 오차 범위를 두자~~ 라고 설정해두는게 공차개념이다. 이렇듯 제조 공정은 절대 완벽할 수가 없다. 차이가 날 수밖에 없다는 이야기.


뭐 사실 추력이 달라지는건 이것보다는 외부적 요인이 더 강할 것이다.

모터에 먼지가 껴서 좀 달라질 수도 있고, 프로펠러 아래 장애물이 있으면 그로 인한 공기역학적 성질 때문에 달라질 수도 있다.


거기다가, 모터를 작동시키는건 아두이노의 신호다. 신호가 미묘하게 동시에 안들어갈 수도 있고, 그 크기도 약간은 다를 수 있다.

기타 등등 같은 조건으로 작동시켰다해도 추력이 절대 같아질 수는 없다. 미묘하게 계속 다르게 움직일 것이다.



이게 끝이 아니다. 추력을 같게만 설정하면 방향 제어는 어떻게 할 것인가?

드론은 방향 제어를 위해 몸체를 기울인다. 추력 4개가 모두 같기만 하다면 절대 기울 수가 없다. 고로 방향 전환이 안되는 것이다. 

예를 들어 내가 왼쪽으로 움직이고 싶으면, 몸체를 왼쪽으로 기울어서 추력의 알짜 방향이 왼쪽으로 향하게끔 해야하는 것이다.

벡터 개념까지도 나올 수 있지만 다 필요 없그 그냥 직관적으로 이해하도록 하자.



좌측 처럼 드론이 평평하게 서있다면, 추력은 빨간 방향으로만 발생한다. 고로 기체가 위아래로 뜨기만 한다.

가만히 있기 위해서는 이처럼 평평한 상태를 유지해야하는 것이다.

그런데 우측처럼 기울어지면, 추력이 기울어져서 나타나기 때문에 드론이 방향성을 가지게 되는 것이다........... 너무 당연한걸 설명한 기분..




아무튼, 그래서 드론은 때로는 몸체를 기울이고, 때로는 평평하게 드론을 움직일 수 있어야한다.

이게 바로 자세 제어의 기본 개념이다.



움직이게 하는 게 무엇인가? 조종기다. 조종기에서 우리 닝겐들이 명령을 내리면, 아두이노에서 그 신호를 받고 드론을 기울일 수 있어야하는 것이다.


자 예시를 생각해보자. 조종기에서 명령을 내리는 것부터 해서 알고리즘을 생각해보자. 내가 원하는 건, 좌측으로 이동했다가 다시 제자리에 서는 것이다.


1. 조종기로 왼쪽으로 움직여라! 즉, 왼쪽으로 몸체를 기울여라! 라는 명령을 줬다.

2. 아두이노에서 그 신호를 받는다. 블루투스, 와이파이 등등 어떤 방식으로든 신호를 받는다.

3. 신호를 해석하여, 몸체를 기울이기 위해 모터의 출력을 조절한다. 왼쪽으로 기울기 위해서는 왼쪽 모터들은 약하게, 우측 모터들은 강하게 출력을 준다.

 (그래야 약한쪽은 떨어지고, 강한쪽은 올라가니까 드론 몸체가 회전하게 된다! 당연하게 받아들이면 된다.)

4. 계속 좌측은 약하게, 우측은 강하게 주면 드론은 기울다가 너무 기울어서 땅으로 떨어지고 말것이다. 고로 적당히 한 10도 정도만 기울이도록 조절한다. 10도보다 기울어지면 좌측을 강하게 출력을 주고, 우측은 약하게 준다. 다시 10도보다 덜 기울어지면 좌측은 약하게, 우측은 강하게 출력을 준다.

5. 드론이 기울었으므로 드론이 좌측으로 이동하게 된다. 적당히 이동했다 싶으면, 조종기로 다시 제자리에 서라는 명령을 준다.

6. 아두이노에서 그 신호를 받는다.

7. 신호를 해석하여, 기울어진 드론 몸체를 평평하게 세운다. 좌측으로 지금 기울어져 있으므로, 좌측 모터 출력은 높이고 우측은 낮춘다. 드론이 평평하게 자세를 잡으면 모든 모터의 추력을 비슷하게 유지한다.



대충 이런 과정들이 알고리즘으로 구현이 되어야 하며, 이게 제어라는 것이다. 이게 전부다! 이거 하나하나의 과정들이 모두 코딩되어 아두이노에 입력되어야 한다. 특히, 강조한 4번과 7번이 드론 자세 제어의 핵심이라고 볼 수 있다.


내가 10도 기울이라는 명령을 주면, 드론은 정확히 10도만 기울어서 자세를 유지할 수 있어야 한다. (물론 오차는 필연적이지만)

내가 다시 수평으로 자세를 잡아라라는 명령을 주면, 드론은 기울어진 10도에서 다시 0도 상태로 자세를 유지할 수 있어야 한다.


10도, 0도라는건 아두이노가 대체 어떻게 알 수 있냐고? 그건 mpu6050이라는 우리의 각도 센서가 알아서 아두이노로 보내준다. 자세한 포스팅은 여기서 참조.


http://hyongdoc.tistory.com/47

아두이노에서 mpu6050으로 각도 추출하는 방법 및 아두이노 코드에 대한 포스팅




대체 어떻게 이런걸 할 수 있을까?

답은 바로 PID 제어에 있다.


PID 제어의 핵심은 이미 위에 써놨다. 10도 기울라는 명령을 줬을 때, 10도보다 많이 기울어지면 기울어진 쪽 모터 출력을 높이고 반대편은 낮추어 회전하게 만들고, 10도로 다가가게 한다. 그런데 너무 많이 회전해서 10도보다 덜 기울어서, 예를들어 5도까지 와버렸다 싶으면 더 기울어야하지 않겠는가? 내가 내린 명령은 10도니까 말이다. 그러면 기울어진 쪽 모터 출력을 낮추고, 반대편을 높여서 회전하게 한다. 고로 10도에 다가가게 한다.

그런데 생각해보면, 10도 기울이라고 했을 때 10도보다 많이 갔다가~ 다시 반대로 해서 10도보다 덜 갔따가~ 다시 많이 갔다가~ 이걸 반복할 것이다.

그러다가 10도에 점점 근접하게 다가올 것이다.


말로 쓰니까 더럽게 복잡하네 ㅋㅋㅋㅋ 쉽게 생각하면 이거다!!

http://lamia.busanedu.net/data01/xtraclass/m-sp2/xtraclass/cd_test/cd_test272e.html?f=b&k=08190104&p=007&key=&page=



고등학교 수학 시간에 봤던 그림이 아닌가? 가만히 O점에 멈춰있던 진자를, 내가 B에 가져가서 놨다고 생각해보라.

그럼 B에서 A로 갔다가~ 다시 B로 왔다가~ 공기 저항때문에 점점 진동이 줄어들다가 O에 가서 멈출 것 아닌가?

드론도 이거랑 똑같다. 10도 기울이라고 했을 때 좀 많이 갔다가~ 덜갔다가~ 다시 갔다가~ 왔다가갔다가~ 하다가 10도로 갈 것이다.


이걸 구현해주는게 PID 제어라는 거시다 ㅠㅠㅠㅠㅠㅠㅠㅠ 으아 죄송합니다 더 복잡해진 기분이다



아무튼, 그렇다면 PID의 개념이 뭐길래 이걸 가능하게 해주는걸까?


P : Proportional 비례

I : Integral 적분

D : Differential 미분


으아ㅏㅏㅏㅏㅏㅏ 고딩때도 싫어했던 미적분이 나온다고해서 당황할 필요 없다. 잘 몰라도 되니까 말이다. (아니 사실 알면 더 이해가 편하긴 하다.)

가장 중요한건, 이 개념을 이해하기 위해서는 오차라는 걸 먼저 생각해야한다.


수식적인 이해가 약간~~ 필요한데 그건 2탄에서 계속..


댓글