Quadrotor20132013. 11. 4. 17:09

9개월간의 대장정이 끝났습니다~


맨 처음에 쿼드를 만들겠다고 하나 둘씩 알아보던게 엊그제같은데.. 시간이 벌써 이렇게 지났네요 ㅋ


생각해보면 기획 당시에는 너무 막연했던거 같아요 센서 융합만 되면 쿼드 제어는 식은죽 먹기라고 생각했거든요


한번 지난 9개월간 어떤 과정이 있었는지 정리해 볼겸 나열해 보겠습니다.


처음에.. 아두이노로 만들겠다고 생각을 했죠 그런데 요요보드가 눈에 띄어서 요요보드를 구매했습니다. 그리고 디바이스마트(개인적으로 매우 싫어합니다,, 이것들이 배송이면 배송 사후관리면 관리 제대로 할줄 아는게 없어요)에서 쿼드 프레임과 모터 세트를 샀죠. 


그당시에는 모터가 BLDC모터라는것도 모르고 변속기가 필요하다는것도 몰랐습니다. 모터가 도착해보니 선이 세개? 이건 뭐지? 하면서 알아보니 BLDC모터더라구요. 그리고 변속기가 필요하다는것도 그 후에 알았습니다. 그래서 변속기를 주문 하고 그 사이에 센서를 테스트 했습니다.


센서는 연구실에 돌아다니는 아날로그 가속도센서 달랑 하나만 가지고 테스트 했죠. 기울이니까 값이 달라지길래 와~ 이거면 충분하겠는데? 이랬습니다 ㅋㅋ 많이 기울이면 값이 많이 바뀌니까 그만큼 모터 속도만 증가시켜주면 되겠지~ 라고 생각했어요. 처음 접하시는분들이 대부분 이럴겁니다.


그런데 가속도센서를 좀 더 조사하다가 병진운동에 취약한 사실을 알게됬습니다. 센서를 기울였을때 하고 옆으로 이동시켰을때 값이 같다는걸 발견하고 이거 하나로는 안되겠다 싶더라구요 그래서 연구실선배한테 물어봤는데 칼만필터를 이용해서 가속도 자이로센서를 융합하면 그런걸 커버할 수 있다고 하더라구요. 그래서 책보고 칼만필터를 공부하고 구현했습니다.


여기까지 형상은 가속도자이로센서-요요보드-갤럭시s3 이렇게 이어져 있고 칼만필터나 PWM출력 조정 모두 폰에서 이루어 지고 있었습니다. 요요보드하고 센서 입출력 하기위해 TWI통신(I2C)구현하는것도 뼈빠지게 힘들었고 ㅠ 요요보드하고 폰하고 연결하는 어플 개발하는것도 고생했습니다.. 보드가 비주류다 보니까 인터넷에 공개된것도 별로 없고 있다고 해도 죄다 영어라 힘들더라구요 ㅠㅠ 그렇게 구축해놨는데 요요보드가 두번 고장나서 포기하고 아두이노로 갈아 탔습니다.


아두이노는 MPU6050과 연결은 쉬웠지만 휴대폰하고 연결하는게 매우 고생스러웠슴다.. 아두이노측에서는 시리얼통신만 하면 돼서 쉬운데 안드로이드측에서 보내고 받기 힘들어요. 그렇게 궁리를 하다가 usbOTG라는 젠더를 알게 돼서 구매 후 구글링을 통해 아두이노와 안드로이드간의 통신을 구현했습니다. 근데 baudrate가 9600밖에 안되더라구요.. 이때까지만 해도 모든 연산이 안드로이드폰에서 수행됬기 때문에 느린 속도는 큰 문제였습니다. 센서와 아두이노 사이의 통신, 아두이노에서 폰으로 센서 데이터 보내고 폰에서 이걸 연산한 다음 다시 보드로 pwm수치를 보내고 보드는 그걸 가지고 pwm출력을 하고.. 지금 생각해보면 진짜 번거롭고 쓸데없는데 시간을 낭비했네요 ㅠ 그 당시에 교수님이 연산을 보드에서 수행하라고 말한 이유가 있었어요.. 


그래서 연산과정을 보드로 옮기기 시작했습니다. 이 때 센서도 바꿨네요. mpu6050에서 mysen-L센서로 바꿨습니다. mysen-L은 내부에서 roll, pitch, yaw값을 계산한 후 시리얼 통신으로 결과값만 넘겨줍니다. 센서 융합을 해주는 셈이죠. 그리고 샘플링타임도 100Hz였구요. 이게 충분히 빠른건줄 알았습니다.ㅠ 바꾼 센서의 값을 통해 쿼드 날개의 속도를 조절해주는 제어를 해봤습니다. 지금 보면 P제어만 수행한거네요.ㅋ 제어가 잘 안되죠 당연히.. 그래서 쿼드 제어를 조사하기 시작했습니다. 네이버의 쿼드콥터 자작카페를 많이 참고 했네요. 그리고 교수님이 말씀하신 논문도 찾아보고 해석하고 공부하다보니 PID제어가 필요하다는걸 알게 되었습니다. PID제어기를 아두이노에 구현하고 1축 지그(시소놀이)를 만들어서 계속 테스트했습니다. 센서 노이즈와 싸우기도 하고 제어 주기를 줄여도보고 늘려도 보고 진동에 따른 오차를 잡기위해 밤낮없이 고생했던 기억이 있네요. mySen-L센서 자체가 진동에 민감하게 설계되었고 최대 샘플링타임이 100Hz라 진동을 잡기위해 LPF나 이동평균필터를 쓰자니 반응이 너무 느리고, 반응을 빠르게하기위해 필터를 안쓰자니 진동때문에 D제어가 너무 불안정하고.. 이걸 조절하기위해 진짜 엄청난 시간과 노력을 쏟아부었네요 ㅠ 전 100Hz면 충분히 뜰거같았어요 근데 쿼드콥터 자작 카페 글을 읽다보니까 300Hz는 되어야 제어가 된다 라고 하더라구요.. 근처에 이런걸 해본사람이 한마디 해줬으면 훨씬 수월했을텐데.. ㅠ 센서의 한계가 100Hz니까 이 센서 말고 다시 MPU6050으로 돌아왔습니다. 이거는 1000Hz가 넘더라구요. 이제 가속도 자이로 센서를 융합해서 roll, pitch, yaw를 구해야 하는데,


아두이노로 칼만필터를 옮겨봤지만 돌아가질 않아서(이유는 불명.. 부동소수점연산이나 행렬연산이 잘 안됐었는지.. 형변환이 잘 안됐었는지 모르겠네요) 다른 융합방법을 알아보다가 상보필터라는걸 알았습니다. 그리고 그걸 공부하고 구현한 다음 필터를 쿼드에 맞게 설계및 조정했습니다. 이것 또한 PID게인값을 조절하는거라서 많은 테스트 후에 쿼드만을 위한 상보필터를 구현했죠. 기울어진 정도는 시간지연 없이 바로 나오고 모터 진동의 영향도 거의 안받게 설계 했습니다. 그리고 이 값을 이용해서 PID로 자세제어를 하니 뜨긴 뜨더라구요. 그리고 지자기계를 이용해서 yaw축을 제어하려고 했는데, 왜인지 너무 불안정하더라구요.. 자꾸 틀어지고 특히 0에서 360도로 넘어가는 그 순간이 불안하기도 했구요. 그리고 알아보니 주변 환경에 매우 민감하다고 하더라구요.. 그래서 과감히 지자기계를 버리고 자이로센서값을 누적해서 yaw제어를 하니까 아주 잘됐습니다. 오차가 쌓이긴 하겠지만 생각보다 거의 없더라구요. 모터가 안돌아가는 상황보다 돌아갈때 자이로 적분 오차가 덜 누적되는 경향이 있었습니다.


그리고 이제 무선으로 제어하기 위해 장착된 폰과 조종기 폰의 통신을 만들어야하는데, 처음엔 wifi-direct로 만드려고 했습니다. 근데 이게 나온지 얼마 되지 않은 기술이라 그런지 정보가 얼마 없더라구요.. 예제도 달랑 하나 있는데 그대로 실행시켜봐도 잘 안돌아가고.. 그래서 결국 블루투스로 구현했습니다. 무선 환경 갖추고 무게중심 맞춰주고 실내에서 띄우려고 했지만 이게 조종도 어렵고 마음대로 가지도 않고.. 


실내에서 안되는거같아서 실 외로 나가니까 그나마 좀 잘 날아서 동영상 찍고 졸작 준비를 했습니다.


조종이 잘 안됬던게 d게인값이 너무 커서 그런게 아닐까~ 하는 생각이 드네요.


그 동안 더 자잘한 문제도 많고 힘든 과정도 많았지만 대충의 맥락은 이상이네요.. ㅋ 정말 많은걸 배웠습니다. 센서로 현실 물리량을 측정해서 현실 물리량을 제어해 내니까 어려웠지만 보람도 있고 공부도 많이 되었습니다.


최초 목적은 쿼드는 기본적으로 쉽게 날게 하고 폰으로 영상처리하는게 주 목적이었지만 쿼드 제어가 주 목적이 되어버렸어요 ㅠ 좀 아쉽지만 그래도 많이 배웠고, 제가 하고싶은 공부를 했으니 후회는 없습니다 ㅋ


그리고 포기하고 싶은때도 있었지만 포기 안하고 꿋꿋하게 해 낸 제가 자랑스럽기도 하네요 ㅋ 


다음 포스팅부터 당분간은 쿼드 만들기에 필요한 기초 지식, 제가 겪은 경험을 바탕으로 한 조언을 해볼 예정입니다. 자작하시는 분들에게 도움이 됐음 좋겠네요.


Posted by 너를위한노래
Quadrotor20132013. 10. 15. 14:22

현재 쿼드콥터(윙윙이)의 커다란 맥락입니다.

지금은 안드로이드와 연결을 위해 아두이노 MEGA ADK를 사용하려고 준비중입니다.


밑은 아두이노 내부에서 센서 융합하는 맥락입니다.


크게 이렇게 동작시키고 있습니다ㅋ  현재 진행하시는 분들에게 도움이 됐으면 좋겠네요


프로젝트가 끝나고 처음부터 자세히 설명 할 계획입니다~



-------------------------------------------------------- 2013.10.18 추가 ----------------------------




Posted by 너를위한노래
Quadrotor20132013. 10. 11. 15:30

아두이노에서 게인 값 조절하고 모터틀고 돌리고 출력 데이터 그래프로 그려보는 작업의 반복입니다.. 게인 조절이라는게 사람하나 죽이네요 ㅠ

하다가 손으로 테스트하는건 정확하지 않은거같아서 아예 센서 Raw Data만 뽑아놓고 매트랩으로 구현해서 게인값만 조절해서 테스트하고 있습니다. 같은 데이터를 가지고 게인값만 다르게해서 게인값을 정한 후 윙윙이에 적용시키려구요.. 지금 생각해보니 이게 맞는거 같네요


반복 해보니까 P게인 값을 올리면 하이패스필터가 많이 반영되고 I게인을 올리면 로우패스필터를 많이 반영하는 느낌입니다.


이전 포스팅에서 제가 상보필터는 오차가 누적되서 발산하는 자이로센서값을 가속도센서값에 얼마나 빠르게 근접시키냐에 성능이 달라진다고 했는데요, 맞는 말이지만 제가 사용하는 환경(쿼드콥터)에는 좀 더 다른 접근법이 필요한 것 같습니다.


모터가 작동하면 가속도센서에서 감지되는 진동이 심하니까 P게인을 높혀서 가속도센서를 빠르게 따라가봤자 진동값을 따라가게 되더라구요


그리고 P게인을 낮추면 진동을 덜 따라가지만 실제 기울어진 각도와 차이가 나게 되구요.


그러다 든 생각이 어차피 실제 기울어진 각도가 숫자로 필요한게 아니라 많이 기울어졌냐, 적게기울어졌냐가 필요한거였으니까 P게인을 낮추는게 좋겠다는 생각이 들더라구요.


그리고 최대한 낮추되 발산하지만 않게 하면 노이즈도 줄고 발산도 안하니까 쿼드콥터에 딱 맞지 않겠느냐는 생각입니다.




노란색 : 가속도센서값, 파란색 : 자이로센서값, 빨간색 : 낮은P, 초록색 : 높은P


모터를 작동시킨 상태에서 세번 흔들고 끈 상태에서 한번 흔들었습니다. 실제 쿼드가 30도 이상 기울어지는 경우는 거의 없을테지만 필터 성능 테스트를 위해 좌우 30도 이상씩 흔들어서 데이터를 뽑았습니다.


자이로 오차가 좀 극단적으로 쌓였네요.. 다른 실험에는 저렇게 쌓이진 않던데.. ㅠ


P값이 높은 초록색이 빨간색에 비해 노이즈가 좀 있긴 하지만 적분오차가 엄청 쌓일때는 빨간색에 비해 비교적 정확하네요.


이 두 가지 경우는 직접 돌려봐야 알거 같습니다.. 저렇게 적분오차가 쌓이는일이 자주 일어난다면 초록P값이 더 좋을테고 별로 안일어난다면 빨간P값이 더 좋을테니까요.. 저 그래프는 제가 손으로 많이 기울어지게 만든거라 실제 작동하는 쿼드 각도와는 다릅니다


그래서 실험을 하다가!!


끈을 묶은 책상을 옆으로 안밀어놔서 프롭 날려먹었어요... 기울어지긴 했어도 떠있는 상태에선 예전보다 많이 안정적이게 됬습니다!!!



더 주의해서 실험해야겠습니다.. ㅠ 


저 실험때 나온 데이터를 분석해보니 자이로값이 한쪽으로만 이상하게 계속 누적되더라구요 그 데이터는 한 방향으로 roll회전을 계속하고 있다는 소린데 이해가 안가네요.. 작동 전에 자이로 calibration도 했는데.. 왜그럴까요 ㅠ


조금씩 나아지고 있어서 다행이긴한데.. ㅠ 11월 1일이 작품발표회인데 그때까지 할 수 있을까요 ㅠㅠ


Posted by 너를위한노래