쿼드콥터 제작기 10 - 쿼드콥터 프로젝트 reboot

Posted by dw0rdptr
2016. 1. 25. 04:13 IoT/QuadCopter


이전까진 제대로된 정보가 별로 없었지만(구글링을 못해서...) 여러 블로그를 참조해가면서 앞으로 바꿔야할점이나 계획을 정리해보았다.



이중PID제어 구현

쿼드콥터는 기존 PID제어기로 제어하기에는 다소 불안정하다고 한다. 그래서 각도로 계산한 에러에 따로 P게인을 적용한 후 현재각속도와의 차이를 에러값으로

PID알고리즘을 적용하는 이중 PID를 쓴다고 한다. 아래는 소스코드

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TargetAngle //목표각도
CurrentAngle //현재각도
CurrentRate //현재각속도
 
AngleError = TargetAngle - CurrentAngle; //각도에러 = 목표각도 - 현재각도
 
RateError = (AngleError*stabilizePgain) - currentRate; // 각속도에러 = (각도에러*Pgain) - 현재각속도
 
 
= RateError*Pgain;
+= (RateError*dt)*Igain;
= ((RateError - LastRateError)/dt)*Dgain;
 
 
PID = P+I+D;
cs

http://red-black.tistory.com/entry/멀티콥터-9-이중-PID-컨트롤


MPU-6050의 DMP 사용

MPU-6050은 센서내부에서 가속도센서와 자이로센서로 각도를 구해주는 필터가 있다고 한다.

아마 하드웨어적으로 처리하는거니까 상보나 칼만필터보다 진동에도 강할거고

무엇보다 아두이노의 처리량을 줄일 수 있다는게 가장 좋은 점 같다. 구한 예제소스가 길지만 대부분 초기설정값이라 분석하는데

오래걸리진 않을 것 같다.


2016.3.20 수정

DMP예제를 쓸경우 센서에서 처리한 값을 기다리는 시간이 생겨 제어주기를 100hz이상 올릴 수 없다고 합니다. 상보필터를 쓰고 우노의 경우 하드웨어적으로 방진처리를 하는 대안으로 진행중입니다.


ESC출력으로 Servo 라이브러리 사용

처음 쿼드콥터를 제어하기 위해선 400HZ는 되어야 가능하기 때문에 라이브러리가 기본 50HZ로 설정이 되어있는 Servo 라이브러리 대신 analogWrite()

로 진행했지만 analogWirte()가 0~255범위로 제어할 수 있는 반면에 servo의 writeMicroseconds() 함수는 600~2400까지 있어 훨씬 세밀하게 제어가

가능한데다가 servo.h 헤더파일을 수정해 주파수를 끌어올릴 수 있는 방법을 찾아 Servo라이브러를 이용해 ESC에 출력을 전달할 생각이다.

http://forum.arduino.cc/index.php?topic=115545.0

REFRESH_INTERVAL과 MAX_SERVOS 값을 바꿔 쿼드콥터를 안정적으로 제어할 수 있는 주파수까지 끌어올릴 수 있다.



보드와 송&수신기 교체

우선 돈이 없어 Rpino보드를 사진 못하고.. 우노 호환보드를 구해 진행하려고 한다.

어차피 라즈베리파이로 연동하는건 전원공급용이고 라즈베리파이로 구현하려는 카메라기능도 독립적인 기능이기 때문에 굳이 RPino보드가 아니어도 되긴 하는지라..


그리고 기존 무선모듈이 고장나서 눈물을 머금고 조종기&리시버 세트 구매...

hobbyking HK-T6A V2 6ch 조종기&리시버, 10x4.5 프롭, 아두이노 우노 호환보드


60만원 돌파!   고쓰리라 여기 매달려 살수는 없지만 틈틈히 하면 여름전엔 띄울수 있을거라는건 내 기대뿐이고 얼마나 더 걸릴지는 모른다. 언젠간 날리겠지뭐