본문 바로가기

프로젝트 (Project)/쿼드콥터 (Quadcopter)

[ZMR250] 6. PID 튜닝 및 비행

앞서 기체의 상태를 피드백하여 모터를 제어하는 PID 제어를 공부했다.

나아가 드론은 다양한 외란의 영향을 받기 때문에 2중 PID 구조를 가져야하는 등의 여러가지를 알아보았다.

이번 시간에는 PID를 튜닝하고 몇몇 코드를 수정하여 기체가 잘 비행할 수 있도록 수정할 것이다.

먼저 P.I.D제어는 실시간으로 기체의 현 상태를 피드백 제어하기 때문에 주기적인 제어가 필요하다.

우리는 DT를 피드백 제어값에 반영하지 않았기 때문에 DT를 고정시킬 수 있는 수식을 추가해야한다.

아두이노에 DT 값을 주어 추가적인 계산을하면 loop() 함수를 한번 실행하여 계산하는 시간이 매우 커지고, 최악의 경우 드론 추락의 원인으로 자리잡기도한다. 그렇기게 안정적인 DT 를 잡아주는 것이 좋다.

먼저 빠르고 간편하게 PID 세팅을 하기위해서 P.I.D 게인 값을 동일하게 설정한다.

Drive, Debug 모드를 사용하여 시동 및 디버그 (기능 테스트 및 시리얼 통신 등) 변수를 추가한다.

드론 시동에 대한 로직을 제작했으니 그에 맞게 시동 조건과 디버그 등의 기능을 제작한다.

 

드론 비행시 P, D 제어의 경우 현재 상태를 측정하여 오차를 반영해 제어한다. 하지만 I 제어의 경우 오차를 누적하여 보정하기 위한 제어값으로 제어 값에 제한을 주지 않으면 드론이 불안정하게 비행하거나 예상치 못한 동작을 보일 수 있다. 따라서 모든 I 제어 값에 제한을 준다.

 

비슷한 이유로 최종 제어 값 역시 제한을 주어 비행하는 동안 갑작스러운 움직임 등을 예방할 수 있다.

 

이제 기체를 비행하기 위해서 P.I.D 제어 게인값을 세팅할 것이다.

게인 값을 찾기위해 목적을 정하여 순서를 정한다.

드론은 각도 제어만으로는 갑작스러운 외란이나 바람 등에 의해 추락할 수 있어 각가속도의 게인값을 먼저 찾는 것이 바람직하다.

 

게인값을 찾는 순서는 다음과 같이 추천한다.

 

[ 각가속도 P -> 각도 P -> 각가속도 D -> 작은 외란을 주어 시소테스트 -> 각도 I -> 각가속도 I ]

 

각가속도 P 게인 값을 먼저 세팅하는 이유는 기체가 기울어진 방향의 반대 방향으로 피드백 제어하기 때문에 현 상태를 유지하려는 기본적인 제어 세팅을 할 수가 있다. 즉, 현재 각도를 유지하려고 하기 때문에 각도 P 제어를 하기 전 대략적인 세팅을 통해 각도 제어를 원활하게 할 수 있다.

 

각가속도 P 게인값으로 기체가 현 상태를 유지하려고하면 각도 P 제어를 통해 기체가 목표각도에 수렴할 수 있도록 제어값을 추가한다. 이후 수렴하는 시간 및 불안정성을 제거하기 위해 각가속도 D 제어를 통해 안정적인 제어를 할 수 있다.

 

시소 테스트는 드론을 한 축을 기준으로 고정하여 1축, 2축, 3축... 등으로 늘려나가며 테스트하는 방법이다.

나는 시소 테스트 이전에 직접 비행을 하며 게인 값을 튜닝했다. 물론 직접 비행을 통해 튜닝을해도 되지만 안전사고에 있어서 더 위험하기 때문에 조심해야한다.

 

위는 대략적인 게인 값을 찾은 것으로 세부적인 세팅값을 맞추면 호버링 및 기타 제어에 더욱 훌륭한 비행을 보여줄 것이다.

야외촬영
1축 PID 튜닝

위 게인값으로 비행한 결과로 전반적으로 세밀한 수정이 필요하지만 기본적인 비행에는 큰 지장이 없다.

 

다음 목표는 드론으로 플립 등의 묘기 동작을 수행하는 것이다.

현재 코드는 소수점 계산이 많아 아두이노 나노로 더 이상의 계산을 요구하기에는 드론 제어에 적합하지 않다.

따라서 다음 포스팅에서는 최적화를 위한 코드 수정이 있을 예정이다.

 

ZMR250.zip
0.00MB