쿼드콥터 제작기 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만원 돌파!   고쓰리라 여기 매달려 살수는 없지만 틈틈히 하면 여름전엔 띄울수 있을거라는건 내 기대뿐이고 얼마나 더 걸릴지는 모른다. 언젠간 날리겠지뭐



쿼드콥터 제작 근황

Posted by dw0rdptr
2015. 12. 17. 02:41 IoT/QuadCopter

기말고사기간이라 포스팅이 요근래 없었는데, 앞으로 PID조정과 자잘한 보완빼곤 많이 남진 않았지만 이제 고3이라 입시준비도 있고 이런저런일들이 많아 이전처럼 개발속도가 나오지 않을것같다. 올해 안으로 끝내겠다는 자신감은 어디가고...ㅋㅋㅋ


일단 무선모듈이 나가버렸다.. 안드로이드 usb시리얼모듈사용도 사실상 어려움이많아 개발방향을 바꾸기로 결정.

송수신기(조종기)를 구매해 컨트롤하고 조종기위에 핸드폰을 부착할수 있게 만들어 라즈베리-블루투스통신으로 영상송신을 하는방향으로 진행하려 한다.

후에 여건이 되면 안드로이드 프로그래밍을 제대로 배워 다시 시도해야겠다


아무튼 얼마전 첫 비행테스트를 했는데, 한쪽으로 기울어져 자세제어를 전혀 하지못해 프롭을 날려기도 했다

원인은 아마 너무낮은 모터출력에서 PID튜닝을 해서 그런것같다. 무게중심도 균형있게 설계가 필요할듯!


쿼드콥터 제작기 09 - LPF(Low Pass Filter)구현

Posted by dw0rdptr
2015. 10. 15. 00:52 IoT/QuadCopter

저번글[동]에서 시소테스트를 하는데 모터출력이 튀는 원인인 센서진동을 잡기위해 LPF를 구현하려고 한다


LPF(Low Pass Filter)

저역통과필터라고도 하며, 특정값 이하의 저주파는 통과시키고 그이상 고주파를 걸러내는 필터이다.

다.


MPU6050의 DLPF_BW LPF다.

http://hs36.tistory.com/search/lpf


D제어에만 저역통과필터링을 하는 이유는...

센서값 진동은 D뿐만 아니라 P나 I제어에도 영향을 주지만, 순간적인 값변화에 영향을 제일 많이 받는 D제어에만 저역통과필터를 구현해도

안정화 될 것이고 쿼드제어의 생명이 응답속도인데 저역통과필터를 거치면 딜레이가 생기기도 해서.. ㅠㅠ

아무튼, PID튜닝도 어느정도 됐고 이문제만 해결하면 드디어 첫비행 테스트를 할 수 있다!




 출처 - http://pinkwink.kr/437

 코드로 변환하면


val = (tau*pre_val + ts*x)/(tau + ts);

예상외로 간단하다. 여기서 val은 저역통과필터의 결과이고 pre_val은 이전결과값, x가 입력값, ts는 샘플링주파수이다.  

tau는 시정수라고하는데 이값이 크면 클수록 데이터가 깔끔하게 나오지만 그만큼 지연시간이 길어진다.


-

프 - 수(tau) 0.001

한눈에 봐도 노이즈가 많이 줄었긴 하지만 시정수를 좀 더 크게 줘야 할 것 같다.


노란색 그래프 - 시정수(tau) 0.001
녹색 그래프 - 시정수(tau) 0.01

 이정도면 괜찮겠지..? 약간의 지연이 있지만 진동하는것보다야 훨씬 나을 것 같다.